| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "sync/sessions/sync_session.h" | 5 #include "sync/sessions/sync_session.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| 11 #include "sync/engine/conflict_resolver.h" | 11 #include "sync/engine/conflict_resolver.h" |
| 12 #include "sync/engine/syncer_types.h" | 12 #include "sync/engine/syncer_types.h" |
| 13 #include "sync/engine/throttled_data_type_tracker.h" | 13 #include "sync/engine/throttled_data_type_tracker.h" |
| 14 #include "sync/internal_api/public/base/model_type.h" | 14 #include "sync/internal_api/public/base/model_type.h" |
| 15 #include "sync/internal_api/public/base/model_type_state_map_test_util.h" |
| 15 #include "sync/sessions/session_state.h" | 16 #include "sync/sessions/session_state.h" |
| 16 #include "sync/sessions/status_controller.h" | 17 #include "sync/sessions/status_controller.h" |
| 17 #include "sync/syncable/syncable_id.h" | 18 #include "sync/syncable/syncable_id.h" |
| 18 #include "sync/syncable/write_transaction.h" | 19 #include "sync/syncable/write_transaction.h" |
| 19 #include "sync/test/engine/fake_model_worker.h" | 20 #include "sync/test/engine/fake_model_worker.h" |
| 20 #include "sync/test/engine/test_directory_setter_upper.h" | 21 #include "sync/test/engine/test_directory_setter_upper.h" |
| 21 #include "sync/test/fake_extensions_activity_monitor.h" | 22 #include "sync/test/fake_extensions_activity_monitor.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 24 |
| 24 namespace syncer { | 25 namespace syncer { |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 session_->PrepareForAnotherSyncCycle(); | 266 session_->PrepareForAnotherSyncCycle(); |
| 266 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION, | 267 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION, |
| 267 session_->source().updates_source); | 268 session_->source().updates_source); |
| 268 EXPECT_FALSE(status()->conflicts_resolved()); | 269 EXPECT_FALSE(status()->conflicts_resolved()); |
| 269 EXPECT_FALSE(session_->HasMoreToSync()); | 270 EXPECT_FALSE(session_->HasMoreToSync()); |
| 270 } | 271 } |
| 271 | 272 |
| 272 TEST_F(SyncSessionTest, Coalesce) { | 273 TEST_F(SyncSessionTest, Coalesce) { |
| 273 std::vector<ModelSafeWorker*> workers_one, workers_two; | 274 std::vector<ModelSafeWorker*> workers_one, workers_two; |
| 274 ModelSafeRoutingInfo routes_one, routes_two; | 275 ModelSafeRoutingInfo routes_one, routes_two; |
| 275 ModelTypePayloadMap one_type = | 276 ModelTypeStateMap one_type = |
| 276 ModelTypePayloadMapFromEnumSet( | 277 ModelTypeSetToStateMap( |
| 277 ParamsMeaningJustOneEnabledType(), | 278 ParamsMeaningJustOneEnabledType(), |
| 278 std::string()); | 279 std::string()); |
| 279 ModelTypePayloadMap all_types = | 280 ModelTypeStateMap all_types = |
| 280 ModelTypePayloadMapFromEnumSet( | 281 ModelTypeSetToStateMap( |
| 281 ParamsMeaningAllEnabledTypes(), | 282 ParamsMeaningAllEnabledTypes(), |
| 282 std::string()); | 283 std::string()); |
| 283 SyncSourceInfo source_one(sync_pb::GetUpdatesCallerInfo::PERIODIC, one_type); | 284 SyncSourceInfo source_one(sync_pb::GetUpdatesCallerInfo::PERIODIC, one_type); |
| 284 SyncSourceInfo source_two(sync_pb::GetUpdatesCallerInfo::LOCAL, all_types); | 285 SyncSourceInfo source_two(sync_pb::GetUpdatesCallerInfo::LOCAL, all_types); |
| 285 | 286 |
| 286 scoped_refptr<ModelSafeWorker> passive_worker( | 287 scoped_refptr<ModelSafeWorker> passive_worker( |
| 287 new FakeModelWorker(GROUP_PASSIVE)); | 288 new FakeModelWorker(GROUP_PASSIVE)); |
| 288 scoped_refptr<ModelSafeWorker> db_worker(new FakeModelWorker(GROUP_DB)); | 289 scoped_refptr<ModelSafeWorker> db_worker(new FakeModelWorker(GROUP_DB)); |
| 289 scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); | 290 scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); |
| 290 workers_one.push_back(passive_worker); | 291 workers_one.push_back(passive_worker); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 309 | 310 |
| 310 EXPECT_EQ(expected_enabled_groups_one, one.GetEnabledGroups()); | 311 EXPECT_EQ(expected_enabled_groups_one, one.GetEnabledGroups()); |
| 311 EXPECT_EQ(expected_enabled_groups_two, two.GetEnabledGroups()); | 312 EXPECT_EQ(expected_enabled_groups_two, two.GetEnabledGroups()); |
| 312 | 313 |
| 313 one.Coalesce(two); | 314 one.Coalesce(two); |
| 314 | 315 |
| 315 EXPECT_EQ(expected_enabled_groups_two, one.GetEnabledGroups()); | 316 EXPECT_EQ(expected_enabled_groups_two, one.GetEnabledGroups()); |
| 316 EXPECT_EQ(expected_enabled_groups_two, two.GetEnabledGroups()); | 317 EXPECT_EQ(expected_enabled_groups_two, two.GetEnabledGroups()); |
| 317 | 318 |
| 318 EXPECT_EQ(two.source().updates_source, one.source().updates_source); | 319 EXPECT_EQ(two.source().updates_source, one.source().updates_source); |
| 319 EXPECT_EQ(all_types, one.source().types); | 320 EXPECT_THAT(all_types, Eq(one.source().types)); |
| 320 std::vector<ModelSafeWorker*>::const_iterator it_db = | 321 std::vector<ModelSafeWorker*>::const_iterator it_db = |
| 321 std::find(one.workers().begin(), one.workers().end(), db_worker); | 322 std::find(one.workers().begin(), one.workers().end(), db_worker); |
| 322 std::vector<ModelSafeWorker*>::const_iterator it_ui = | 323 std::vector<ModelSafeWorker*>::const_iterator it_ui = |
| 323 std::find(one.workers().begin(), one.workers().end(), ui_worker); | 324 std::find(one.workers().begin(), one.workers().end(), ui_worker); |
| 324 EXPECT_NE(it_db, one.workers().end()); | 325 EXPECT_NE(it_db, one.workers().end()); |
| 325 EXPECT_NE(it_ui, one.workers().end()); | 326 EXPECT_NE(it_ui, one.workers().end()); |
| 326 EXPECT_EQ(routes_two, one.routing_info()); | 327 EXPECT_EQ(routes_two, one.routing_info()); |
| 327 } | 328 } |
| 328 | 329 |
| 329 TEST_F(SyncSessionTest, RebaseRoutingInfoWithLatestRemoveOneType) { | 330 TEST_F(SyncSessionTest, RebaseRoutingInfoWithLatestRemoveOneType) { |
| 330 std::vector<ModelSafeWorker*> workers_one, workers_two; | 331 std::vector<ModelSafeWorker*> workers_one, workers_two; |
| 331 ModelSafeRoutingInfo routes_one, routes_two; | 332 ModelSafeRoutingInfo routes_one, routes_two; |
| 332 ModelTypePayloadMap one_type = | 333 ModelTypeStateMap one_type = |
| 333 ModelTypePayloadMapFromEnumSet( | 334 ModelTypeSetToStateMap( |
| 334 ParamsMeaningJustOneEnabledType(), | 335 ParamsMeaningJustOneEnabledType(), |
| 335 std::string()); | 336 std::string()); |
| 336 ModelTypePayloadMap all_types = | 337 ModelTypeStateMap all_types = |
| 337 ModelTypePayloadMapFromEnumSet( | 338 ModelTypeSetToStateMap( |
| 338 ParamsMeaningAllEnabledTypes(), | 339 ParamsMeaningAllEnabledTypes(), |
| 339 std::string()); | 340 std::string()); |
| 340 SyncSourceInfo source_one(sync_pb::GetUpdatesCallerInfo::PERIODIC, one_type); | 341 SyncSourceInfo source_one(sync_pb::GetUpdatesCallerInfo::PERIODIC, one_type); |
| 341 SyncSourceInfo source_two(sync_pb::GetUpdatesCallerInfo::LOCAL, all_types); | 342 SyncSourceInfo source_two(sync_pb::GetUpdatesCallerInfo::LOCAL, all_types); |
| 342 | 343 |
| 343 scoped_refptr<ModelSafeWorker> passive_worker( | 344 scoped_refptr<ModelSafeWorker> passive_worker( |
| 344 new FakeModelWorker(GROUP_PASSIVE)); | 345 new FakeModelWorker(GROUP_PASSIVE)); |
| 345 scoped_refptr<ModelSafeWorker> db_worker(new FakeModelWorker(GROUP_DB)); | 346 scoped_refptr<ModelSafeWorker> db_worker(new FakeModelWorker(GROUP_DB)); |
| 346 scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); | 347 scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); |
| 347 workers_one.push_back(passive_worker); | 348 workers_one.push_back(passive_worker); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 370 two.RebaseRoutingInfoWithLatest(one); | 371 two.RebaseRoutingInfoWithLatest(one); |
| 371 | 372 |
| 372 EXPECT_EQ(expected_enabled_groups_one, one.GetEnabledGroups()); | 373 EXPECT_EQ(expected_enabled_groups_one, one.GetEnabledGroups()); |
| 373 EXPECT_EQ(expected_enabled_groups_one, two.GetEnabledGroups()); | 374 EXPECT_EQ(expected_enabled_groups_one, two.GetEnabledGroups()); |
| 374 | 375 |
| 375 // Make sure the source has not been touched. | 376 // Make sure the source has not been touched. |
| 376 EXPECT_EQ(two.source().updates_source, | 377 EXPECT_EQ(two.source().updates_source, |
| 377 sync_pb::GetUpdatesCallerInfo::LOCAL); | 378 sync_pb::GetUpdatesCallerInfo::LOCAL); |
| 378 | 379 |
| 379 // Make sure the payload is reduced to one. | 380 // Make sure the payload is reduced to one. |
| 380 EXPECT_EQ(one_type, two.source().types); | 381 EXPECT_THAT(one_type, Eq(two.source().types)); |
| 381 | 382 |
| 382 // Make sure the workers are udpated. | 383 // Make sure the workers are udpated. |
| 383 std::vector<ModelSafeWorker*>::const_iterator it_db = | 384 std::vector<ModelSafeWorker*>::const_iterator it_db = |
| 384 std::find(two.workers().begin(), two.workers().end(), db_worker); | 385 std::find(two.workers().begin(), two.workers().end(), db_worker); |
| 385 std::vector<ModelSafeWorker*>::const_iterator it_ui = | 386 std::vector<ModelSafeWorker*>::const_iterator it_ui = |
| 386 std::find(two.workers().begin(), two.workers().end(), ui_worker); | 387 std::find(two.workers().begin(), two.workers().end(), ui_worker); |
| 387 EXPECT_NE(it_db, two.workers().end()); | 388 EXPECT_NE(it_db, two.workers().end()); |
| 388 EXPECT_EQ(it_ui, two.workers().end()); | 389 EXPECT_EQ(it_ui, two.workers().end()); |
| 389 EXPECT_EQ(two.workers().size(), 2U); | 390 EXPECT_EQ(two.workers().size(), 2U); |
| 390 | 391 |
| 391 // Make sure the model safe routing info is reduced to one type. | 392 // Make sure the model safe routing info is reduced to one type. |
| 392 ModelSafeRoutingInfo::const_iterator it = | 393 ModelSafeRoutingInfo::const_iterator it = |
| 393 two.routing_info().find(AUTOFILL); | 394 two.routing_info().find(AUTOFILL); |
| 394 // Note that attempting to use EXPECT_NE would fail for an Android build due | 395 // Note that attempting to use EXPECT_NE would fail for an Android build due |
| 395 // to seeming incompatibility with gtest and stlport. | 396 // to seeming incompatibility with gtest and stlport. |
| 396 EXPECT_TRUE(it != two.routing_info().end()); | 397 EXPECT_TRUE(it != two.routing_info().end()); |
| 397 EXPECT_EQ(it->second, GROUP_DB); | 398 EXPECT_EQ(it->second, GROUP_DB); |
| 398 EXPECT_EQ(two.routing_info().size(), 1U); | 399 EXPECT_EQ(two.routing_info().size(), 1U); |
| 399 } | 400 } |
| 400 | 401 |
| 401 TEST_F(SyncSessionTest, RebaseRoutingInfoWithLatestWithSameType) { | 402 TEST_F(SyncSessionTest, RebaseRoutingInfoWithLatestWithSameType) { |
| 402 std::vector<ModelSafeWorker*> workers_first, workers_second; | 403 std::vector<ModelSafeWorker*> workers_first, workers_second; |
| 403 ModelSafeRoutingInfo routes_first, routes_second; | 404 ModelSafeRoutingInfo routes_first, routes_second; |
| 404 ModelTypePayloadMap all_types = | 405 ModelTypeStateMap all_types = |
| 405 ModelTypePayloadMapFromEnumSet( | 406 ModelTypeSetToStateMap( |
| 406 ParamsMeaningAllEnabledTypes(), | 407 ParamsMeaningAllEnabledTypes(), |
| 407 std::string()); | 408 std::string()); |
| 408 SyncSourceInfo source_first(sync_pb::GetUpdatesCallerInfo::PERIODIC, | 409 SyncSourceInfo source_first(sync_pb::GetUpdatesCallerInfo::PERIODIC, |
| 409 all_types); | 410 all_types); |
| 410 SyncSourceInfo source_second(sync_pb::GetUpdatesCallerInfo::LOCAL, | 411 SyncSourceInfo source_second(sync_pb::GetUpdatesCallerInfo::LOCAL, |
| 411 all_types); | 412 all_types); |
| 412 | 413 |
| 413 scoped_refptr<ModelSafeWorker> passive_worker( | 414 scoped_refptr<ModelSafeWorker> passive_worker( |
| 414 new FakeModelWorker(GROUP_PASSIVE)); | 415 new FakeModelWorker(GROUP_PASSIVE)); |
| 415 scoped_refptr<FakeModelWorker> db_worker(new FakeModelWorker(GROUP_DB)); | 416 scoped_refptr<FakeModelWorker> db_worker(new FakeModelWorker(GROUP_DB)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 440 second.RebaseRoutingInfoWithLatest(first); | 441 second.RebaseRoutingInfoWithLatest(first); |
| 441 | 442 |
| 442 EXPECT_EQ(expected_enabled_groups, first.GetEnabledGroups()); | 443 EXPECT_EQ(expected_enabled_groups, first.GetEnabledGroups()); |
| 443 EXPECT_EQ(expected_enabled_groups, second.GetEnabledGroups()); | 444 EXPECT_EQ(expected_enabled_groups, second.GetEnabledGroups()); |
| 444 | 445 |
| 445 // Make sure the source has not been touched. | 446 // Make sure the source has not been touched. |
| 446 EXPECT_EQ(second.source().updates_source, | 447 EXPECT_EQ(second.source().updates_source, |
| 447 sync_pb::GetUpdatesCallerInfo::LOCAL); | 448 sync_pb::GetUpdatesCallerInfo::LOCAL); |
| 448 | 449 |
| 449 // Make sure our payload is still the same. | 450 // Make sure our payload is still the same. |
| 450 EXPECT_EQ(all_types, second.source().types); | 451 EXPECT_THAT(all_types, Eq(second.source().types)); |
| 451 | 452 |
| 452 // Make sure the workers are still the same. | 453 // Make sure the workers are still the same. |
| 453 std::vector<ModelSafeWorker*>::const_iterator it_passive = | 454 std::vector<ModelSafeWorker*>::const_iterator it_passive = |
| 454 std::find(second.workers().begin(), second.workers().end(), | 455 std::find(second.workers().begin(), second.workers().end(), |
| 455 passive_worker); | 456 passive_worker); |
| 456 std::vector<ModelSafeWorker*>::const_iterator it_db = | 457 std::vector<ModelSafeWorker*>::const_iterator it_db = |
| 457 std::find(second.workers().begin(), second.workers().end(), db_worker); | 458 std::find(second.workers().begin(), second.workers().end(), db_worker); |
| 458 std::vector<ModelSafeWorker*>::const_iterator it_ui = | 459 std::vector<ModelSafeWorker*>::const_iterator it_ui = |
| 459 std::find(second.workers().begin(), second.workers().end(), ui_worker); | 460 std::find(second.workers().begin(), second.workers().end(), ui_worker); |
| 460 EXPECT_NE(it_passive, second.workers().end()); | 461 EXPECT_NE(it_passive, second.workers().end()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 474 EXPECT_EQ(it1->second, GROUP_DB); | 475 EXPECT_EQ(it1->second, GROUP_DB); |
| 475 | 476 |
| 476 // Note that attempting to use EXPECT_NE would fail for an Android build due | 477 // Note that attempting to use EXPECT_NE would fail for an Android build due |
| 477 // to seeming incompatibility with gtest and stlport. | 478 // to seeming incompatibility with gtest and stlport. |
| 478 EXPECT_TRUE(it2 != second.routing_info().end()); | 479 EXPECT_TRUE(it2 != second.routing_info().end()); |
| 479 EXPECT_EQ(it2->second, GROUP_UI); | 480 EXPECT_EQ(it2->second, GROUP_UI); |
| 480 EXPECT_EQ(second.routing_info().size(), 2U); | 481 EXPECT_EQ(second.routing_info().size(), 2U); |
| 481 } | 482 } |
| 482 | 483 |
| 483 | 484 |
| 484 TEST_F(SyncSessionTest, MakeTypePayloadMapFromBitSet) { | 485 TEST_F(SyncSessionTest, MakeTypeStateMapFromBitSet) { |
| 485 ModelTypeSet types; | 486 ModelTypeSet types; |
| 486 std::string payload = "test"; | 487 std::string payload = "test"; |
| 487 ModelTypePayloadMap types_with_payloads = | 488 ModelTypeStateMap type_state_map = |
| 488 ModelTypePayloadMapFromEnumSet(types, payload); | 489 ModelTypeSetToStateMap(types, payload); |
| 489 EXPECT_TRUE(types_with_payloads.empty()); | 490 EXPECT_TRUE(type_state_map.empty()); |
| 490 | 491 |
| 491 types.Put(BOOKMARKS); | 492 types.Put(BOOKMARKS); |
| 492 types.Put(PASSWORDS); | 493 types.Put(PASSWORDS); |
| 493 types.Put(AUTOFILL); | 494 types.Put(AUTOFILL); |
| 494 payload = "test2"; | 495 payload = "test2"; |
| 495 types_with_payloads = ModelTypePayloadMapFromEnumSet(types, payload); | 496 type_state_map = ModelTypeSetToStateMap(types, payload); |
| 496 | 497 |
| 497 ASSERT_EQ(3U, types_with_payloads.size()); | 498 ASSERT_EQ(3U, type_state_map.size()); |
| 498 EXPECT_EQ(types_with_payloads[BOOKMARKS], payload); | 499 EXPECT_EQ(type_state_map[BOOKMARKS].payload, payload); |
| 499 EXPECT_EQ(types_with_payloads[PASSWORDS], payload); | 500 EXPECT_EQ(type_state_map[PASSWORDS].payload, payload); |
| 500 EXPECT_EQ(types_with_payloads[AUTOFILL], payload); | 501 EXPECT_EQ(type_state_map[AUTOFILL].payload, payload); |
| 501 } | 502 } |
| 502 | 503 |
| 503 } // namespace | 504 } // namespace |
| 504 } // namespace sessions | 505 } // namespace sessions |
| 505 } // namespace syncer | 506 } // namespace syncer |
| OLD | NEW |