| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/sync/device_info/device_info_sync_bridge.h" | 5 #include "components/sync/device_info/device_info_sync_bridge.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 specifics.set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_LINUX); | 61 specifics.set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_LINUX); |
| 62 specifics.set_sync_user_agent( | 62 specifics.set_sync_user_agent( |
| 63 base::StringPrintf(kSyncUserAgentFormat, suffix)); | 63 base::StringPrintf(kSyncUserAgentFormat, suffix)); |
| 64 specifics.set_chrome_version( | 64 specifics.set_chrome_version( |
| 65 base::StringPrintf(kChromeVersionFormat, suffix)); | 65 base::StringPrintf(kChromeVersionFormat, suffix)); |
| 66 specifics.set_signin_scoped_device_id( | 66 specifics.set_signin_scoped_device_id( |
| 67 base::StringPrintf(kSigninScopedDeviceIdFormat, suffix)); | 67 base::StringPrintf(kSigninScopedDeviceIdFormat, suffix)); |
| 68 return specifics; | 68 return specifics; |
| 69 } | 69 } |
| 70 | 70 |
| 71 DeviceInfoSpecifics CreateSpecifics(int suffix, Time last_updated_timestamp) { |
| 72 DeviceInfoSpecifics specifics = CreateSpecifics(suffix); |
| 73 specifics.set_last_updated_timestamp(TimeToProtoTime(last_updated_timestamp)); |
| 74 return specifics; |
| 75 } |
| 76 |
| 71 std::unique_ptr<DeviceInfo> CreateModel(int suffix) { | 77 std::unique_ptr<DeviceInfo> CreateModel(int suffix) { |
| 72 return base::MakeUnique<DeviceInfo>( | 78 return base::MakeUnique<DeviceInfo>( |
| 73 base::StringPrintf(kGuidFormat, suffix), | 79 base::StringPrintf(kGuidFormat, suffix), |
| 74 base::StringPrintf(kClientNameFormat, suffix), | 80 base::StringPrintf(kClientNameFormat, suffix), |
| 75 base::StringPrintf(kChromeVersionFormat, suffix), | 81 base::StringPrintf(kChromeVersionFormat, suffix), |
| 76 base::StringPrintf(kSyncUserAgentFormat, suffix), kDeviceType, | 82 base::StringPrintf(kSyncUserAgentFormat, suffix), kDeviceType, |
| 77 base::StringPrintf(kSigninScopedDeviceIdFormat, suffix)); | 83 base::StringPrintf(kSigninScopedDeviceIdFormat, suffix)); |
| 78 } | 84 } |
| 79 | 85 |
| 86 ModelTypeState StateWithEncryption(const std::string& encryption_key_name) { |
| 87 ModelTypeState state; |
| 88 state.set_encryption_key_name(encryption_key_name); |
| 89 return state; |
| 90 } |
| 91 |
| 80 void VerifyResultIsSuccess(Result result) { | 92 void VerifyResultIsSuccess(Result result) { |
| 81 EXPECT_EQ(Result::SUCCESS, result); | 93 EXPECT_EQ(Result::SUCCESS, result); |
| 82 } | 94 } |
| 83 | 95 |
| 84 void VerifyEqual(const DeviceInfoSpecifics& s1, const DeviceInfoSpecifics& s2) { | 96 void VerifyEqual(const DeviceInfoSpecifics& s1, const DeviceInfoSpecifics& s2) { |
| 85 EXPECT_EQ(s1.cache_guid(), s2.cache_guid()); | 97 EXPECT_EQ(s1.cache_guid(), s2.cache_guid()); |
| 86 EXPECT_EQ(s1.client_name(), s2.client_name()); | 98 EXPECT_EQ(s1.client_name(), s2.client_name()); |
| 87 EXPECT_EQ(s1.device_type(), s2.device_type()); | 99 EXPECT_EQ(s1.device_type(), s2.device_type()); |
| 88 EXPECT_EQ(s1.sync_user_agent(), s2.sync_user_agent()); | 100 EXPECT_EQ(s1.sync_user_agent(), s2.sync_user_agent()); |
| 89 EXPECT_EQ(s1.chrome_version(), s2.chrome_version()); | 101 EXPECT_EQ(s1.chrome_version(), s2.chrome_version()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 } | 142 } |
| 131 | 143 |
| 132 std::string CacheGuidToTag(const std::string& guid) { | 144 std::string CacheGuidToTag(const std::string& guid) { |
| 133 return "DeviceInfo_" + guid; | 145 return "DeviceInfo_" + guid; |
| 134 } | 146 } |
| 135 | 147 |
| 136 // Helper method to reduce duplicated code between tests. Wraps the given | 148 // Helper method to reduce duplicated code between tests. Wraps the given |
| 137 // specifics objects in an EntityData and EntityChange of type ACTION_ADD, and | 149 // specifics objects in an EntityData and EntityChange of type ACTION_ADD, and |
| 138 // returns an EntityChangeList containing them all. Order is maintained. | 150 // returns an EntityChangeList containing them all. Order is maintained. |
| 139 EntityChangeList EntityAddList( | 151 EntityChangeList EntityAddList( |
| 140 std::vector<DeviceInfoSpecifics> specifics_list) { | 152 const std::vector<DeviceInfoSpecifics>& specifics_list) { |
| 141 EntityChangeList changes; | 153 EntityChangeList changes; |
| 142 for (const auto& specifics : specifics_list) { | 154 for (const auto& specifics : specifics_list) { |
| 143 changes.push_back(EntityChange::CreateAdd(specifics.cache_guid(), | 155 changes.push_back(EntityChange::CreateAdd(specifics.cache_guid(), |
| 144 SpecificsToEntity(specifics))); | 156 SpecificsToEntity(specifics))); |
| 145 } | 157 } |
| 146 return changes; | 158 return changes; |
| 147 } | 159 } |
| 148 | 160 |
| 161 // Similar helper to EntityAddList(...), only wraps in a EntityDataMap for a |
| 162 // merge call. Order is irrelevant, since the map sorts by key. Should not |
| 163 // contain multiple specifics with the same guid. |
| 164 EntityDataMap InlineEntityDataMap( |
| 165 const std::vector<DeviceInfoSpecifics>& specifics_list) { |
| 166 EntityDataMap map; |
| 167 for (const auto& specifics : specifics_list) { |
| 168 EXPECT_EQ(map.end(), map.find(specifics.cache_guid())); |
| 169 map[specifics.cache_guid()] = SpecificsToEntity(specifics); |
| 170 } |
| 171 return map; |
| 172 } |
| 173 |
| 149 // Instead of actually processing anything, simply accumulates all instructions | 174 // Instead of actually processing anything, simply accumulates all instructions |
| 150 // in members that can then be accessed. TODO(skym): If this ends up being | 175 // in members that can then be accessed. TODO(skym): If this ends up being |
| 151 // useful for other model type unittests it should be moved out to a shared | 176 // useful for other model type unittests it should be moved out to a shared |
| 152 // location. | 177 // location. |
| 153 class RecordingModelTypeChangeProcessor : public FakeModelTypeChangeProcessor { | 178 class RecordingModelTypeChangeProcessor : public FakeModelTypeChangeProcessor { |
| 154 public: | 179 public: |
| 155 RecordingModelTypeChangeProcessor() {} | 180 RecordingModelTypeChangeProcessor() {} |
| 156 ~RecordingModelTypeChangeProcessor() override {} | 181 ~RecordingModelTypeChangeProcessor() override {} |
| 157 | 182 |
| 158 void Put(const std::string& storage_key, | 183 void Put(const std::string& storage_key, |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 bridge_.reset(); | 298 bridge_.reset(); |
| 274 } | 299 } |
| 275 | 300 |
| 276 void RestartBridge() { | 301 void RestartBridge() { |
| 277 PumpAndShutdown(); | 302 PumpAndShutdown(); |
| 278 InitializeAndPump(); | 303 InitializeAndPump(); |
| 279 } | 304 } |
| 280 | 305 |
| 281 void ForcePulse() { bridge()->SendLocalData(); } | 306 void ForcePulse() { bridge()->SendLocalData(); } |
| 282 | 307 |
| 308 void WriteToStore(const std::vector<DeviceInfoSpecifics>& specifics_list, |
| 309 std::unique_ptr<WriteBatch> batch) { |
| 310 // The bridge only reads from the store during initialization, so if the |
| 311 // |bridge_| has already been initialized, then it may not have an effect. |
| 312 EXPECT_FALSE(bridge_); |
| 313 for (auto& specifics : specifics_list) { |
| 314 batch->WriteData(specifics.cache_guid(), specifics.SerializeAsString()); |
| 315 } |
| 316 store()->CommitWriteBatch(std::move(batch), |
| 317 base::Bind(&VerifyResultIsSuccess)); |
| 318 } |
| 319 |
| 320 void WriteToStore(const std::vector<DeviceInfoSpecifics>& specifics_list, |
| 321 ModelTypeState state) { |
| 322 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); |
| 323 batch->GetMetadataChangeList()->UpdateModelTypeState(state); |
| 324 WriteToStore(specifics_list, std::move(batch)); |
| 325 } |
| 326 |
| 327 void WriteToStore(const std::vector<DeviceInfoSpecifics>& specifics_list) { |
| 328 WriteToStore(specifics_list, store()->CreateWriteBatch()); |
| 329 } |
| 330 |
| 283 private: | 331 private: |
| 284 int change_count_ = 0; | 332 int change_count_ = 0; |
| 285 | 333 |
| 286 // In memory model type store needs a MessageLoop. | 334 // In memory model type store needs a MessageLoop. |
| 287 base::MessageLoop message_loop_; | 335 base::MessageLoop message_loop_; |
| 288 | 336 |
| 289 // Holds the store while the bridge is not initialized. | 337 // Holds the store while the bridge is not initialized. |
| 290 std::unique_ptr<ModelTypeStore> store_; | 338 std::unique_ptr<ModelTypeStore> store_; |
| 291 | 339 |
| 292 // Provides information about the local device. Is initialized in each case's | 340 // Provides information about the local device. Is initialized in each case's |
| 293 // constructor with a model object created from |kDefaultLocalSuffix|. | 341 // constructor with a model object created from |kDefaultLocalSuffix|. |
| 294 std::unique_ptr<LocalDeviceInfoProviderMock> provider_; | 342 std::unique_ptr<LocalDeviceInfoProviderMock> provider_; |
| 295 | 343 |
| 296 // Not initialized immediately (upon test's constructor). This allows each | 344 // Not initialized immediately (upon test's constructor). This allows each |
| 297 // test case to modify the dependencies the bridge will be constructed with. | 345 // test case to modify the dependencies the bridge will be constructed with. |
| 298 std::unique_ptr<DeviceInfoSyncBridge> bridge_; | 346 std::unique_ptr<DeviceInfoSyncBridge> bridge_; |
| 299 | 347 |
| 300 // A non-owning pointer to the processor given to the bridge. Will be null | 348 // A non-owning pointer to the processor given to the bridge. Will be null |
| 301 // before being given to the bridge, to make ownership easier. | 349 // before being given to the bridge, to make ownership easier. |
| 302 RecordingModelTypeChangeProcessor* processor_ = nullptr; | 350 RecordingModelTypeChangeProcessor* processor_ = nullptr; |
| 303 }; | 351 }; |
| 304 | 352 |
| 305 namespace { | 353 namespace { |
| 306 | 354 |
| 307 TEST_F(DeviceInfoSyncBridgeTest, EmptyDataReconciliation) { | 355 TEST_F(DeviceInfoSyncBridgeTest, EmptyDataReconciliation) { |
| 308 InitializeAndPump(); | 356 InitializeAndPump(); |
| 309 DeviceInfoList devices = bridge()->GetAllDeviceInfo(); | 357 const DeviceInfoList devices = bridge()->GetAllDeviceInfo(); |
| 310 ASSERT_EQ(1u, devices.size()); | 358 ASSERT_EQ(1u, devices.size()); |
| 311 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); | 359 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 312 } | 360 } |
| 313 | 361 |
| 314 TEST_F(DeviceInfoSyncBridgeTest, EmptyDataReconciliationSlowLoad) { | 362 TEST_F(DeviceInfoSyncBridgeTest, EmptyDataReconciliationSlowLoad) { |
| 315 InitializeBridge(); | 363 InitializeBridge(); |
| 316 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); | 364 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); |
| 317 base::RunLoop().RunUntilIdle(); | 365 base::RunLoop().RunUntilIdle(); |
| 318 DeviceInfoList devices = bridge()->GetAllDeviceInfo(); | 366 const DeviceInfoList devices = bridge()->GetAllDeviceInfo(); |
| 319 ASSERT_EQ(1u, devices.size()); | 367 ASSERT_EQ(1u, devices.size()); |
| 320 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); | 368 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 321 } | 369 } |
| 322 | 370 |
| 323 TEST_F(DeviceInfoSyncBridgeTest, LocalProviderSubscription) { | 371 TEST_F(DeviceInfoSyncBridgeTest, LocalProviderSubscription) { |
| 324 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); | 372 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); |
| 325 InitializeAndPump(); | 373 InitializeAndPump(); |
| 326 | 374 |
| 327 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); | 375 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); |
| 328 local_device()->Initialize(CreateModel(1)); | 376 local_device()->Initialize(CreateModel(1)); |
| 329 base::RunLoop().RunUntilIdle(); | 377 base::RunLoop().RunUntilIdle(); |
| 330 | 378 |
| 331 DeviceInfoList devices = bridge()->GetAllDeviceInfo(); | 379 const DeviceInfoList devices = bridge()->GetAllDeviceInfo(); |
| 332 ASSERT_EQ(1u, devices.size()); | 380 ASSERT_EQ(1u, devices.size()); |
| 333 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); | 381 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 334 } | 382 } |
| 335 | 383 |
| 336 // Metadata shouldn't be loaded before the provider is initialized. | 384 // Metadata shouldn't be loaded before the provider is initialized. |
| 337 TEST_F(DeviceInfoSyncBridgeTest, LocalProviderInitRace) { | 385 TEST_F(DeviceInfoSyncBridgeTest, LocalProviderInitRace) { |
| 338 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); | 386 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); |
| 339 InitializeAndPump(); | 387 InitializeAndPump(); |
| 340 EXPECT_FALSE(processor()->metadata()); | 388 EXPECT_FALSE(processor()->metadata()); |
| 341 | 389 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 363 TEST_F(DeviceInfoSyncBridgeTest, GetClientTagEmpty) { | 411 TEST_F(DeviceInfoSyncBridgeTest, GetClientTagEmpty) { |
| 364 InitializeBridge(); | 412 InitializeBridge(); |
| 365 EntitySpecifics entity_specifics; | 413 EntitySpecifics entity_specifics; |
| 366 entity_specifics.mutable_device_info(); | 414 entity_specifics.mutable_device_info(); |
| 367 EntityData entity_data; | 415 EntityData entity_data; |
| 368 entity_data.specifics = entity_specifics; | 416 entity_data.specifics = entity_specifics; |
| 369 EXPECT_EQ(CacheGuidToTag(""), bridge()->GetClientTag(entity_data)); | 417 EXPECT_EQ(CacheGuidToTag(""), bridge()->GetClientTag(entity_data)); |
| 370 } | 418 } |
| 371 | 419 |
| 372 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalData) { | 420 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalData) { |
| 373 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 421 const DeviceInfoSpecifics specifics = CreateSpecifics(1); |
| 374 DeviceInfoSpecifics specifics = CreateSpecifics(1); | 422 WriteToStore({specifics}); |
| 375 batch->WriteData(specifics.cache_guid(), specifics.SerializeAsString()); | |
| 376 store()->CommitWriteBatch(std::move(batch), | |
| 377 base::Bind(&VerifyResultIsSuccess)); | |
| 378 | |
| 379 InitializeAndPump(); | 423 InitializeAndPump(); |
| 380 | 424 |
| 381 ASSERT_EQ(2u, bridge()->GetAllDeviceInfo().size()); | 425 ASSERT_EQ(2u, bridge()->GetAllDeviceInfo().size()); |
| 382 VerifyEqual(specifics, | 426 VerifyEqual(specifics, |
| 383 *bridge()->GetDeviceInfo(specifics.cache_guid()).get()); | 427 *bridge()->GetDeviceInfo(specifics.cache_guid()).get()); |
| 384 } | 428 } |
| 385 | 429 |
| 386 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalMetadata) { | 430 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalMetadata) { |
| 387 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 431 WriteToStore(std::vector<DeviceInfoSpecifics>(), StateWithEncryption("ekn")); |
| 388 ModelTypeState state; | |
| 389 state.set_encryption_key_name("ekn"); | |
| 390 batch->GetMetadataChangeList()->UpdateModelTypeState(state); | |
| 391 store()->CommitWriteBatch(std::move(batch), | |
| 392 base::Bind(&VerifyResultIsSuccess)); | |
| 393 InitializeAndPump(); | 432 InitializeAndPump(); |
| 394 DeviceInfoList devices = bridge()->GetAllDeviceInfo(); | 433 |
| 434 const DeviceInfoList devices = bridge()->GetAllDeviceInfo(); |
| 395 ASSERT_EQ(1u, devices.size()); | 435 ASSERT_EQ(1u, devices.size()); |
| 396 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); | 436 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 397 EXPECT_EQ(1u, processor()->put_multimap().size()); | 437 EXPECT_EQ(1u, processor()->put_multimap().size()); |
| 398 } | 438 } |
| 399 | 439 |
| 400 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalDataAndMetadata) { | 440 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalDataAndMetadata) { |
| 401 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 441 const DeviceInfoSpecifics specifics = CreateSpecifics(1); |
| 402 DeviceInfoSpecifics specifics = CreateSpecifics(1); | 442 ModelTypeState state = StateWithEncryption("ekn"); |
| 403 batch->WriteData(specifics.cache_guid(), specifics.SerializeAsString()); | 443 WriteToStore({specifics}, state); |
| 404 ModelTypeState state; | |
| 405 state.set_encryption_key_name("ekn"); | |
| 406 batch->GetMetadataChangeList()->UpdateModelTypeState(state); | |
| 407 store()->CommitWriteBatch(std::move(batch), | |
| 408 base::Bind(&VerifyResultIsSuccess)); | |
| 409 | |
| 410 InitializeAndPump(); | 444 InitializeAndPump(); |
| 411 | 445 |
| 412 ASSERT_EQ(2u, bridge()->GetAllDeviceInfo().size()); | 446 ASSERT_EQ(2u, bridge()->GetAllDeviceInfo().size()); |
| 413 VerifyEqual(specifics, | 447 VerifyEqual(specifics, |
| 414 *bridge()->GetDeviceInfo(specifics.cache_guid()).get()); | 448 *bridge()->GetDeviceInfo(specifics.cache_guid()).get()); |
| 415 EXPECT_TRUE(processor()->metadata()); | 449 EXPECT_TRUE(processor()->metadata()); |
| 416 EXPECT_EQ(state.encryption_key_name(), | 450 EXPECT_EQ(state.encryption_key_name(), |
| 417 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 451 processor()->metadata()->GetModelTypeState().encryption_key_name()); |
| 418 } | 452 } |
| 419 | 453 |
| 420 TEST_F(DeviceInfoSyncBridgeTest, GetData) { | 454 TEST_F(DeviceInfoSyncBridgeTest, GetData) { |
| 421 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 455 const DeviceInfoSpecifics specifics1 = CreateSpecifics(1); |
| 422 DeviceInfoSpecifics specifics1 = CreateSpecifics(1); | 456 const DeviceInfoSpecifics specifics2 = CreateSpecifics(2); |
| 423 DeviceInfoSpecifics specifics2 = CreateSpecifics(2); | 457 const DeviceInfoSpecifics specifics3 = CreateSpecifics(3); |
| 424 DeviceInfoSpecifics specifics3 = CreateSpecifics(3); | 458 WriteToStore({specifics1, specifics2, specifics3}); |
| 425 batch->WriteData(specifics1.cache_guid(), specifics1.SerializeAsString()); | |
| 426 batch->WriteData(specifics2.cache_guid(), specifics2.SerializeAsString()); | |
| 427 batch->WriteData(specifics3.cache_guid(), specifics3.SerializeAsString()); | |
| 428 store()->CommitWriteBatch(std::move(batch), | |
| 429 base::Bind(&VerifyResultIsSuccess)); | |
| 430 | |
| 431 InitializeAndPump(); | 459 InitializeAndPump(); |
| 432 | 460 |
| 433 std::map<std::string, DeviceInfoSpecifics> expected{ | 461 const std::map<std::string, DeviceInfoSpecifics> expected{ |
| 434 {specifics1.cache_guid(), specifics1}, | 462 {specifics1.cache_guid(), specifics1}, |
| 435 {specifics3.cache_guid(), specifics3}}; | 463 {specifics3.cache_guid(), specifics3}}; |
| 436 bridge()->GetData({specifics1.cache_guid(), specifics3.cache_guid()}, | 464 bridge()->GetData({specifics1.cache_guid(), specifics3.cache_guid()}, |
| 437 base::Bind(&VerifyDataBatch, expected)); | 465 base::Bind(&VerifyDataBatch, expected)); |
| 438 } | 466 } |
| 439 | 467 |
| 440 TEST_F(DeviceInfoSyncBridgeTest, GetDataMissing) { | 468 TEST_F(DeviceInfoSyncBridgeTest, GetDataMissing) { |
| 441 InitializeAndPump(); | 469 InitializeAndPump(); |
| 442 bridge()->GetData({"does_not_exist"}, | 470 bridge()->GetData({"does_not_exist"}, |
| 443 base::Bind(&VerifyDataBatch, | 471 base::Bind(&VerifyDataBatch, |
| 444 std::map<std::string, DeviceInfoSpecifics>())); | 472 std::map<std::string, DeviceInfoSpecifics>())); |
| 445 } | 473 } |
| 446 | 474 |
| 447 TEST_F(DeviceInfoSyncBridgeTest, GetAllData) { | 475 TEST_F(DeviceInfoSyncBridgeTest, GetAllData) { |
| 448 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 476 const DeviceInfoSpecifics specifics1 = CreateSpecifics(1); |
| 449 DeviceInfoSpecifics specifics1 = CreateSpecifics(1); | 477 const DeviceInfoSpecifics specifics2 = CreateSpecifics(2); |
| 450 DeviceInfoSpecifics specifics2 = CreateSpecifics(2); | 478 WriteToStore({specifics1, specifics2}); |
| 451 const std::string& guid1 = specifics1.cache_guid(); | |
| 452 const std::string& guid2 = specifics2.cache_guid(); | |
| 453 batch->WriteData(specifics1.cache_guid(), specifics1.SerializeAsString()); | |
| 454 batch->WriteData(specifics2.cache_guid(), specifics2.SerializeAsString()); | |
| 455 store()->CommitWriteBatch(std::move(batch), | |
| 456 base::Bind(&VerifyResultIsSuccess)); | |
| 457 | |
| 458 InitializeAndPump(); | 479 InitializeAndPump(); |
| 459 | 480 |
| 460 std::map<std::string, DeviceInfoSpecifics> expected{{guid1, specifics1}, | 481 const std::map<std::string, DeviceInfoSpecifics> expected{ |
| 461 {guid2, specifics2}}; | 482 {specifics1.cache_guid(), specifics1}, |
| 462 bridge()->GetData({guid1, guid2}, base::Bind(&VerifyDataBatch, expected)); | 483 {specifics2.cache_guid(), specifics2}}; |
| 484 bridge()->GetData({specifics1.cache_guid(), specifics2.cache_guid()}, |
| 485 base::Bind(&VerifyDataBatch, expected)); |
| 463 } | 486 } |
| 464 | 487 |
| 465 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesEmpty) { | 488 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesEmpty) { |
| 466 InitializeAndPump(); | 489 InitializeAndPump(); |
| 467 EXPECT_EQ(1, change_count()); | 490 EXPECT_EQ(1, change_count()); |
| 468 const SyncError error = bridge()->ApplySyncChanges( | 491 const SyncError error = bridge()->ApplySyncChanges( |
| 469 bridge()->CreateMetadataChangeList(), EntityChangeList()); | 492 bridge()->CreateMetadataChangeList(), EntityChangeList()); |
| 470 EXPECT_FALSE(error.IsSet()); | 493 EXPECT_FALSE(error.IsSet()); |
| 471 EXPECT_EQ(1, change_count()); | 494 EXPECT_EQ(1, change_count()); |
| 472 } | 495 } |
| 473 | 496 |
| 474 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesInMemory) { | 497 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesInMemory) { |
| 475 InitializeAndPump(); | 498 InitializeAndPump(); |
| 476 EXPECT_EQ(1, change_count()); | 499 EXPECT_EQ(1, change_count()); |
| 477 | 500 |
| 478 DeviceInfoSpecifics specifics = CreateSpecifics(1); | 501 const DeviceInfoSpecifics specifics = CreateSpecifics(1); |
| 479 const SyncError error_on_add = bridge()->ApplySyncChanges( | 502 const SyncError error_on_add = bridge()->ApplySyncChanges( |
| 480 bridge()->CreateMetadataChangeList(), EntityAddList({specifics})); | 503 bridge()->CreateMetadataChangeList(), EntityAddList({specifics})); |
| 481 | 504 |
| 482 EXPECT_FALSE(error_on_add.IsSet()); | 505 EXPECT_FALSE(error_on_add.IsSet()); |
| 483 std::unique_ptr<DeviceInfo> info = | 506 std::unique_ptr<DeviceInfo> info = |
| 484 bridge()->GetDeviceInfo(specifics.cache_guid()); | 507 bridge()->GetDeviceInfo(specifics.cache_guid()); |
| 485 ASSERT_TRUE(info); | 508 ASSERT_TRUE(info); |
| 486 VerifyEqual(specifics, *info.get()); | 509 VerifyEqual(specifics, *info.get()); |
| 487 EXPECT_EQ(2, change_count()); | 510 EXPECT_EQ(2, change_count()); |
| 488 | 511 |
| 489 const SyncError error_on_delete = bridge()->ApplySyncChanges( | 512 const SyncError error_on_delete = bridge()->ApplySyncChanges( |
| 490 bridge()->CreateMetadataChangeList(), | 513 bridge()->CreateMetadataChangeList(), |
| 491 {EntityChange::CreateDelete(specifics.cache_guid())}); | 514 {EntityChange::CreateDelete(specifics.cache_guid())}); |
| 492 | 515 |
| 493 EXPECT_FALSE(error_on_delete.IsSet()); | 516 EXPECT_FALSE(error_on_delete.IsSet()); |
| 494 EXPECT_FALSE(bridge()->GetDeviceInfo(specifics.cache_guid())); | 517 EXPECT_FALSE(bridge()->GetDeviceInfo(specifics.cache_guid())); |
| 495 EXPECT_EQ(3, change_count()); | 518 EXPECT_EQ(3, change_count()); |
| 496 } | 519 } |
| 497 | 520 |
| 498 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesStore) { | 521 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesStore) { |
| 499 InitializeAndPump(); | 522 InitializeAndPump(); |
| 500 EXPECT_EQ(1, change_count()); | 523 EXPECT_EQ(1, change_count()); |
| 501 | 524 |
| 502 DeviceInfoSpecifics specifics = CreateSpecifics(1); | 525 const DeviceInfoSpecifics specifics = CreateSpecifics(1); |
| 503 ModelTypeState state; | 526 ModelTypeState state = StateWithEncryption("ekn"); |
| 504 state.set_encryption_key_name("ekn"); | |
| 505 std::unique_ptr<MetadataChangeList> metadata_changes = | 527 std::unique_ptr<MetadataChangeList> metadata_changes = |
| 506 bridge()->CreateMetadataChangeList(); | 528 bridge()->CreateMetadataChangeList(); |
| 507 metadata_changes->UpdateModelTypeState(state); | 529 metadata_changes->UpdateModelTypeState(state); |
| 508 | 530 |
| 509 const SyncError error = bridge()->ApplySyncChanges( | 531 const SyncError error = bridge()->ApplySyncChanges( |
| 510 std::move(metadata_changes), EntityAddList({specifics})); | 532 std::move(metadata_changes), EntityAddList({specifics})); |
| 511 EXPECT_FALSE(error.IsSet()); | 533 EXPECT_FALSE(error.IsSet()); |
| 512 EXPECT_EQ(2, change_count()); | 534 EXPECT_EQ(2, change_count()); |
| 513 | 535 |
| 514 RestartBridge(); | 536 RestartBridge(); |
| 515 | 537 |
| 516 std::unique_ptr<DeviceInfo> info = | 538 std::unique_ptr<DeviceInfo> info = |
| 517 bridge()->GetDeviceInfo(specifics.cache_guid()); | 539 bridge()->GetDeviceInfo(specifics.cache_guid()); |
| 518 ASSERT_TRUE(info); | 540 ASSERT_TRUE(info); |
| 519 VerifyEqual(specifics, *info.get()); | 541 VerifyEqual(specifics, *info.get()); |
| 520 | 542 |
| 521 EXPECT_TRUE(processor()->metadata()); | 543 EXPECT_TRUE(processor()->metadata()); |
| 522 EXPECT_EQ(state.encryption_key_name(), | 544 EXPECT_EQ(state.encryption_key_name(), |
| 523 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 545 processor()->metadata()->GetModelTypeState().encryption_key_name()); |
| 524 } | 546 } |
| 525 | 547 |
| 526 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesWithLocalGuid) { | 548 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesWithLocalGuid) { |
| 527 InitializeAndPump(); | 549 InitializeAndPump(); |
| 528 | 550 |
| 529 // The bridge should ignore these changes using this specifics because its | 551 // The bridge should ignore these changes using this specifics because its |
| 530 // guid will match the local device. | 552 // guid will match the local device. |
| 531 DeviceInfoSpecifics specifics = CreateSpecifics(kDefaultLocalSuffix); | 553 const DeviceInfoSpecifics specifics = CreateSpecifics(kDefaultLocalSuffix); |
| 532 | 554 |
| 533 // Should have a single change from reconciliation. | 555 // Should have a single change from reconciliation. |
| 534 EXPECT_TRUE( | 556 EXPECT_TRUE( |
| 535 bridge()->GetDeviceInfo(local_device()->GetLocalDeviceInfo()->guid())); | 557 bridge()->GetDeviceInfo(local_device()->GetLocalDeviceInfo()->guid())); |
| 536 EXPECT_EQ(1, change_count()); | 558 EXPECT_EQ(1, change_count()); |
| 537 // Ensure |last_updated| is about now, plus or minus a little bit. | 559 // Ensure |last_updated| is about now, plus or minus a little bit. |
| 538 Time last_updated(ProtoTimeToTime(processor() | 560 const Time last_updated(ProtoTimeToTime(processor() |
| 539 ->put_multimap() | 561 ->put_multimap() |
| 540 .begin() | 562 .begin() |
| 541 ->second->specifics.device_info() | 563 ->second->specifics.device_info() |
| 542 .last_updated_timestamp())); | 564 .last_updated_timestamp())); |
| 543 EXPECT_LT(Time::Now() - TimeDelta::FromMinutes(1), last_updated); | 565 EXPECT_LT(Time::Now() - TimeDelta::FromMinutes(1), last_updated); |
| 544 EXPECT_GT(Time::Now() + TimeDelta::FromMinutes(1), last_updated); | 566 EXPECT_GT(Time::Now() + TimeDelta::FromMinutes(1), last_updated); |
| 545 | 567 |
| 546 const SyncError error_on_add = bridge()->ApplySyncChanges( | 568 const SyncError error_on_add = bridge()->ApplySyncChanges( |
| 547 bridge()->CreateMetadataChangeList(), EntityAddList({specifics})); | 569 bridge()->CreateMetadataChangeList(), EntityAddList({specifics})); |
| 548 EXPECT_FALSE(error_on_add.IsSet()); | 570 EXPECT_FALSE(error_on_add.IsSet()); |
| 549 EXPECT_EQ(1, change_count()); | 571 EXPECT_EQ(1, change_count()); |
| 550 | 572 |
| 551 const SyncError error_on_delete = bridge()->ApplySyncChanges( | 573 const SyncError error_on_delete = bridge()->ApplySyncChanges( |
| 552 bridge()->CreateMetadataChangeList(), | 574 bridge()->CreateMetadataChangeList(), |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 TEST_F(DeviceInfoSyncBridgeTest, MergeWithData) { | 606 TEST_F(DeviceInfoSyncBridgeTest, MergeWithData) { |
| 585 const DeviceInfoSpecifics unique_local = CreateSpecifics(1); | 607 const DeviceInfoSpecifics unique_local = CreateSpecifics(1); |
| 586 DeviceInfoSpecifics conflict_local = CreateSpecifics(2); | 608 DeviceInfoSpecifics conflict_local = CreateSpecifics(2); |
| 587 DeviceInfoSpecifics conflict_remote = CreateSpecifics(3); | 609 DeviceInfoSpecifics conflict_remote = CreateSpecifics(3); |
| 588 const DeviceInfoSpecifics unique_remote = CreateSpecifics(4); | 610 const DeviceInfoSpecifics unique_remote = CreateSpecifics(4); |
| 589 | 611 |
| 590 const std::string conflict_guid = "conflict_guid"; | 612 const std::string conflict_guid = "conflict_guid"; |
| 591 conflict_local.set_cache_guid(conflict_guid); | 613 conflict_local.set_cache_guid(conflict_guid); |
| 592 conflict_remote.set_cache_guid(conflict_guid); | 614 conflict_remote.set_cache_guid(conflict_guid); |
| 593 | 615 |
| 594 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 616 WriteToStore({unique_local, conflict_local}); |
| 595 batch->WriteData(unique_local.cache_guid(), unique_local.SerializeAsString()); | |
| 596 batch->WriteData(conflict_local.cache_guid(), | |
| 597 conflict_local.SerializeAsString()); | |
| 598 store()->CommitWriteBatch(std::move(batch), | |
| 599 base::Bind(&VerifyResultIsSuccess)); | |
| 600 | |
| 601 InitializeAndPump(); | 617 InitializeAndPump(); |
| 602 EXPECT_EQ(1, change_count()); | 618 EXPECT_EQ(1, change_count()); |
| 603 | 619 |
| 604 EntityDataMap remote_input; | 620 ModelTypeState state = StateWithEncryption("ekn"); |
| 605 remote_input[conflict_remote.cache_guid()] = | |
| 606 SpecificsToEntity(conflict_remote); | |
| 607 remote_input[unique_remote.cache_guid()] = SpecificsToEntity(unique_remote); | |
| 608 | |
| 609 ModelTypeState state; | |
| 610 state.set_encryption_key_name("ekn"); | |
| 611 std::unique_ptr<MetadataChangeList> metadata_changes = | 621 std::unique_ptr<MetadataChangeList> metadata_changes = |
| 612 bridge()->CreateMetadataChangeList(); | 622 bridge()->CreateMetadataChangeList(); |
| 613 metadata_changes->UpdateModelTypeState(state); | 623 metadata_changes->UpdateModelTypeState(state); |
| 614 | 624 |
| 615 const SyncError error = | 625 const SyncError error = bridge()->MergeSyncData( |
| 616 bridge()->MergeSyncData(std::move(metadata_changes), remote_input); | 626 std::move(metadata_changes), |
| 627 InlineEntityDataMap({conflict_remote, unique_remote})); |
| 617 EXPECT_FALSE(error.IsSet()); | 628 EXPECT_FALSE(error.IsSet()); |
| 618 EXPECT_EQ(2, change_count()); | 629 EXPECT_EQ(2, change_count()); |
| 619 | 630 |
| 620 // The remote should beat the local in conflict. | 631 // The remote should beat the local in conflict. |
| 621 EXPECT_EQ(4u, bridge()->GetAllDeviceInfo().size()); | 632 EXPECT_EQ(4u, bridge()->GetAllDeviceInfo().size()); |
| 622 VerifyEqual(unique_local, | 633 VerifyEqual(unique_local, |
| 623 *bridge()->GetDeviceInfo(unique_local.cache_guid()).get()); | 634 *bridge()->GetDeviceInfo(unique_local.cache_guid()).get()); |
| 624 VerifyEqual(unique_remote, | 635 VerifyEqual(unique_remote, |
| 625 *bridge()->GetDeviceInfo(unique_remote.cache_guid()).get()); | 636 *bridge()->GetDeviceInfo(unique_remote.cache_guid()).get()); |
| 626 VerifyEqual(conflict_remote, *bridge()->GetDeviceInfo(conflict_guid).get()); | 637 VerifyEqual(conflict_remote, *bridge()->GetDeviceInfo(conflict_guid).get()); |
| 627 | 638 |
| 628 // bridge should have told the processor about the existance of unique_local. | 639 // bridge should have told the processor about the existance of unique_local. |
| 629 EXPECT_TRUE(processor()->delete_set().empty()); | 640 EXPECT_TRUE(processor()->delete_set().empty()); |
| 630 EXPECT_EQ(3u, processor()->put_multimap().size()); | 641 EXPECT_EQ(3u, processor()->put_multimap().size()); |
| 631 EXPECT_EQ(1u, processor()->put_multimap().count(unique_local.cache_guid())); | 642 EXPECT_EQ(1u, processor()->put_multimap().count(unique_local.cache_guid())); |
| 632 const auto& it = processor()->put_multimap().find(unique_local.cache_guid()); | 643 const auto& it = processor()->put_multimap().find(unique_local.cache_guid()); |
| 633 ASSERT_NE(processor()->put_multimap().end(), it); | 644 ASSERT_NE(processor()->put_multimap().end(), it); |
| 634 VerifyEqual(unique_local, it->second->specifics.device_info()); | 645 VerifyEqual(unique_local, it->second->specifics.device_info()); |
| 635 | 646 |
| 636 RestartBridge(); | 647 RestartBridge(); |
| 637 EXPECT_EQ(state.encryption_key_name(), | 648 EXPECT_EQ(state.encryption_key_name(), |
| 638 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 649 processor()->metadata()->GetModelTypeState().encryption_key_name()); |
| 639 } | 650 } |
| 640 | 651 |
| 641 TEST_F(DeviceInfoSyncBridgeTest, MergeLocalGuid) { | 652 TEST_F(DeviceInfoSyncBridgeTest, MergeLocalGuid) { |
| 642 const DeviceInfo* provider_info = local_device()->GetLocalDeviceInfo(); | 653 // If not recent, then reconcile is going to try to send an updated version to |
| 643 auto specifics = base::MakeUnique<DeviceInfoSpecifics>(CreateSpecifics(0)); | 654 // Sync, which makes interpreting change_count() more difficult. |
| 644 specifics->set_last_updated_timestamp(TimeToProtoTime(Time::Now())); | 655 const DeviceInfoSpecifics specifics = |
| 645 const std::string guid = provider_info->guid(); | 656 CreateSpecifics(kDefaultLocalSuffix, Time::Now()); |
| 646 | 657 WriteToStore({specifics}); |
| 647 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | |
| 648 batch->WriteData(guid, specifics->SerializeAsString()); | |
| 649 store()->CommitWriteBatch(std::move(batch), | |
| 650 base::Bind(&VerifyResultIsSuccess)); | |
| 651 | |
| 652 InitializeAndPump(); | 658 InitializeAndPump(); |
| 653 | 659 |
| 654 EntityDataMap remote_input; | |
| 655 remote_input[guid] = SpecificsToEntity(*specifics); | |
| 656 | |
| 657 const SyncError error = bridge()->MergeSyncData( | 660 const SyncError error = bridge()->MergeSyncData( |
| 658 bridge()->CreateMetadataChangeList(), remote_input); | 661 bridge()->CreateMetadataChangeList(), InlineEntityDataMap({specifics})); |
| 659 EXPECT_FALSE(error.IsSet()); | 662 EXPECT_FALSE(error.IsSet()); |
| 660 EXPECT_EQ(0, change_count()); | 663 EXPECT_EQ(0, change_count()); |
| 661 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); | 664 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); |
| 662 EXPECT_TRUE(processor()->delete_set().empty()); | 665 EXPECT_TRUE(processor()->delete_set().empty()); |
| 663 EXPECT_TRUE(processor()->put_multimap().empty()); | 666 EXPECT_TRUE(processor()->put_multimap().empty()); |
| 664 } | 667 } |
| 665 | 668 |
| 666 TEST_F(DeviceInfoSyncBridgeTest, MergeLocalGuidBeforeReconcile) { | 669 TEST_F(DeviceInfoSyncBridgeTest, MergeLocalGuidBeforeReconcile) { |
| 667 InitializeBridge(); | 670 InitializeBridge(); |
| 668 const DeviceInfoSpecifics specifics = CreateSpecifics(kDefaultLocalSuffix); | |
| 669 | 671 |
| 670 // The message loop is never pumped, which means local data/metadata is never | 672 // The message loop is never pumped, which means local data/metadata is never |
| 671 // loaded, and thus reconcile is never called. The bridge should ignore this | 673 // loaded, and thus reconcile is never called. The bridge should ignore this |
| 672 // EntityData because its cache guid is the same the local device's. | 674 // EntityData because its cache guid is the same the local device's. |
| 673 const SyncError error = bridge()->MergeSyncData( | 675 const SyncError error = bridge()->MergeSyncData( |
| 674 bridge()->CreateMetadataChangeList(), | 676 bridge()->CreateMetadataChangeList(), |
| 675 {{specifics.cache_guid(), SpecificsToEntity(specifics)}}); | 677 InlineEntityDataMap({CreateSpecifics(kDefaultLocalSuffix)})); |
| 676 EXPECT_FALSE(error.IsSet()); | 678 EXPECT_FALSE(error.IsSet()); |
| 677 EXPECT_EQ(0, change_count()); | 679 EXPECT_EQ(0, change_count()); |
| 678 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); | 680 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); |
| 679 } | 681 } |
| 680 | 682 |
| 681 TEST_F(DeviceInfoSyncBridgeTest, CountActiveDevices) { | 683 TEST_F(DeviceInfoSyncBridgeTest, CountActiveDevices) { |
| 682 InitializeAndPump(); | 684 InitializeAndPump(); |
| 683 EXPECT_EQ(1, bridge()->CountActiveDevices()); | 685 EXPECT_EQ(1, bridge()->CountActiveDevices()); |
| 684 | 686 |
| 685 DeviceInfoSpecifics specifics = CreateSpecifics(0); | 687 // Regardless of the time, these following two ApplySyncChanges(...) calls |
| 686 bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), | 688 // have the same guid as the local device. |
| 687 EntityAddList({specifics})); | 689 bridge()->ApplySyncChanges( |
| 690 bridge()->CreateMetadataChangeList(), |
| 691 EntityAddList({CreateSpecifics(kDefaultLocalSuffix)})); |
| 688 EXPECT_EQ(1, bridge()->CountActiveDevices()); | 692 EXPECT_EQ(1, bridge()->CountActiveDevices()); |
| 689 | 693 |
| 690 specifics.set_last_updated_timestamp(TimeToProtoTime(Time::Now())); | 694 bridge()->ApplySyncChanges( |
| 691 bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), | 695 bridge()->CreateMetadataChangeList(), |
| 692 EntityAddList({specifics})); | 696 EntityAddList({CreateSpecifics(kDefaultLocalSuffix, Time::Now())})); |
| 693 EXPECT_EQ(1, bridge()->CountActiveDevices()); | 697 EXPECT_EQ(1, bridge()->CountActiveDevices()); |
| 694 | 698 |
| 695 specifics.set_cache_guid("non-local"); | 699 // A different guid will actually contribute to the count. |
| 696 bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), | 700 bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), |
| 697 EntityAddList({specifics})); | 701 EntityAddList({CreateSpecifics(1, Time::Now())})); |
| 698 EXPECT_EQ(2, bridge()->CountActiveDevices()); | 702 EXPECT_EQ(2, bridge()->CountActiveDevices()); |
| 699 | 703 |
| 700 // Now set time to long ago in the past, it should not be active anymore. | 704 // Now set time to long ago in the past, it should not be active anymore. |
| 701 specifics.set_last_updated_timestamp(TimeToProtoTime(Time())); | |
| 702 bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), | 705 bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), |
| 703 EntityAddList({specifics})); | 706 EntityAddList({CreateSpecifics(1)})); |
| 704 EXPECT_EQ(1, bridge()->CountActiveDevices()); | 707 EXPECT_EQ(1, bridge()->CountActiveDevices()); |
| 705 } | 708 } |
| 706 | 709 |
| 707 TEST_F(DeviceInfoSyncBridgeTest, MultipleOnProviderInitialized) { | 710 TEST_F(DeviceInfoSyncBridgeTest, MultipleOnProviderInitialized) { |
| 708 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); | 711 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); |
| 709 InitializeAndPump(); | 712 InitializeAndPump(); |
| 710 EXPECT_EQ(nullptr, processor()->metadata()); | 713 EXPECT_EQ(nullptr, processor()->metadata()); |
| 711 | 714 |
| 712 // Verify the processor was given metadata. | 715 // Verify the processor was given metadata. |
| 713 local_device()->Initialize(CreateModel(0)); | 716 local_device()->Initialize(CreateModel(0)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 737 ForcePulse(); | 740 ForcePulse(); |
| 738 EXPECT_EQ(2, change_count()); | 741 EXPECT_EQ(2, change_count()); |
| 739 EXPECT_EQ(2u, processor()->put_multimap().size()); | 742 EXPECT_EQ(2u, processor()->put_multimap().size()); |
| 740 } | 743 } |
| 741 | 744 |
| 742 TEST_F(DeviceInfoSyncBridgeTest, DisableSync) { | 745 TEST_F(DeviceInfoSyncBridgeTest, DisableSync) { |
| 743 InitializeAndPump(); | 746 InitializeAndPump(); |
| 744 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); | 747 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); |
| 745 EXPECT_EQ(1, change_count()); | 748 EXPECT_EQ(1, change_count()); |
| 746 | 749 |
| 747 DeviceInfoSpecifics specifics = CreateSpecifics(1); | 750 const DeviceInfoSpecifics specifics = CreateSpecifics(1); |
| 748 const SyncError error = bridge()->ApplySyncChanges( | 751 const SyncError error = bridge()->ApplySyncChanges( |
| 749 bridge()->CreateMetadataChangeList(), EntityAddList({specifics})); | 752 bridge()->CreateMetadataChangeList(), EntityAddList({specifics})); |
| 750 | 753 |
| 751 EXPECT_FALSE(error.IsSet()); | 754 EXPECT_FALSE(error.IsSet()); |
| 752 EXPECT_EQ(2u, bridge()->GetAllDeviceInfo().size()); | 755 EXPECT_EQ(2u, bridge()->GetAllDeviceInfo().size()); |
| 753 EXPECT_EQ(2, change_count()); | 756 EXPECT_EQ(2, change_count()); |
| 754 | 757 |
| 755 // Should clear out all local data and notify observers. | 758 // Should clear out all local data and notify observers. |
| 756 bridge()->DisableSync(); | 759 bridge()->DisableSync(); |
| 757 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); | 760 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); |
| 758 EXPECT_EQ(3, change_count()); | 761 EXPECT_EQ(3, change_count()); |
| 759 | 762 |
| 760 // Reloading from storage shouldn't contain remote data. | 763 // Reloading from storage shouldn't contain remote data. |
| 761 RestartBridge(); | 764 RestartBridge(); |
| 762 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); | 765 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); |
| 763 EXPECT_EQ(4, change_count()); | 766 EXPECT_EQ(4, change_count()); |
| 764 } | 767 } |
| 765 | 768 |
| 766 } // namespace | 769 } // namespace |
| 767 | 770 |
| 768 } // namespace syncer | 771 } // namespace syncer |
| OLD | NEW |