| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/sync/sessions/sync_session.h" | 5 #include "chrome/browser/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 "chrome/browser/sync/engine/conflict_resolver.h" | 11 #include "chrome/browser/sync/engine/conflict_resolver.h" |
| 12 #include "chrome/browser/sync/engine/syncer_types.h" | 12 #include "chrome/browser/sync/engine/syncer_types.h" |
| 13 #include "chrome/browser/sync/sessions/session_state.h" | |
| 14 #include "chrome/browser/sync/sessions/status_controller.h" | |
| 15 #include "chrome/browser/sync/syncable/directory_manager.h" | 13 #include "chrome/browser/sync/syncable/directory_manager.h" |
| 16 #include "chrome/browser/sync/syncable/model_type.h" | 14 #include "chrome/browser/sync/syncable/model_type.h" |
| 17 #include "chrome/browser/sync/syncable/syncable.h" | 15 #include "chrome/browser/sync/syncable/syncable.h" |
| 18 #include "chrome/browser/sync/syncable/syncable_id.h" | |
| 19 #include "chrome/browser/sync/test/engine/fake_model_worker.h" | 16 #include "chrome/browser/sync/test/engine/fake_model_worker.h" |
| 20 #include "chrome/browser/sync/test/engine/test_directory_setter_upper.h" | 17 #include "chrome/browser/sync/test/engine/test_directory_setter_upper.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 19 |
| 23 using syncable::WriteTransaction; | 20 using syncable::WriteTransaction; |
| 24 | 21 |
| 25 namespace browser_sync { | 22 namespace browser_sync { |
| 26 namespace sessions { | 23 namespace sessions { |
| 27 namespace { | 24 namespace { |
| 28 | 25 |
| 29 class SyncSessionTest : public testing::Test, | 26 class SyncSessionTest : public testing::Test, |
| 30 public SyncSession::Delegate, | 27 public SyncSession::Delegate, |
| 31 public ModelSafeWorkerRegistrar { | 28 public ModelSafeWorkerRegistrar { |
| 32 public: | 29 public: |
| 33 SyncSessionTest() : controller_invocations_allowed_(false) {} | 30 SyncSessionTest() : controller_invocations_allowed_(false) { |
| 31 GetModelSafeRoutingInfo(&routes_); |
| 32 } |
| 34 | 33 |
| 35 SyncSession* MakeSession() { | 34 SyncSession* MakeSession() { |
| 36 std::vector<ModelSafeWorker*> workers; | 35 return new SyncSession(context_.get(), this, SyncSourceInfo(), routes_, |
| 37 GetWorkers(&workers); | 36 std::vector<ModelSafeWorker*>()); |
| 38 return new SyncSession(context_.get(), this, SyncSourceInfo(), | |
| 39 routes_, workers); | |
| 40 } | 37 } |
| 41 | 38 |
| 42 virtual void SetUp() { | 39 virtual void SetUp() { |
| 43 context_.reset(new SyncSessionContext(NULL, NULL, this, | 40 context_.reset(new SyncSessionContext(NULL, NULL, this, |
| 44 std::vector<SyncEngineEventListener*>(), NULL)); | 41 std::vector<SyncEngineEventListener*>(), NULL)); |
| 45 routes_.clear(); | 42 routes_.clear(); |
| 46 routes_[syncable::BOOKMARKS] = GROUP_UI; | 43 routes_[syncable::BOOKMARKS] = GROUP_UI; |
| 47 routes_[syncable::AUTOFILL] = GROUP_DB; | 44 routes_[syncable::AUTOFILL] = GROUP_UI; |
| 48 scoped_refptr<ModelSafeWorker> passive_worker( | |
| 49 new FakeModelWorker(GROUP_PASSIVE)); | |
| 50 scoped_refptr<ModelSafeWorker> ui_worker( | |
| 51 new FakeModelWorker(GROUP_UI)); | |
| 52 scoped_refptr<ModelSafeWorker> db_worker( | |
| 53 new FakeModelWorker(GROUP_DB)); | |
| 54 workers_.clear(); | |
| 55 workers_.push_back(passive_worker); | |
| 56 workers_.push_back(ui_worker); | |
| 57 workers_.push_back(db_worker); | |
| 58 session_.reset(MakeSession()); | 45 session_.reset(MakeSession()); |
| 59 } | 46 } |
| 60 virtual void TearDown() { | 47 virtual void TearDown() { |
| 61 session_.reset(); | 48 session_.reset(); |
| 62 context_.reset(); | 49 context_.reset(); |
| 63 } | 50 } |
| 64 | 51 |
| 65 virtual void OnSilencedUntil(const base::TimeTicks& silenced_until) OVERRIDE { | 52 virtual void OnSilencedUntil(const base::TimeTicks& silenced_until) OVERRIDE { |
| 66 FailControllerInvocationIfDisabled("OnSilencedUntil"); | 53 FailControllerInvocationIfDisabled("OnSilencedUntil"); |
| 67 } | 54 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 83 } | 70 } |
| 84 virtual void OnShouldStopSyncingPermanently() OVERRIDE { | 71 virtual void OnShouldStopSyncingPermanently() OVERRIDE { |
| 85 FailControllerInvocationIfDisabled("OnShouldStopSyncingPermanently"); | 72 FailControllerInvocationIfDisabled("OnShouldStopSyncingPermanently"); |
| 86 } | 73 } |
| 87 virtual void OnSyncProtocolError( | 74 virtual void OnSyncProtocolError( |
| 88 const sessions::SyncSessionSnapshot& snapshot) { | 75 const sessions::SyncSessionSnapshot& snapshot) { |
| 89 FailControllerInvocationIfDisabled("SyncProtocolError"); | 76 FailControllerInvocationIfDisabled("SyncProtocolError"); |
| 90 } | 77 } |
| 91 | 78 |
| 92 // ModelSafeWorkerRegistrar implementation. | 79 // ModelSafeWorkerRegistrar implementation. |
| 93 virtual void GetWorkers(std::vector<ModelSafeWorker*>* out) OVERRIDE { | 80 virtual void GetWorkers(std::vector<ModelSafeWorker*>* out) OVERRIDE {} |
| 94 out->clear(); | |
| 95 for (std::vector<scoped_refptr<ModelSafeWorker> >::const_iterator it = | |
| 96 workers_.begin(); it != workers_.end(); ++it) { | |
| 97 out->push_back(it->get()); | |
| 98 } | |
| 99 } | |
| 100 virtual void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) OVERRIDE { | 81 virtual void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) OVERRIDE { |
| 101 *out = routes_; | 82 out->swap(routes_); |
| 102 } | 83 } |
| 103 | 84 |
| 104 StatusController* status() { return session_->mutable_status_controller(); } | 85 StatusController* status() { return session_->mutable_status_controller(); } |
| 105 protected: | 86 protected: |
| 106 void FailControllerInvocationIfDisabled(const std::string& msg) { | 87 void FailControllerInvocationIfDisabled(const std::string& msg) { |
| 107 if (!controller_invocations_allowed_) | 88 if (!controller_invocations_allowed_) |
| 108 FAIL() << msg; | 89 FAIL() << msg; |
| 109 } | 90 } |
| 110 | 91 |
| 111 syncable::ModelTypeBitSet ParamsMeaningAllEnabledTypes() { | 92 syncable::ModelTypeBitSet ParamsMeaningAllEnabledTypes() { |
| 112 syncable::ModelTypeBitSet request_params; | 93 syncable::ModelTypeBitSet request_params; |
| 113 request_params[syncable::BOOKMARKS] = true; | 94 request_params[syncable::BOOKMARKS] = true; |
| 114 request_params[syncable::AUTOFILL] = true; | 95 request_params[syncable::AUTOFILL] = true; |
| 115 return request_params; | 96 return request_params; |
| 116 } | 97 } |
| 117 | 98 |
| 118 syncable::ModelTypeBitSet ParamsMeaningJustOneEnabledType() { | 99 syncable::ModelTypeBitSet ParamsMeaningJustOneEnabledType() { |
| 119 syncable::ModelTypeBitSet request_params; | 100 syncable::ModelTypeBitSet request_params; |
| 120 request_params[syncable::AUTOFILL] = true; | 101 request_params[syncable::AUTOFILL] = true; |
| 121 return request_params; | 102 return request_params; |
| 122 } | 103 } |
| 123 | 104 |
| 124 MessageLoop message_loop_; | 105 MessageLoop message_loop_; |
| 125 bool controller_invocations_allowed_; | 106 bool controller_invocations_allowed_; |
| 126 scoped_ptr<SyncSession> session_; | 107 scoped_ptr<SyncSession> session_; |
| 127 scoped_ptr<SyncSessionContext> context_; | 108 scoped_ptr<SyncSessionContext> context_; |
| 128 std::vector<scoped_refptr<ModelSafeWorker> > workers_; | |
| 129 ModelSafeRoutingInfo routes_; | 109 ModelSafeRoutingInfo routes_; |
| 130 }; | 110 }; |
| 131 | 111 |
| 132 TEST_F(SyncSessionTest, EnabledGroupsEmpty) { | |
| 133 routes_.clear(); | |
| 134 workers_.clear(); | |
| 135 scoped_ptr<SyncSession> session(MakeSession()); | |
| 136 std::set<ModelSafeGroup> expected_enabled_groups; | |
| 137 expected_enabled_groups.insert(GROUP_PASSIVE); | |
| 138 EXPECT_EQ(expected_enabled_groups, session->GetEnabledGroups()); | |
| 139 } | |
| 140 | |
| 141 TEST_F(SyncSessionTest, EnabledGroups) { | |
| 142 scoped_ptr<SyncSession> session(MakeSession()); | |
| 143 std::set<ModelSafeGroup> expected_enabled_groups; | |
| 144 expected_enabled_groups.insert(GROUP_PASSIVE); | |
| 145 expected_enabled_groups.insert(GROUP_UI); | |
| 146 expected_enabled_groups.insert(GROUP_DB); | |
| 147 EXPECT_EQ(expected_enabled_groups, session->GetEnabledGroups()); | |
| 148 } | |
| 149 | |
| 150 TEST_F(SyncSessionTest, EnabledGroupsWithConflictsEmpty) { | |
| 151 scoped_ptr<SyncSession> session(MakeSession()); | |
| 152 // Auto-create conflict progress. This shouldn't put that group in | |
| 153 // conflict. | |
| 154 session->mutable_status_controller()-> | |
| 155 GetUnrestrictedMutableConflictProgressForTest(GROUP_PASSIVE); | |
| 156 EXPECT_TRUE(session->GetEnabledGroupsWithConflicts().empty()); | |
| 157 } | |
| 158 | |
| 159 TEST_F(SyncSessionTest, EnabledGroupsWithConflicts) { | |
| 160 scoped_ptr<SyncSession> session(MakeSession()); | |
| 161 // Put GROUP_UI in conflict. | |
| 162 session->mutable_status_controller()-> | |
| 163 GetUnrestrictedMutableConflictProgressForTest(GROUP_UI)-> | |
| 164 AddConflictingItemById(syncable::Id()); | |
| 165 std::set<ModelSafeGroup> expected_enabled_groups_with_conflicts; | |
| 166 expected_enabled_groups_with_conflicts.insert(GROUP_UI); | |
| 167 EXPECT_EQ(expected_enabled_groups_with_conflicts, | |
| 168 session->GetEnabledGroupsWithConflicts()); | |
| 169 } | |
| 170 | |
| 171 TEST_F(SyncSessionTest, ScopedContextHelpers) { | 112 TEST_F(SyncSessionTest, ScopedContextHelpers) { |
| 172 ConflictResolver resolver; | 113 ConflictResolver resolver; |
| 173 EXPECT_FALSE(context_->resolver()); | 114 EXPECT_FALSE(context_->resolver()); |
| 174 { | 115 { |
| 175 ScopedSessionContextConflictResolver s_resolver(context_.get(), &resolver); | 116 ScopedSessionContextConflictResolver s_resolver(context_.get(), &resolver); |
| 176 EXPECT_EQ(&resolver, context_->resolver()); | 117 EXPECT_EQ(&resolver, context_->resolver()); |
| 177 } | 118 } |
| 178 EXPECT_FALSE(context_->resolver()); | 119 EXPECT_FALSE(context_->resolver()); |
| 179 } | 120 } |
| 180 | 121 |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 syncable::ModelTypePayloadMapFromBitSet( | 281 syncable::ModelTypePayloadMapFromBitSet( |
| 341 ParamsMeaningJustOneEnabledType(), | 282 ParamsMeaningJustOneEnabledType(), |
| 342 std::string()); | 283 std::string()); |
| 343 syncable::ModelTypePayloadMap all_types = | 284 syncable::ModelTypePayloadMap all_types = |
| 344 syncable::ModelTypePayloadMapFromBitSet( | 285 syncable::ModelTypePayloadMapFromBitSet( |
| 345 ParamsMeaningAllEnabledTypes(), | 286 ParamsMeaningAllEnabledTypes(), |
| 346 std::string()); | 287 std::string()); |
| 347 SyncSourceInfo source_one(sync_pb::GetUpdatesCallerInfo::PERIODIC, one_type); | 288 SyncSourceInfo source_one(sync_pb::GetUpdatesCallerInfo::PERIODIC, one_type); |
| 348 SyncSourceInfo source_two(sync_pb::GetUpdatesCallerInfo::LOCAL, all_types); | 289 SyncSourceInfo source_two(sync_pb::GetUpdatesCallerInfo::LOCAL, all_types); |
| 349 | 290 |
| 350 scoped_refptr<ModelSafeWorker> passive_worker( | |
| 351 new FakeModelWorker(GROUP_PASSIVE)); | |
| 352 scoped_refptr<ModelSafeWorker> db_worker(new FakeModelWorker(GROUP_DB)); | 291 scoped_refptr<ModelSafeWorker> db_worker(new FakeModelWorker(GROUP_DB)); |
| 353 scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); | 292 scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); |
| 354 workers_one.push_back(passive_worker); | |
| 355 workers_one.push_back(db_worker); | 293 workers_one.push_back(db_worker); |
| 356 workers_two.push_back(passive_worker); | |
| 357 workers_two.push_back(db_worker); | 294 workers_two.push_back(db_worker); |
| 358 workers_two.push_back(ui_worker); | 295 workers_two.push_back(ui_worker); |
| 359 routes_one[syncable::AUTOFILL] = GROUP_DB; | 296 routes_one[syncable::AUTOFILL] = GROUP_DB; |
| 360 routes_two[syncable::AUTOFILL] = GROUP_DB; | 297 routes_two[syncable::AUTOFILL] = GROUP_DB; |
| 361 routes_two[syncable::BOOKMARKS] = GROUP_UI; | 298 routes_two[syncable::BOOKMARKS] = GROUP_UI; |
| 362 SyncSession one(context_.get(), this, source_one, routes_one, workers_one); | 299 SyncSession one(context_.get(), this, source_one, routes_one, workers_one); |
| 363 SyncSession two(context_.get(), this, source_two, routes_two, workers_two); | 300 SyncSession two(context_.get(), this, source_two, routes_two, workers_two); |
| 364 | 301 |
| 365 std::set<ModelSafeGroup> expected_enabled_groups_one; | |
| 366 expected_enabled_groups_one.insert(GROUP_PASSIVE); | |
| 367 expected_enabled_groups_one.insert(GROUP_DB); | |
| 368 | |
| 369 std::set<ModelSafeGroup> expected_enabled_groups_two; | |
| 370 expected_enabled_groups_two.insert(GROUP_PASSIVE); | |
| 371 expected_enabled_groups_two.insert(GROUP_DB); | |
| 372 expected_enabled_groups_two.insert(GROUP_UI); | |
| 373 | |
| 374 EXPECT_EQ(expected_enabled_groups_one, one.GetEnabledGroups()); | |
| 375 EXPECT_EQ(expected_enabled_groups_two, two.GetEnabledGroups()); | |
| 376 | |
| 377 one.Coalesce(two); | 302 one.Coalesce(two); |
| 378 | 303 |
| 379 EXPECT_EQ(expected_enabled_groups_two, one.GetEnabledGroups()); | |
| 380 EXPECT_EQ(expected_enabled_groups_two, two.GetEnabledGroups()); | |
| 381 | |
| 382 EXPECT_EQ(two.source().updates_source, one.source().updates_source); | 304 EXPECT_EQ(two.source().updates_source, one.source().updates_source); |
| 383 EXPECT_EQ(all_types, one.source().types); | 305 EXPECT_EQ(all_types, one.source().types); |
| 384 std::vector<ModelSafeWorker*>::const_iterator it_db = | 306 std::vector<ModelSafeWorker*>::const_iterator it_db = |
| 385 std::find(one.workers().begin(), one.workers().end(), db_worker); | 307 std::find(one.workers().begin(), one.workers().end(), db_worker); |
| 386 std::vector<ModelSafeWorker*>::const_iterator it_ui = | 308 std::vector<ModelSafeWorker*>::const_iterator it_ui = |
| 387 std::find(one.workers().begin(), one.workers().end(), ui_worker); | 309 std::find(one.workers().begin(), one.workers().end(), ui_worker); |
| 388 EXPECT_NE(it_db, one.workers().end()); | 310 EXPECT_NE(it_db, one.workers().end()); |
| 389 EXPECT_NE(it_ui, one.workers().end()); | 311 EXPECT_NE(it_ui, one.workers().end()); |
| 390 EXPECT_EQ(routes_two, one.routing_info()); | 312 EXPECT_EQ(routes_two, one.routing_info()); |
| 391 } | 313 } |
| 392 | 314 |
| 393 TEST_F(SyncSessionTest, RebaseRoutingInfoWithLatestRemoveOneType) { | 315 TEST_F(SyncSessionTest, RebaseRoutingInfoWithLatestRemoveOneType) { |
| 394 std::vector<ModelSafeWorker*> workers_one, workers_two; | 316 std::vector<ModelSafeWorker*> workers_one, workers_two; |
| 395 ModelSafeRoutingInfo routes_one, routes_two; | 317 ModelSafeRoutingInfo routes_one, routes_two; |
| 396 syncable::ModelTypePayloadMap one_type = | 318 syncable::ModelTypePayloadMap one_type = |
| 397 syncable::ModelTypePayloadMapFromBitSet( | 319 syncable::ModelTypePayloadMapFromBitSet( |
| 398 ParamsMeaningJustOneEnabledType(), | 320 ParamsMeaningJustOneEnabledType(), |
| 399 std::string()); | 321 std::string()); |
| 400 syncable::ModelTypePayloadMap all_types = | 322 syncable::ModelTypePayloadMap all_types = |
| 401 syncable::ModelTypePayloadMapFromBitSet( | 323 syncable::ModelTypePayloadMapFromBitSet( |
| 402 ParamsMeaningAllEnabledTypes(), | 324 ParamsMeaningAllEnabledTypes(), |
| 403 std::string()); | 325 std::string()); |
| 404 SyncSourceInfo source_one(sync_pb::GetUpdatesCallerInfo::PERIODIC, one_type); | 326 SyncSourceInfo source_one(sync_pb::GetUpdatesCallerInfo::PERIODIC, one_type); |
| 405 SyncSourceInfo source_two(sync_pb::GetUpdatesCallerInfo::LOCAL, all_types); | 327 SyncSourceInfo source_two(sync_pb::GetUpdatesCallerInfo::LOCAL, all_types); |
| 406 | 328 |
| 407 scoped_refptr<ModelSafeWorker> passive_worker( | |
| 408 new FakeModelWorker(GROUP_PASSIVE)); | |
| 409 scoped_refptr<ModelSafeWorker> db_worker(new FakeModelWorker(GROUP_DB)); | 329 scoped_refptr<ModelSafeWorker> db_worker(new FakeModelWorker(GROUP_DB)); |
| 410 scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); | 330 scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); |
| 411 workers_one.push_back(passive_worker); | |
| 412 workers_one.push_back(db_worker); | 331 workers_one.push_back(db_worker); |
| 413 workers_two.push_back(passive_worker); | |
| 414 workers_two.push_back(db_worker); | 332 workers_two.push_back(db_worker); |
| 415 workers_two.push_back(ui_worker); | 333 workers_two.push_back(ui_worker); |
| 416 routes_one[syncable::AUTOFILL] = GROUP_DB; | 334 routes_one[syncable::AUTOFILL] = GROUP_DB; |
| 417 routes_two[syncable::AUTOFILL] = GROUP_DB; | 335 routes_two[syncable::AUTOFILL] = GROUP_UI; |
| 418 routes_two[syncable::BOOKMARKS] = GROUP_UI; | 336 routes_two[syncable::BOOKMARKS] = GROUP_UI; |
| 419 SyncSession one(context_.get(), this, source_one, routes_one, workers_one); | 337 SyncSession one(context_.get(), this, source_one, routes_one, workers_one); |
| 420 SyncSession two(context_.get(), this, source_two, routes_two, workers_two); | 338 SyncSession two(context_.get(), this, source_two, routes_two, workers_two); |
| 421 | 339 |
| 422 std::set<ModelSafeGroup> expected_enabled_groups_one; | 340 two.RebaseRoutingInfoWithLatest(&one); |
| 423 expected_enabled_groups_one.insert(GROUP_PASSIVE); | |
| 424 expected_enabled_groups_one.insert(GROUP_DB); | |
| 425 | |
| 426 std::set<ModelSafeGroup> expected_enabled_groups_two; | |
| 427 expected_enabled_groups_two.insert(GROUP_PASSIVE); | |
| 428 expected_enabled_groups_two.insert(GROUP_DB); | |
| 429 expected_enabled_groups_two.insert(GROUP_UI); | |
| 430 | |
| 431 EXPECT_EQ(expected_enabled_groups_one, one.GetEnabledGroups()); | |
| 432 EXPECT_EQ(expected_enabled_groups_two, two.GetEnabledGroups()); | |
| 433 | |
| 434 two.RebaseRoutingInfoWithLatest(one); | |
| 435 | |
| 436 EXPECT_EQ(expected_enabled_groups_one, one.GetEnabledGroups()); | |
| 437 EXPECT_EQ(expected_enabled_groups_one, two.GetEnabledGroups()); | |
| 438 | 341 |
| 439 // Make sure the source has not been touched. | 342 // Make sure the source has not been touched. |
| 440 EXPECT_EQ(two.source().updates_source, | 343 EXPECT_EQ(two.source().updates_source, |
| 441 sync_pb::GetUpdatesCallerInfo::LOCAL); | 344 sync_pb::GetUpdatesCallerInfo::LOCAL); |
| 442 | 345 |
| 443 // Make sure the payload is reduced to one. | 346 // Make sure the payload is reduced to one. |
| 444 EXPECT_EQ(one_type, two.source().types); | 347 EXPECT_EQ(one_type, two.source().types); |
| 445 | 348 |
| 446 // Make sure the workers are udpated. | 349 // Make sure the workers are udpated. |
| 447 std::vector<ModelSafeWorker*>::const_iterator it_db = | 350 std::vector<ModelSafeWorker*>::const_iterator it_db = |
| 448 std::find(two.workers().begin(), two.workers().end(), db_worker); | 351 std::find(two.workers().begin(), two.workers().end(), db_worker); |
| 449 std::vector<ModelSafeWorker*>::const_iterator it_ui = | 352 std::vector<ModelSafeWorker*>::const_iterator it_ui = |
| 450 std::find(two.workers().begin(), two.workers().end(), ui_worker); | 353 std::find(two.workers().begin(), two.workers().end(), ui_worker); |
| 451 EXPECT_NE(it_db, two.workers().end()); | 354 EXPECT_NE(it_db, two.workers().end()); |
| 452 EXPECT_EQ(it_ui, two.workers().end()); | 355 EXPECT_EQ(it_ui, two.workers().end()); |
| 453 EXPECT_EQ(two.workers().size(), 2U); | 356 EXPECT_EQ(two.workers().size(), 1U); |
| 454 | 357 |
| 455 // Make sure the model safe routing info is reduced to one type. | 358 // Make sure the model safe routing info is reduced to one type. |
| 456 ModelSafeRoutingInfo::const_iterator it = | 359 ModelSafeRoutingInfo::const_iterator it = |
| 457 two.routing_info().find(syncable::AUTOFILL); | 360 two.routing_info().find(syncable::AUTOFILL); |
| 458 EXPECT_NE(it, two.routing_info().end()); | 361 EXPECT_NE(it, two.routing_info().end()); |
| 459 EXPECT_EQ(it->second, GROUP_DB); | 362 EXPECT_EQ(it->second, GROUP_DB); |
| 460 EXPECT_EQ(two.routing_info().size(), 1U); | 363 EXPECT_EQ(two.routing_info().size(), 1U); |
| 461 } | 364 } |
| 462 | 365 |
| 463 TEST_F(SyncSessionTest, RebaseRoutingInfoWithLatestWithSameType) { | 366 TEST_F(SyncSessionTest, RebaseRoutingInfoWithLatestWithSameType) { |
| 464 std::vector<ModelSafeWorker*> workers_first, workers_second; | 367 std::vector<ModelSafeWorker*> workers_first, workers_second; |
| 465 ModelSafeRoutingInfo routes_first, routes_second; | 368 ModelSafeRoutingInfo routes_first, routes_second; |
| 466 syncable::ModelTypePayloadMap all_types = | 369 syncable::ModelTypePayloadMap all_types = |
| 467 syncable::ModelTypePayloadMapFromBitSet( | 370 syncable::ModelTypePayloadMapFromBitSet( |
| 468 ParamsMeaningAllEnabledTypes(), | 371 ParamsMeaningAllEnabledTypes(), |
| 469 std::string()); | 372 std::string()); |
| 470 SyncSourceInfo source_first(sync_pb::GetUpdatesCallerInfo::PERIODIC, | 373 SyncSourceInfo source_first(sync_pb::GetUpdatesCallerInfo::PERIODIC, |
| 471 all_types); | 374 all_types); |
| 472 SyncSourceInfo source_second(sync_pb::GetUpdatesCallerInfo::LOCAL, | 375 SyncSourceInfo source_second(sync_pb::GetUpdatesCallerInfo::LOCAL, |
| 473 all_types); | 376 all_types); |
| 474 | 377 |
| 475 scoped_refptr<ModelSafeWorker> passive_worker( | |
| 476 new FakeModelWorker(GROUP_PASSIVE)); | |
| 477 scoped_refptr<FakeModelWorker> db_worker(new FakeModelWorker(GROUP_DB)); | 378 scoped_refptr<FakeModelWorker> db_worker(new FakeModelWorker(GROUP_DB)); |
| 478 scoped_refptr<FakeModelWorker> ui_worker(new FakeModelWorker(GROUP_UI)); | 379 scoped_refptr<FakeModelWorker> ui_worker(new FakeModelWorker(GROUP_UI)); |
| 479 workers_first.push_back(passive_worker); | |
| 480 workers_first.push_back(db_worker); | 380 workers_first.push_back(db_worker); |
| 481 workers_first.push_back(ui_worker); | 381 workers_first.push_back(ui_worker); |
| 482 workers_second.push_back(passive_worker); | |
| 483 workers_second.push_back(db_worker); | 382 workers_second.push_back(db_worker); |
| 484 workers_second.push_back(ui_worker); | 383 workers_second.push_back(ui_worker); |
| 485 routes_first[syncable::AUTOFILL] = GROUP_DB; | 384 routes_first[syncable::AUTOFILL] = GROUP_DB; |
| 486 routes_first[syncable::BOOKMARKS] = GROUP_UI; | 385 routes_first[syncable::BOOKMARKS] = GROUP_UI; |
| 487 routes_second[syncable::AUTOFILL] = GROUP_DB; | 386 routes_second[syncable::AUTOFILL] = GROUP_DB; |
| 488 routes_second[syncable::BOOKMARKS] = GROUP_UI; | 387 routes_second[syncable::BOOKMARKS] = GROUP_UI; |
| 489 SyncSession first(context_.get(), this, source_first, routes_first, | 388 SyncSession first(context_.get(), this, source_first, routes_first, |
| 490 workers_first); | 389 workers_first); |
| 491 SyncSession second(context_.get(), this, source_second, routes_second, | 390 SyncSession second(context_.get(), this, source_second, routes_second, |
| 492 workers_second); | 391 workers_second); |
| 493 | 392 |
| 494 std::set<ModelSafeGroup> expected_enabled_groups; | 393 second.RebaseRoutingInfoWithLatest(&first); |
| 495 expected_enabled_groups.insert(GROUP_PASSIVE); | |
| 496 expected_enabled_groups.insert(GROUP_DB); | |
| 497 expected_enabled_groups.insert(GROUP_UI); | |
| 498 | |
| 499 EXPECT_EQ(expected_enabled_groups, first.GetEnabledGroups()); | |
| 500 EXPECT_EQ(expected_enabled_groups, second.GetEnabledGroups()); | |
| 501 | |
| 502 second.RebaseRoutingInfoWithLatest(first); | |
| 503 | |
| 504 EXPECT_EQ(expected_enabled_groups, first.GetEnabledGroups()); | |
| 505 EXPECT_EQ(expected_enabled_groups, second.GetEnabledGroups()); | |
| 506 | 394 |
| 507 // Make sure the source has not been touched. | 395 // Make sure the source has not been touched. |
| 508 EXPECT_EQ(second.source().updates_source, | 396 EXPECT_EQ(second.source().updates_source, |
| 509 sync_pb::GetUpdatesCallerInfo::LOCAL); | 397 sync_pb::GetUpdatesCallerInfo::LOCAL); |
| 510 | 398 |
| 511 // Make sure our payload is still the same. | 399 // Make sure our payload is still the same. |
| 512 EXPECT_EQ(all_types, second.source().types); | 400 EXPECT_EQ(all_types, second.source().types); |
| 513 | 401 |
| 514 // Make sure the workers are still the same. | 402 // Make sure the workers are still the same. |
| 515 std::vector<ModelSafeWorker*>::const_iterator it_passive = | |
| 516 std::find(second.workers().begin(), second.workers().end(), | |
| 517 passive_worker); | |
| 518 std::vector<ModelSafeWorker*>::const_iterator it_db = | 403 std::vector<ModelSafeWorker*>::const_iterator it_db = |
| 519 std::find(second.workers().begin(), second.workers().end(), db_worker); | 404 std::find(second.workers().begin(), second.workers().end(), db_worker); |
| 520 std::vector<ModelSafeWorker*>::const_iterator it_ui = | 405 std::vector<ModelSafeWorker*>::const_iterator it_ui = |
| 521 std::find(second.workers().begin(), second.workers().end(), ui_worker); | 406 std::find(second.workers().begin(), second.workers().end(), ui_worker); |
| 522 EXPECT_NE(it_passive, second.workers().end()); | |
| 523 EXPECT_NE(it_db, second.workers().end()); | 407 EXPECT_NE(it_db, second.workers().end()); |
| 524 EXPECT_NE(it_ui, second.workers().end()); | 408 EXPECT_NE(it_ui, second.workers().end()); |
| 525 EXPECT_EQ(second.workers().size(), 3U); | 409 EXPECT_EQ(second.workers().size(), 2U); |
| 526 | 410 |
| 527 // Make sure the model safe routing info is reduced to first type. | 411 // Make sure the model safe routing info is reduced to first type. |
| 528 ModelSafeRoutingInfo::const_iterator it1 = | 412 ModelSafeRoutingInfo::const_iterator it1 = |
| 529 second.routing_info().find(syncable::AUTOFILL); | 413 second.routing_info().find(syncable::AUTOFILL); |
| 530 ModelSafeRoutingInfo::const_iterator it2 = | 414 ModelSafeRoutingInfo::const_iterator it2 = |
| 531 second.routing_info().find(syncable::BOOKMARKS); | 415 second.routing_info().find(syncable::BOOKMARKS); |
| 532 | 416 |
| 533 EXPECT_NE(it1, second.routing_info().end()); | 417 EXPECT_NE(it1, second.routing_info().end()); |
| 534 EXPECT_EQ(it1->second, GROUP_DB); | 418 EXPECT_EQ(it1->second, GROUP_DB); |
| 535 | 419 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 EXPECT_EQ(empty_payload, original[syncable::BOOKMARKS]); | 478 EXPECT_EQ(empty_payload, original[syncable::BOOKMARKS]); |
| 595 EXPECT_EQ(payload1, original[syncable::PASSWORDS]); | 479 EXPECT_EQ(payload1, original[syncable::PASSWORDS]); |
| 596 EXPECT_EQ(payload1, original[syncable::AUTOFILL]); | 480 EXPECT_EQ(payload1, original[syncable::AUTOFILL]); |
| 597 EXPECT_EQ(payload2, original[syncable::SESSIONS]); | 481 EXPECT_EQ(payload2, original[syncable::SESSIONS]); |
| 598 EXPECT_EQ(payload3, original[syncable::THEMES]); | 482 EXPECT_EQ(payload3, original[syncable::THEMES]); |
| 599 } | 483 } |
| 600 | 484 |
| 601 } // namespace | 485 } // namespace |
| 602 } // namespace sessions | 486 } // namespace sessions |
| 603 } // namespace browser_sync | 487 } // namespace browser_sync |
| OLD | NEW |