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