Chromium Code Reviews| 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_service.h" | 5 #include "components/sync/device_info/device_info_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 172 | 172 |
| 173 // Force all remaining (store) tasks to execute so we don't leak memory. | 173 // Force all remaining (store) tasks to execute so we don't leak memory. |
| 174 base::RunLoop().RunUntilIdle(); | 174 base::RunLoop().RunUntilIdle(); |
| 175 } | 175 } |
| 176 | 176 |
| 177 void OnDeviceInfoChange() override { change_count_++; } | 177 void OnDeviceInfoChange() override { change_count_++; } |
| 178 | 178 |
| 179 std::unique_ptr<ModelTypeChangeProcessor> CreateModelTypeChangeProcessor( | 179 std::unique_ptr<ModelTypeChangeProcessor> CreateModelTypeChangeProcessor( |
| 180 ModelType type, | 180 ModelType type, |
| 181 ModelTypeService* service) { | 181 ModelTypeService* service) { |
| 182 processor_ = new RecordingModelTypeChangeProcessor(); | 182 std::unique_ptr<RecordingModelTypeChangeProcessor> processor = |
|
maxbogue
2016/10/12 23:40:35
You can just do "auto processor". That's being enc
skym
2016/10/13 19:21:38
Done.
| |
| 183 return base::WrapUnique(processor_); | 183 base::MakeUnique<RecordingModelTypeChangeProcessor>(); |
| 184 processor_ = processor.get(); | |
| 185 return processor; | |
| 184 } | 186 } |
| 185 | 187 |
| 186 // Initialized the service based on the current local device and store. Can | 188 // Initialized the service based on the current local device and store. Can |
| 187 // only be called once per run, as it passes |store_|. | 189 // only be called once per run, as it passes |store_|. |
| 188 void InitializeService() { | 190 void InitializeService() { |
| 189 ASSERT_TRUE(store_); | 191 ASSERT_TRUE(store_); |
| 190 service_.reset(new DeviceInfoService( | 192 service_.reset(new DeviceInfoService( |
| 191 local_device_.get(), | 193 local_device_.get(), |
| 192 base::Bind(&ModelTypeStoreTestUtil::MoveStoreToCallback, | 194 base::Bind(&ModelTypeStoreTestUtil::MoveStoreToCallback, |
| 193 base::Passed(&store_)), | 195 base::Passed(&store_)), |
| 194 base::Bind(&DeviceInfoServiceTest::CreateModelTypeChangeProcessor, | 196 base::Bind(&DeviceInfoServiceTest::CreateModelTypeChangeProcessor, |
| 195 base::Unretained(this)))); | 197 base::Unretained(this)))); |
| 196 service_->AddObserver(this); | 198 service_->AddObserver(this); |
| 197 } | 199 } |
| 198 | 200 |
| 199 void OnSyncStarting() { | |
| 200 service()->OnSyncStarting(base::MakeUnique<DataTypeErrorHandlerMock>(), | |
| 201 StartCallback()); | |
| 202 } | |
| 203 | |
| 204 // Creates the service and runs any outstanding tasks. This will typically | 201 // Creates the service and runs any outstanding tasks. This will typically |
| 205 // cause all initialization callbacks between the sevice and store to fire. | 202 // cause all initialization callbacks between the sevice and store to fire. |
| 206 void InitializeAndPump() { | 203 void InitializeAndPump() { |
| 207 InitializeService(); | 204 InitializeService(); |
| 208 base::RunLoop().RunUntilIdle(); | 205 base::RunLoop().RunUntilIdle(); |
| 209 } | 206 } |
| 210 | 207 |
| 211 // Creates the service, runs any outstanding tasks, and then indicates to the | |
| 212 // service that sync wants to start and forces the processor to be created. | |
| 213 void InitializeAndPumpAndStart() { | |
| 214 InitializeAndPump(); | |
| 215 OnSyncStarting(); | |
| 216 ASSERT_TRUE(processor_); | |
| 217 } | |
| 218 | |
| 219 // Generates a specifics object with slightly differing values. Will generate | 208 // Generates a specifics object with slightly differing values. Will generate |
| 220 // the same values on each run of a test because a simple counter is used to | 209 // the same values on each run of a test because a simple counter is used to |
| 221 // vary field values. | 210 // vary field values. |
| 222 DeviceInfoSpecifics GenerateTestSpecifics() { | 211 DeviceInfoSpecifics GenerateTestSpecifics() { |
| 223 int label = ++generated_count_; | 212 int label = ++generated_count_; |
| 224 DeviceInfoSpecifics specifics; | 213 DeviceInfoSpecifics specifics; |
| 225 specifics.set_cache_guid(base::StringPrintf("cache guid %d", label)); | 214 specifics.set_cache_guid(base::StringPrintf("cache guid %d", label)); |
| 226 specifics.set_client_name(base::StringPrintf("client name %d", label)); | 215 specifics.set_client_name(base::StringPrintf("client name %d", label)); |
| 227 specifics.set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_LINUX); | 216 specifics.set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_LINUX); |
| 228 specifics.set_sync_user_agent( | 217 specifics.set_sync_user_agent( |
| 229 base::StringPrintf("sync user agent %d", label)); | 218 base::StringPrintf("sync user agent %d", label)); |
| 230 specifics.set_chrome_version( | 219 specifics.set_chrome_version( |
| 231 base::StringPrintf("chrome version %d", label)); | 220 base::StringPrintf("chrome version %d", label)); |
| 232 specifics.set_signin_scoped_device_id( | 221 specifics.set_signin_scoped_device_id( |
| 233 base::StringPrintf("signin scoped device id %d", label)); | 222 base::StringPrintf("signin scoped device id %d", label)); |
| 234 return specifics; | 223 return specifics; |
| 235 } | 224 } |
| 236 | 225 |
| 237 std::unique_ptr<DeviceInfoSpecifics> CopyToSpecifics(const DeviceInfo& info) { | 226 std::unique_ptr<DeviceInfoSpecifics> CopyToSpecifics(const DeviceInfo& info) { |
| 238 return DeviceInfoService::CopyToSpecifics(info); | 227 return DeviceInfoService::CopyToSpecifics(info); |
| 239 } | 228 } |
| 240 | 229 |
| 241 // Override to allow specific cache guids. | 230 // Override to allow specific cache guids. |
| 242 DeviceInfoSpecifics GenerateTestSpecifics(const std::string& guid) { | 231 DeviceInfoSpecifics GenerateTestSpecifics(const std::string& guid) { |
| 243 DeviceInfoSpecifics specifics(GenerateTestSpecifics()); | 232 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); |
| 244 specifics.set_cache_guid(guid); | 233 specifics.set_cache_guid(guid); |
| 245 return specifics; | 234 return specifics; |
| 246 } | 235 } |
| 247 | 236 |
| 248 // Allows access to the store before that will ultimately be used to | 237 // Allows access to the store before that will ultimately be used to |
| 249 // initialize the service. | 238 // initialize the service. |
| 250 ModelTypeStore* store() { | 239 ModelTypeStore* store() { |
| 251 EXPECT_TRUE(store_); | 240 EXPECT_TRUE(store_); |
| 252 return store_.get(); | 241 return store_.get(); |
| 253 } | 242 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 314 | 303 |
| 315 // A monotonically increasing label for generated specifics objects with data | 304 // A monotonically increasing label for generated specifics objects with data |
| 316 // that is slightly different from eachother. | 305 // that is slightly different from eachother. |
| 317 int generated_count_ = 0; | 306 int generated_count_ = 0; |
| 318 }; | 307 }; |
| 319 | 308 |
| 320 namespace { | 309 namespace { |
| 321 | 310 |
| 322 TEST_F(DeviceInfoServiceTest, EmptyDataReconciliation) { | 311 TEST_F(DeviceInfoServiceTest, EmptyDataReconciliation) { |
| 323 InitializeAndPump(); | 312 InitializeAndPump(); |
| 324 ASSERT_EQ(0u, service()->GetAllDeviceInfo().size()); | 313 DeviceInfoList devices = service()->GetAllDeviceInfo(); |
| 325 OnSyncStarting(); | 314 ASSERT_EQ(1u, devices.size()); |
| 326 DeviceInfoList all_device_info(service()->GetAllDeviceInfo()); | 315 ASSERT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 327 ASSERT_EQ(1u, all_device_info.size()); | |
| 328 ASSERT_TRUE( | |
| 329 local_device()->GetLocalDeviceInfo()->Equals(*all_device_info[0])); | |
| 330 } | 316 } |
| 331 | 317 |
| 332 TEST_F(DeviceInfoServiceTest, EmptyDataReconciliationSlowLoad) { | 318 TEST_F(DeviceInfoServiceTest, EmptyDataReconciliationSlowLoad) { |
| 333 InitializeService(); | 319 InitializeService(); |
| 334 OnSyncStarting(); | |
| 335 ASSERT_EQ(0u, service()->GetAllDeviceInfo().size()); | 320 ASSERT_EQ(0u, service()->GetAllDeviceInfo().size()); |
| 336 base::RunLoop().RunUntilIdle(); | 321 base::RunLoop().RunUntilIdle(); |
| 337 DeviceInfoList all_device_info(service()->GetAllDeviceInfo()); | 322 DeviceInfoList devices = service()->GetAllDeviceInfo(); |
| 338 ASSERT_EQ(1u, all_device_info.size()); | 323 ASSERT_EQ(1u, devices.size()); |
| 339 ASSERT_TRUE( | 324 ASSERT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 340 local_device()->GetLocalDeviceInfo()->Equals(*all_device_info[0])); | |
| 341 } | 325 } |
| 342 | 326 |
| 343 TEST_F(DeviceInfoServiceTest, LocalProviderSubscription) { | 327 TEST_F(DeviceInfoServiceTest, LocalProviderSubscription) { |
| 344 set_local_device(base::MakeUnique<LocalDeviceInfoProviderMock>()); | 328 set_local_device(base::MakeUnique<LocalDeviceInfoProviderMock>()); |
| 345 InitializeAndPumpAndStart(); | 329 InitializeAndPump(); |
| 346 | 330 |
| 347 ASSERT_EQ(0u, service()->GetAllDeviceInfo().size()); | 331 ASSERT_EQ(0u, service()->GetAllDeviceInfo().size()); |
| 348 local_device()->Initialize(CreateDeviceInfo()); | 332 local_device()->Initialize(CreateDeviceInfo()); |
| 349 base::RunLoop().RunUntilIdle(); | 333 base::RunLoop().RunUntilIdle(); |
| 350 | 334 |
| 351 DeviceInfoList all_device_info(service()->GetAllDeviceInfo()); | 335 DeviceInfoList devices = service()->GetAllDeviceInfo(); |
| 352 ASSERT_EQ(1u, all_device_info.size()); | 336 ASSERT_EQ(1u, devices.size()); |
| 353 ASSERT_TRUE( | 337 ASSERT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 354 local_device()->GetLocalDeviceInfo()->Equals(*all_device_info[0])); | |
| 355 } | 338 } |
| 356 | 339 |
| 357 // Metadata shouldn't be loaded before the provider is initialized. | 340 // Metadata shouldn't be loaded before the provider is initialized. |
| 358 TEST_F(DeviceInfoServiceTest, LocalProviderInitRace) { | 341 TEST_F(DeviceInfoServiceTest, LocalProviderInitRace) { |
| 359 set_local_device(base::WrapUnique(new LocalDeviceInfoProviderMock())); | 342 set_local_device(base::WrapUnique(new LocalDeviceInfoProviderMock())); |
| 360 InitializeAndPump(); | 343 InitializeAndPump(); |
| 361 OnSyncStarting(); | |
| 362 EXPECT_FALSE(processor()->metadata()); | 344 EXPECT_FALSE(processor()->metadata()); |
| 363 | 345 |
| 364 ASSERT_EQ(0u, service()->GetAllDeviceInfo().size()); | 346 ASSERT_EQ(0u, service()->GetAllDeviceInfo().size()); |
| 365 local_device()->Initialize(CreateDeviceInfo()); | 347 local_device()->Initialize(CreateDeviceInfo()); |
| 366 base::RunLoop().RunUntilIdle(); | 348 base::RunLoop().RunUntilIdle(); |
| 367 | 349 |
| 368 DeviceInfoList all_device_info(service()->GetAllDeviceInfo()); | 350 DeviceInfoList devices = service()->GetAllDeviceInfo(); |
| 369 ASSERT_EQ(1u, all_device_info.size()); | 351 ASSERT_EQ(1u, devices.size()); |
| 370 ASSERT_TRUE( | 352 ASSERT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 371 local_device()->GetLocalDeviceInfo()->Equals(*all_device_info[0])); | |
| 372 | 353 |
| 373 EXPECT_TRUE(processor()->metadata()); | 354 EXPECT_TRUE(processor()->metadata()); |
| 374 } | 355 } |
| 375 | 356 |
| 376 TEST_F(DeviceInfoServiceTest, GetClientTagNormal) { | 357 TEST_F(DeviceInfoServiceTest, GetClientTagNormal) { |
| 377 InitializeService(); | 358 InitializeService(); |
| 378 const std::string guid = "abc"; | 359 const std::string guid = "abc"; |
| 379 EntitySpecifics entity_specifics; | 360 EntitySpecifics entity_specifics; |
| 380 entity_specifics.mutable_device_info()->set_cache_guid(guid); | 361 entity_specifics.mutable_device_info()->set_cache_guid(guid); |
| 381 EntityData entity_data; | 362 EntityData entity_data; |
| 382 entity_data.specifics = entity_specifics; | 363 entity_data.specifics = entity_specifics; |
| 383 EXPECT_EQ(CacheGuidToTag(guid), service()->GetClientTag(entity_data)); | 364 EXPECT_EQ(CacheGuidToTag(guid), service()->GetClientTag(entity_data)); |
| 384 } | 365 } |
| 385 | 366 |
| 386 TEST_F(DeviceInfoServiceTest, GetClientTagEmpty) { | 367 TEST_F(DeviceInfoServiceTest, GetClientTagEmpty) { |
| 387 InitializeService(); | 368 InitializeService(); |
| 388 EntitySpecifics entity_specifics; | 369 EntitySpecifics entity_specifics; |
| 389 entity_specifics.mutable_device_info(); | 370 entity_specifics.mutable_device_info(); |
| 390 EntityData entity_data; | 371 EntityData entity_data; |
| 391 entity_data.specifics = entity_specifics; | 372 entity_data.specifics = entity_specifics; |
| 392 EXPECT_EQ(CacheGuidToTag(""), service()->GetClientTag(entity_data)); | 373 EXPECT_EQ(CacheGuidToTag(""), service()->GetClientTag(entity_data)); |
| 393 } | 374 } |
| 394 | 375 |
| 395 TEST_F(DeviceInfoServiceTest, TestWithLocalData) { | 376 TEST_F(DeviceInfoServiceTest, TestWithLocalData) { |
| 396 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 377 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); |
| 397 DeviceInfoSpecifics specifics(GenerateTestSpecifics()); | 378 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); |
| 398 store()->WriteData(batch.get(), specifics.cache_guid(), | 379 store()->WriteData(batch.get(), specifics.cache_guid(), |
| 399 specifics.SerializeAsString()); | 380 specifics.SerializeAsString()); |
| 400 store()->CommitWriteBatch(std::move(batch), | 381 store()->CommitWriteBatch(std::move(batch), |
| 401 base::Bind(&AssertResultIsSuccess)); | 382 base::Bind(&AssertResultIsSuccess)); |
| 402 | 383 |
| 403 InitializeAndPump(); | 384 InitializeAndPump(); |
| 404 | 385 |
| 405 DeviceInfoList all_device_info(service()->GetAllDeviceInfo()); | 386 ASSERT_EQ(2u, service()->GetAllDeviceInfo().size()); |
| 406 ASSERT_EQ(1u, all_device_info.size()); | |
| 407 AssertEqual(specifics, *all_device_info[0]); | |
| 408 AssertEqual(specifics, | 387 AssertEqual(specifics, |
| 409 *service()->GetDeviceInfo(specifics.cache_guid()).get()); | 388 *service()->GetDeviceInfo(specifics.cache_guid()).get()); |
| 410 } | 389 } |
| 411 | 390 |
| 412 TEST_F(DeviceInfoServiceTest, TestWithLocalMetadata) { | 391 TEST_F(DeviceInfoServiceTest, TestWithLocalMetadata) { |
| 413 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 392 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); |
| 414 ModelTypeState state; | 393 ModelTypeState state; |
| 415 state.set_encryption_key_name("ekn"); | 394 state.set_encryption_key_name("ekn"); |
| 416 store()->WriteGlobalMetadata(batch.get(), state.SerializeAsString()); | 395 store()->WriteGlobalMetadata(batch.get(), state.SerializeAsString()); |
| 417 store()->CommitWriteBatch(std::move(batch), | 396 store()->CommitWriteBatch(std::move(batch), |
| 418 base::Bind(&AssertResultIsSuccess)); | 397 base::Bind(&AssertResultIsSuccess)); |
| 419 InitializeAndPump(); | 398 InitializeAndPump(); |
| 420 DeviceInfoList all_device_info(service()->GetAllDeviceInfo()); | 399 DeviceInfoList devices = service()->GetAllDeviceInfo(); |
| 421 ASSERT_EQ(1u, all_device_info.size()); | 400 ASSERT_EQ(1u, devices.size()); |
| 422 ASSERT_TRUE( | 401 ASSERT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
| 423 local_device()->GetLocalDeviceInfo()->Equals(*all_device_info[0])); | |
| 424 EXPECT_EQ(1u, processor()->put_map().size()); | 402 EXPECT_EQ(1u, processor()->put_map().size()); |
| 425 } | 403 } |
| 426 | 404 |
| 427 TEST_F(DeviceInfoServiceTest, TestWithLocalDataAndMetadata) { | 405 TEST_F(DeviceInfoServiceTest, TestWithLocalDataAndMetadata) { |
| 428 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 406 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); |
| 429 DeviceInfoSpecifics specifics(GenerateTestSpecifics()); | 407 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); |
| 430 store()->WriteData(batch.get(), specifics.cache_guid(), | 408 store()->WriteData(batch.get(), specifics.cache_guid(), |
| 431 specifics.SerializeAsString()); | 409 specifics.SerializeAsString()); |
| 432 ModelTypeState state; | 410 ModelTypeState state; |
| 433 state.set_encryption_key_name("ekn"); | 411 state.set_encryption_key_name("ekn"); |
| 434 store()->WriteGlobalMetadata(batch.get(), state.SerializeAsString()); | 412 store()->WriteGlobalMetadata(batch.get(), state.SerializeAsString()); |
| 435 store()->CommitWriteBatch(std::move(batch), | 413 store()->CommitWriteBatch(std::move(batch), |
| 436 base::Bind(&AssertResultIsSuccess)); | 414 base::Bind(&AssertResultIsSuccess)); |
| 437 | 415 |
| 438 InitializeAndPump(); | 416 InitializeAndPump(); |
| 439 | 417 |
| 440 DeviceInfoList all_device_info(service()->GetAllDeviceInfo()); | 418 ASSERT_EQ(2u, service()->GetAllDeviceInfo().size()); |
| 441 ASSERT_EQ(2u, all_device_info.size()); | |
| 442 AssertEqual(specifics, | 419 AssertEqual(specifics, |
| 443 *service()->GetDeviceInfo(specifics.cache_guid()).get()); | 420 *service()->GetDeviceInfo(specifics.cache_guid()).get()); |
| 444 ASSERT_TRUE(processor()->metadata()); | 421 ASSERT_TRUE(processor()->metadata()); |
| 445 ASSERT_EQ(state.encryption_key_name(), | 422 ASSERT_EQ(state.encryption_key_name(), |
| 446 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 423 processor()->metadata()->GetModelTypeState().encryption_key_name()); |
| 447 } | 424 } |
| 448 | 425 |
| 449 TEST_F(DeviceInfoServiceTest, GetData) { | 426 TEST_F(DeviceInfoServiceTest, GetData) { |
| 450 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 427 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); |
| 451 DeviceInfoSpecifics specifics1(GenerateTestSpecifics()); | 428 DeviceInfoSpecifics specifics1 = GenerateTestSpecifics(); |
| 452 DeviceInfoSpecifics specifics2(GenerateTestSpecifics()); | 429 DeviceInfoSpecifics specifics2 = GenerateTestSpecifics(); |
| 453 DeviceInfoSpecifics specifics3(GenerateTestSpecifics()); | 430 DeviceInfoSpecifics specifics3 = GenerateTestSpecifics(); |
| 454 store()->WriteData(batch.get(), specifics1.cache_guid(), | 431 store()->WriteData(batch.get(), specifics1.cache_guid(), |
| 455 specifics1.SerializeAsString()); | 432 specifics1.SerializeAsString()); |
| 456 store()->WriteData(batch.get(), specifics2.cache_guid(), | 433 store()->WriteData(batch.get(), specifics2.cache_guid(), |
| 457 specifics2.SerializeAsString()); | 434 specifics2.SerializeAsString()); |
| 458 store()->WriteData(batch.get(), specifics3.cache_guid(), | 435 store()->WriteData(batch.get(), specifics3.cache_guid(), |
| 459 specifics3.SerializeAsString()); | 436 specifics3.SerializeAsString()); |
| 460 store()->CommitWriteBatch(std::move(batch), | 437 store()->CommitWriteBatch(std::move(batch), |
| 461 base::Bind(&AssertResultIsSuccess)); | 438 base::Bind(&AssertResultIsSuccess)); |
| 462 | 439 |
| 463 InitializeAndPump(); | 440 InitializeAndPump(); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 476 InitializeAndPump(); | 453 InitializeAndPump(); |
| 477 std::map<std::string, DeviceInfoSpecifics> expected; | 454 std::map<std::string, DeviceInfoSpecifics> expected; |
| 478 StorageKeyList storage_keys; | 455 StorageKeyList storage_keys; |
| 479 storage_keys.push_back("does_not_exist"); | 456 storage_keys.push_back("does_not_exist"); |
| 480 service()->GetData(storage_keys, | 457 service()->GetData(storage_keys, |
| 481 base::Bind(&AssertExpectedFromDataBatch, expected)); | 458 base::Bind(&AssertExpectedFromDataBatch, expected)); |
| 482 } | 459 } |
| 483 | 460 |
| 484 TEST_F(DeviceInfoServiceTest, GetAllData) { | 461 TEST_F(DeviceInfoServiceTest, GetAllData) { |
| 485 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 462 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); |
| 486 DeviceInfoSpecifics specifics1(GenerateTestSpecifics()); | 463 DeviceInfoSpecifics specifics1 = GenerateTestSpecifics(); |
| 487 DeviceInfoSpecifics specifics2(GenerateTestSpecifics()); | 464 DeviceInfoSpecifics specifics2 = GenerateTestSpecifics(); |
| 488 const std::string& guid1 = specifics1.cache_guid(); | 465 const std::string& guid1 = specifics1.cache_guid(); |
| 489 const std::string& guid2 = specifics2.cache_guid(); | 466 const std::string& guid2 = specifics2.cache_guid(); |
| 490 store()->WriteData(batch.get(), specifics1.cache_guid(), | 467 store()->WriteData(batch.get(), specifics1.cache_guid(), |
| 491 specifics1.SerializeAsString()); | 468 specifics1.SerializeAsString()); |
| 492 store()->WriteData(batch.get(), specifics2.cache_guid(), | 469 store()->WriteData(batch.get(), specifics2.cache_guid(), |
| 493 specifics2.SerializeAsString()); | 470 specifics2.SerializeAsString()); |
| 494 store()->CommitWriteBatch(std::move(batch), | 471 store()->CommitWriteBatch(std::move(batch), |
| 495 base::Bind(&AssertResultIsSuccess)); | 472 base::Bind(&AssertResultIsSuccess)); |
| 496 | 473 |
| 497 InitializeAndPump(); | 474 InitializeAndPump(); |
| 498 | 475 |
| 499 std::map<std::string, DeviceInfoSpecifics> expected; | 476 std::map<std::string, DeviceInfoSpecifics> expected; |
| 500 expected[guid1] = specifics1; | 477 expected[guid1] = specifics1; |
| 501 expected[guid2] = specifics2; | 478 expected[guid2] = specifics2; |
| 502 StorageKeyList storage_keys; | 479 StorageKeyList storage_keys; |
| 503 storage_keys.push_back(guid1); | 480 storage_keys.push_back(guid1); |
| 504 storage_keys.push_back(guid2); | 481 storage_keys.push_back(guid2); |
| 505 service()->GetData(storage_keys, | 482 service()->GetData(storage_keys, |
| 506 base::Bind(&AssertExpectedFromDataBatch, expected)); | 483 base::Bind(&AssertExpectedFromDataBatch, expected)); |
| 507 } | 484 } |
| 508 | 485 |
| 509 TEST_F(DeviceInfoServiceTest, ApplySyncChangesEmpty) { | 486 TEST_F(DeviceInfoServiceTest, ApplySyncChangesEmpty) { |
| 510 InitializeAndPump(); | 487 InitializeAndPump(); |
| 488 EXPECT_EQ(1, change_count()); | |
| 511 const SyncError error = service()->ApplySyncChanges( | 489 const SyncError error = service()->ApplySyncChanges( |
| 512 service()->CreateMetadataChangeList(), EntityChangeList()); | 490 service()->CreateMetadataChangeList(), EntityChangeList()); |
| 513 EXPECT_FALSE(error.IsSet()); | 491 EXPECT_FALSE(error.IsSet()); |
| 514 EXPECT_EQ(0, change_count()); | 492 EXPECT_EQ(1, change_count()); |
|
maxbogue
2016/10/12 23:40:35
I'm confused... why did this change?
skym
2016/10/13 19:21:38
So what was happening originally was that the serv
| |
| 515 } | 493 } |
| 516 | 494 |
| 517 TEST_F(DeviceInfoServiceTest, ApplySyncChangesInMemory) { | 495 TEST_F(DeviceInfoServiceTest, ApplySyncChangesInMemory) { |
| 518 InitializeAndPump(); | 496 InitializeAndPump(); |
| 497 EXPECT_EQ(1, change_count()); | |
| 519 | 498 |
| 520 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); | 499 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); |
| 521 EntityChangeList add_changes; | 500 EntityChangeList add_changes; |
| 522 PushBackEntityChangeAdd(specifics, &add_changes); | 501 PushBackEntityChangeAdd(specifics, &add_changes); |
| 523 SyncError error = service()->ApplySyncChanges( | 502 SyncError error = service()->ApplySyncChanges( |
| 524 service()->CreateMetadataChangeList(), add_changes); | 503 service()->CreateMetadataChangeList(), add_changes); |
| 525 | 504 |
| 526 EXPECT_FALSE(error.IsSet()); | 505 EXPECT_FALSE(error.IsSet()); |
| 527 std::unique_ptr<DeviceInfo> info = | 506 std::unique_ptr<DeviceInfo> info = |
| 528 service()->GetDeviceInfo(specifics.cache_guid()); | 507 service()->GetDeviceInfo(specifics.cache_guid()); |
| 529 ASSERT_TRUE(info); | 508 ASSERT_TRUE(info); |
| 530 AssertEqual(specifics, *info.get()); | 509 AssertEqual(specifics, *info.get()); |
| 531 EXPECT_EQ(1, change_count()); | 510 EXPECT_EQ(2, change_count()); |
| 532 | 511 |
| 533 EntityChangeList delete_changes; | 512 EntityChangeList delete_changes; |
| 534 delete_changes.push_back(EntityChange::CreateDelete(specifics.cache_guid())); | 513 delete_changes.push_back(EntityChange::CreateDelete(specifics.cache_guid())); |
| 535 error = service()->ApplySyncChanges(service()->CreateMetadataChangeList(), | 514 error = service()->ApplySyncChanges(service()->CreateMetadataChangeList(), |
| 536 delete_changes); | 515 delete_changes); |
| 537 | 516 |
| 538 EXPECT_FALSE(error.IsSet()); | 517 EXPECT_FALSE(error.IsSet()); |
| 539 EXPECT_FALSE(service()->GetDeviceInfo(specifics.cache_guid())); | 518 EXPECT_FALSE(service()->GetDeviceInfo(specifics.cache_guid())); |
| 540 EXPECT_EQ(2, change_count()); | 519 EXPECT_EQ(3, change_count()); |
| 541 } | 520 } |
| 542 | 521 |
| 543 TEST_F(DeviceInfoServiceTest, ApplySyncChangesStore) { | 522 TEST_F(DeviceInfoServiceTest, ApplySyncChangesStore) { |
| 544 InitializeAndPump(); | 523 InitializeAndPump(); |
| 524 EXPECT_EQ(1, change_count()); | |
| 545 | 525 |
| 546 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); | 526 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); |
| 547 EntityChangeList data_changes; | 527 EntityChangeList data_changes; |
| 548 PushBackEntityChangeAdd(specifics, &data_changes); | 528 PushBackEntityChangeAdd(specifics, &data_changes); |
| 549 ModelTypeState state; | 529 ModelTypeState state; |
| 550 state.set_encryption_key_name("ekn"); | 530 state.set_encryption_key_name("ekn"); |
| 551 std::unique_ptr<MetadataChangeList> metadata_changes( | 531 std::unique_ptr<MetadataChangeList> metadata_changes = |
| 552 service()->CreateMetadataChangeList()); | 532 service()->CreateMetadataChangeList(); |
| 553 metadata_changes->UpdateModelTypeState(state); | 533 metadata_changes->UpdateModelTypeState(state); |
| 554 | 534 |
| 555 const SyncError error = | 535 const SyncError error = |
| 556 service()->ApplySyncChanges(std::move(metadata_changes), data_changes); | 536 service()->ApplySyncChanges(std::move(metadata_changes), data_changes); |
| 557 EXPECT_FALSE(error.IsSet()); | 537 EXPECT_FALSE(error.IsSet()); |
| 558 EXPECT_EQ(1, change_count()); | 538 EXPECT_EQ(2, change_count()); |
| 559 | 539 |
| 560 RestartService(); | 540 RestartService(); |
| 561 | 541 |
| 562 std::unique_ptr<DeviceInfo> info = | 542 std::unique_ptr<DeviceInfo> info = |
| 563 service()->GetDeviceInfo(specifics.cache_guid()); | 543 service()->GetDeviceInfo(specifics.cache_guid()); |
| 564 ASSERT_TRUE(info); | 544 ASSERT_TRUE(info); |
| 565 AssertEqual(specifics, *info.get()); | 545 AssertEqual(specifics, *info.get()); |
| 566 | 546 |
| 567 EXPECT_TRUE(processor()->metadata()); | 547 EXPECT_TRUE(processor()->metadata()); |
| 568 EXPECT_EQ(state.encryption_key_name(), | 548 EXPECT_EQ(state.encryption_key_name(), |
| 569 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 549 processor()->metadata()->GetModelTypeState().encryption_key_name()); |
| 570 } | 550 } |
| 571 | 551 |
| 572 TEST_F(DeviceInfoServiceTest, ApplySyncChangesWithLocalGuid) { | 552 TEST_F(DeviceInfoServiceTest, ApplySyncChangesWithLocalGuid) { |
| 573 InitializeAndPumpAndStart(); | 553 InitializeAndPump(); |
| 574 | 554 |
| 575 // The point of this test is to try to apply remote changes that have the same | 555 // The point of this test is to try to apply remote changes that have the same |
| 576 // cache guid as the local device. The service should ignore these changes | 556 // cache guid as the local device. The service should ignore these changes |
| 577 // since only it should be performing writes on its data. | 557 // since only it should be performing writes on its data. |
| 578 DeviceInfoSpecifics specifics = | 558 DeviceInfoSpecifics specifics = |
| 579 GenerateTestSpecifics(local_device()->GetLocalDeviceInfo()->guid()); | 559 GenerateTestSpecifics(local_device()->GetLocalDeviceInfo()->guid()); |
| 580 EntityChangeList change_list; | 560 EntityChangeList change_list; |
| 581 PushBackEntityChangeAdd(specifics, &change_list); | 561 PushBackEntityChangeAdd(specifics, &change_list); |
| 582 | 562 |
| 583 // Should have a single change from reconciliation. | 563 // Should have a single change from reconciliation. |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 602 change_list.clear(); | 582 change_list.clear(); |
| 603 change_list.push_back(EntityChange::CreateDelete(specifics.cache_guid())); | 583 change_list.push_back(EntityChange::CreateDelete(specifics.cache_guid())); |
| 604 EXPECT_FALSE( | 584 EXPECT_FALSE( |
| 605 service() | 585 service() |
| 606 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list) | 586 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list) |
| 607 .IsSet()); | 587 .IsSet()); |
| 608 EXPECT_EQ(1, change_count()); | 588 EXPECT_EQ(1, change_count()); |
| 609 } | 589 } |
| 610 | 590 |
| 611 TEST_F(DeviceInfoServiceTest, ApplyDeleteNonexistent) { | 591 TEST_F(DeviceInfoServiceTest, ApplyDeleteNonexistent) { |
| 612 InitializeAndPumpAndStart(); | 592 InitializeAndPump(); |
| 613 EXPECT_EQ(1, change_count()); | 593 EXPECT_EQ(1, change_count()); |
| 614 EntityChangeList delete_changes; | 594 EntityChangeList delete_changes; |
| 615 delete_changes.push_back(EntityChange::CreateDelete("guid")); | 595 delete_changes.push_back(EntityChange::CreateDelete("guid")); |
| 616 const SyncError error = service()->ApplySyncChanges( | 596 const SyncError error = service()->ApplySyncChanges( |
| 617 service()->CreateMetadataChangeList(), delete_changes); | 597 service()->CreateMetadataChangeList(), delete_changes); |
| 618 EXPECT_FALSE(error.IsSet()); | 598 EXPECT_FALSE(error.IsSet()); |
| 619 EXPECT_EQ(1, change_count()); | 599 EXPECT_EQ(1, change_count()); |
| 620 } | 600 } |
| 621 | 601 |
| 622 TEST_F(DeviceInfoServiceTest, MergeEmpty) { | 602 TEST_F(DeviceInfoServiceTest, MergeEmpty) { |
| 623 InitializeAndPumpAndStart(); | 603 InitializeAndPump(); |
| 624 EXPECT_EQ(1, change_count()); | 604 EXPECT_EQ(1, change_count()); |
| 625 const SyncError error = service()->MergeSyncData( | 605 const SyncError error = service()->MergeSyncData( |
| 626 service()->CreateMetadataChangeList(), EntityDataMap()); | 606 service()->CreateMetadataChangeList(), EntityDataMap()); |
| 627 EXPECT_FALSE(error.IsSet()); | 607 EXPECT_FALSE(error.IsSet()); |
| 628 EXPECT_EQ(1, change_count()); | 608 EXPECT_EQ(1, change_count()); |
| 629 EXPECT_EQ(1u, processor()->put_map().size()); | 609 EXPECT_EQ(1u, processor()->put_map().size()); |
| 630 EXPECT_EQ(0u, processor()->delete_set().size()); | 610 EXPECT_EQ(0u, processor()->delete_set().size()); |
| 631 } | 611 } |
| 632 | 612 |
| 633 TEST_F(DeviceInfoServiceTest, MergeWithData) { | 613 TEST_F(DeviceInfoServiceTest, MergeWithData) { |
| 634 const std::string conflict_guid = "conflict_guid"; | 614 const std::string conflict_guid = "conflict_guid"; |
| 635 const DeviceInfoSpecifics unique_local( | 615 const DeviceInfoSpecifics unique_local = |
| 636 GenerateTestSpecifics("unique_local_guid")); | 616 GenerateTestSpecifics("unique_local_guid"); |
| 637 const DeviceInfoSpecifics conflict_local( | 617 const DeviceInfoSpecifics conflict_local = |
| 638 GenerateTestSpecifics(conflict_guid)); | 618 GenerateTestSpecifics(conflict_guid); |
| 639 const DeviceInfoSpecifics conflict_remote( | 619 const DeviceInfoSpecifics conflict_remote = |
| 640 GenerateTestSpecifics(conflict_guid)); | 620 GenerateTestSpecifics(conflict_guid); |
| 641 const DeviceInfoSpecifics unique_remote( | 621 const DeviceInfoSpecifics unique_remote = |
| 642 GenerateTestSpecifics("unique_remote_guid")); | 622 GenerateTestSpecifics("unique_remote_guid"); |
| 643 | 623 |
| 644 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 624 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); |
| 645 store()->WriteData(batch.get(), unique_local.cache_guid(), | 625 store()->WriteData(batch.get(), unique_local.cache_guid(), |
| 646 unique_local.SerializeAsString()); | 626 unique_local.SerializeAsString()); |
| 647 store()->WriteData(batch.get(), conflict_local.cache_guid(), | 627 store()->WriteData(batch.get(), conflict_local.cache_guid(), |
| 648 conflict_local.SerializeAsString()); | 628 conflict_local.SerializeAsString()); |
| 649 store()->CommitWriteBatch(std::move(batch), | 629 store()->CommitWriteBatch(std::move(batch), |
| 650 base::Bind(&AssertResultIsSuccess)); | 630 base::Bind(&AssertResultIsSuccess)); |
| 651 | 631 |
| 652 InitializeAndPumpAndStart(); | 632 InitializeAndPump(); |
| 653 EXPECT_EQ(1, change_count()); | 633 EXPECT_EQ(1, change_count()); |
| 654 | 634 |
| 655 EntityDataMap remote_input; | 635 EntityDataMap remote_input; |
| 656 remote_input[conflict_remote.cache_guid()] = | 636 remote_input[conflict_remote.cache_guid()] = |
| 657 SpecificsToEntity(conflict_remote); | 637 SpecificsToEntity(conflict_remote); |
| 658 remote_input[unique_remote.cache_guid()] = SpecificsToEntity(unique_remote); | 638 remote_input[unique_remote.cache_guid()] = SpecificsToEntity(unique_remote); |
| 659 | 639 |
| 660 ModelTypeState state; | 640 ModelTypeState state; |
| 661 state.set_encryption_key_name("ekn"); | 641 state.set_encryption_key_name("ekn"); |
| 662 std::unique_ptr<MetadataChangeList> metadata_changes( | 642 std::unique_ptr<MetadataChangeList> metadata_changes( |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 683 ASSERT_NE(processor()->put_map().end(), it); | 663 ASSERT_NE(processor()->put_map().end(), it); |
| 684 AssertEqual(unique_local, it->second->specifics.device_info()); | 664 AssertEqual(unique_local, it->second->specifics.device_info()); |
| 685 | 665 |
| 686 RestartService(); | 666 RestartService(); |
| 687 ASSERT_EQ(state.encryption_key_name(), | 667 ASSERT_EQ(state.encryption_key_name(), |
| 688 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 668 processor()->metadata()->GetModelTypeState().encryption_key_name()); |
| 689 } | 669 } |
| 690 | 670 |
| 691 TEST_F(DeviceInfoServiceTest, MergeLocalGuid) { | 671 TEST_F(DeviceInfoServiceTest, MergeLocalGuid) { |
| 692 const DeviceInfo* local_device_info = local_device()->GetLocalDeviceInfo(); | 672 const DeviceInfo* local_device_info = local_device()->GetLocalDeviceInfo(); |
| 693 std::unique_ptr<DeviceInfoSpecifics> specifics( | 673 std::unique_ptr<DeviceInfoSpecifics> specifics = |
| 694 CopyToSpecifics(*local_device_info)); | 674 CopyToSpecifics(*local_device_info); |
| 695 specifics->set_last_updated_timestamp(TimeToProtoTime(Time::Now())); | 675 specifics->set_last_updated_timestamp(TimeToProtoTime(Time::Now())); |
| 696 const std::string guid = local_device_info->guid(); | 676 const std::string guid = local_device_info->guid(); |
| 697 | 677 |
| 698 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); | 678 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); |
| 699 store()->WriteData(batch.get(), guid, specifics->SerializeAsString()); | 679 store()->WriteData(batch.get(), guid, specifics->SerializeAsString()); |
| 700 store()->CommitWriteBatch(std::move(batch), | 680 store()->CommitWriteBatch(std::move(batch), |
| 701 base::Bind(&AssertResultIsSuccess)); | 681 base::Bind(&AssertResultIsSuccess)); |
| 702 | 682 |
| 703 InitializeAndPumpAndStart(); | 683 InitializeAndPump(); |
| 704 | 684 |
| 705 EntityDataMap remote_input; | 685 EntityDataMap remote_input; |
| 706 remote_input[guid] = SpecificsToEntity(*specifics); | 686 remote_input[guid] = SpecificsToEntity(*specifics); |
| 707 | 687 |
| 708 const SyncError error = service()->MergeSyncData( | 688 const SyncError error = service()->MergeSyncData( |
| 709 service()->CreateMetadataChangeList(), remote_input); | 689 service()->CreateMetadataChangeList(), remote_input); |
| 710 EXPECT_FALSE(error.IsSet()); | 690 EXPECT_FALSE(error.IsSet()); |
| 711 EXPECT_EQ(0, change_count()); | 691 EXPECT_EQ(0, change_count()); |
| 712 EXPECT_EQ(1u, service()->GetAllDeviceInfo().size()); | 692 EXPECT_EQ(1u, service()->GetAllDeviceInfo().size()); |
| 713 EXPECT_TRUE(processor()->delete_set().empty()); | 693 EXPECT_TRUE(processor()->delete_set().empty()); |
| 714 EXPECT_TRUE(processor()->put_map().empty()); | 694 EXPECT_TRUE(processor()->put_map().empty()); |
| 715 } | 695 } |
| 716 | 696 |
| 717 TEST_F(DeviceInfoServiceTest, GetLastUpdateTime) { | 697 TEST_F(DeviceInfoServiceTest, GetLastUpdateTime) { |
| 718 Time time1(Time() + TimeDelta::FromDays(1)); | 698 Time time1(Time() + TimeDelta::FromDays(1)); |
| 719 | 699 |
| 720 DeviceInfoSpecifics specifics1(GenerateTestSpecifics()); | 700 DeviceInfoSpecifics specifics1 = GenerateTestSpecifics(); |
| 721 DeviceInfoSpecifics specifics2(GenerateTestSpecifics()); | 701 DeviceInfoSpecifics specifics2 = GenerateTestSpecifics(); |
| 722 specifics2.set_last_updated_timestamp(TimeToProtoTime(time1)); | 702 specifics2.set_last_updated_timestamp(TimeToProtoTime(time1)); |
| 723 | 703 |
| 724 EXPECT_EQ(Time(), GetLastUpdateTime(specifics1)); | 704 EXPECT_EQ(Time(), GetLastUpdateTime(specifics1)); |
| 725 EXPECT_EQ(time1, GetLastUpdateTime(specifics2)); | 705 EXPECT_EQ(time1, GetLastUpdateTime(specifics2)); |
| 726 } | 706 } |
| 727 | 707 |
| 728 TEST_F(DeviceInfoServiceTest, CountActiveDevices) { | 708 TEST_F(DeviceInfoServiceTest, CountActiveDevices) { |
| 729 InitializeAndPump(); | 709 InitializeAndPump(); |
| 730 EXPECT_EQ(0, service()->CountActiveDevices()); | 710 EXPECT_EQ(1, service()->CountActiveDevices()); |
| 731 | 711 |
| 732 DeviceInfoSpecifics specifics = | 712 DeviceInfoSpecifics specifics = |
| 733 GenerateTestSpecifics(local_device()->GetLocalDeviceInfo()->guid()); | 713 GenerateTestSpecifics(local_device()->GetLocalDeviceInfo()->guid()); |
| 734 EntityChangeList change_list; | 714 EntityChangeList change_list; |
| 735 PushBackEntityChangeAdd(specifics, &change_list); | 715 PushBackEntityChangeAdd(specifics, &change_list); |
| 736 service()->ApplySyncChanges(service()->CreateMetadataChangeList(), | 716 service()->ApplySyncChanges(service()->CreateMetadataChangeList(), |
| 737 change_list); | 717 change_list); |
| 738 EXPECT_EQ(0, service()->CountActiveDevices()); | 718 EXPECT_EQ(1, service()->CountActiveDevices()); |
| 739 | 719 |
| 740 change_list.clear(); | 720 change_list.clear(); |
| 741 specifics.set_last_updated_timestamp(TimeToProtoTime(Time::Now())); | 721 specifics.set_last_updated_timestamp(TimeToProtoTime(Time::Now())); |
| 742 PushBackEntityChangeAdd(specifics, &change_list); | 722 PushBackEntityChangeAdd(specifics, &change_list); |
| 743 service()->ApplySyncChanges(service()->CreateMetadataChangeList(), | 723 service()->ApplySyncChanges(service()->CreateMetadataChangeList(), |
| 744 change_list); | 724 change_list); |
| 745 EXPECT_EQ(0, service()->CountActiveDevices()); | 725 EXPECT_EQ(1, service()->CountActiveDevices()); |
| 746 | 726 |
| 747 change_list.clear(); | 727 change_list.clear(); |
| 748 specifics.set_cache_guid("non-local"); | 728 specifics.set_cache_guid("non-local"); |
| 749 PushBackEntityChangeAdd(specifics, &change_list); | 729 PushBackEntityChangeAdd(specifics, &change_list); |
| 750 service()->ApplySyncChanges(service()->CreateMetadataChangeList(), | 730 service()->ApplySyncChanges(service()->CreateMetadataChangeList(), |
| 751 change_list); | 731 change_list); |
| 752 EXPECT_EQ(1, service()->CountActiveDevices()); | 732 EXPECT_EQ(2, service()->CountActiveDevices()); |
| 753 } | 733 } |
| 754 | 734 |
| 755 } // namespace | 735 } // namespace |
| 756 | 736 |
| 757 } // namespace syncer | 737 } // namespace syncer |
| OLD | NEW |