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 |