| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "components/sync/driver/glue/sync_backend_registrar.h" | 5 #include "components/sync/driver/glue/sync_backend_registrar.h" |
| 6 | 6 |
| 7 #include <tuple> |
| 8 |
| 7 #include "base/location.h" | 9 #include "base/location.h" |
| 8 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| 9 #include "base/single_thread_task_runner.h" | 11 #include "base/single_thread_task_runner.h" |
| 10 #include "components/sync/base/model_type.h" | 12 #include "components/sync/base/model_type.h" |
| 11 #include "components/sync/core/test/test_user_share.h" | 13 #include "components/sync/core/test/test_user_share.h" |
| 12 #include "components/sync/driver/change_processor_mock.h" | 14 #include "components/sync/driver/change_processor_mock.h" |
| 13 #include "components/sync/driver/fake_sync_client.h" | 15 #include "components/sync/driver/fake_sync_client.h" |
| 14 #include "components/sync/driver/glue/browser_thread_model_worker.h" | 16 #include "components/sync/driver/glue/browser_thread_model_worker.h" |
| 15 #include "components/sync/driver/sync_api_component_factory_mock.h" | 17 #include "components/sync/driver/sync_api_component_factory_mock.h" |
| 16 #include "components/sync/engine/passive_model_worker.h" | 18 #include "components/sync/engine/passive_model_worker.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 21 |
| 20 namespace browser_sync { | 22 namespace browser_sync { |
| 21 | 23 |
| 22 namespace { | 24 namespace { |
| 23 | 25 |
| 24 using ::testing::_; | 26 using ::testing::_; |
| 25 using ::testing::InSequence; | 27 using ::testing::InSequence; |
| 26 using ::testing::Return; | 28 using ::testing::Return; |
| 27 using ::testing::StrictMock; | 29 using ::testing::StrictMock; |
| 28 using syncer::FIRST_REAL_MODEL_TYPE; | 30 using syncer::FIRST_REAL_MODEL_TYPE; |
| 29 using syncer::AUTOFILL; | 31 using syncer::AUTOFILL; |
| 30 using syncer::BOOKMARKS; | 32 using syncer::BOOKMARKS; |
| 31 using syncer::PREFERENCES; | 33 using syncer::PREFERENCES; |
| 32 using syncer::THEMES; | 34 using syncer::THEMES; |
| 33 using syncer::NIGORI; | 35 using syncer::NIGORI; |
| 34 using syncer::PASSWORDS; | 36 using syncer::PASSWORDS; |
| 35 using syncer::MODEL_TYPE_COUNT; | 37 using syncer::MODEL_TYPE_COUNT; |
| 38 using syncer::ModelSafeGroup; |
| 36 using syncer::ModelTypeSet; | 39 using syncer::ModelTypeSet; |
| 37 using syncer::ModelType; | 40 using syncer::ModelType; |
| 38 using syncer::ModelTypeFromInt; | 41 using syncer::ModelTypeFromInt; |
| 39 | 42 |
| 40 void TriggerChanges(SyncBackendRegistrar* registrar, ModelType type) { | 43 void TriggerChanges(SyncBackendRegistrar* registrar, ModelType type) { |
| 41 registrar->OnChangesApplied(type, 0, NULL, | 44 registrar->OnChangesApplied(type, 0, NULL, |
| 42 syncer::ImmutableChangeRecordList()); | 45 syncer::ImmutableChangeRecordList()); |
| 43 registrar->OnChangesComplete(type); | 46 registrar->OnChangesComplete(type); |
| 44 } | 47 } |
| 45 | 48 |
| 46 class RegistrarSyncClient : public sync_driver::FakeSyncClient { | 49 class RegistrarSyncClient : public sync_driver::FakeSyncClient { |
| 47 public: | 50 public: |
| 48 RegistrarSyncClient( | 51 RegistrarSyncClient( |
| 49 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner, | 52 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner, |
| 50 const scoped_refptr<base::SingleThreadTaskRunner>& db_task_runner, | 53 const scoped_refptr<base::SingleThreadTaskRunner>& db_task_runner, |
| 51 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) | 54 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) |
| 52 : ui_task_runner_(ui_task_runner), | 55 : ui_task_runner_(ui_task_runner), |
| 53 db_task_runner_(db_task_runner), | 56 db_task_runner_(db_task_runner), |
| 54 file_task_runner_(file_task_runner) {} | 57 file_task_runner_(file_task_runner) {} |
| 55 | 58 |
| 56 scoped_refptr<syncer::ModelSafeWorker> CreateModelWorkerForGroup( | 59 scoped_refptr<syncer::ModelSafeWorker> CreateModelWorkerForGroup( |
| 57 syncer::ModelSafeGroup group, | 60 ModelSafeGroup group, |
| 58 syncer::WorkerLoopDestructionObserver* observer) override { | 61 syncer::WorkerLoopDestructionObserver* observer) override { |
| 59 switch (group) { | 62 switch (group) { |
| 60 case syncer::GROUP_UI: | 63 case syncer::GROUP_UI: |
| 61 return new BrowserThreadModelWorker(ui_task_runner_, group, observer); | 64 return new BrowserThreadModelWorker(ui_task_runner_, group, observer); |
| 62 case syncer::GROUP_DB: | 65 case syncer::GROUP_DB: |
| 63 return new BrowserThreadModelWorker(db_task_runner_, group, observer); | 66 return new BrowserThreadModelWorker(db_task_runner_, group, observer); |
| 64 case syncer::GROUP_FILE: | 67 case syncer::GROUP_FILE: |
| 65 return new BrowserThreadModelWorker(file_task_runner_, group, observer); | 68 return new BrowserThreadModelWorker(file_task_runner_, group, observer); |
| 66 case syncer::GROUP_PASSIVE: | 69 case syncer::GROUP_PASSIVE: |
| 67 return new syncer::PassiveModelWorker(observer); | 70 return new syncer::PassiveModelWorker(observer); |
| 68 default: | 71 default: |
| 69 return nullptr; | 72 return nullptr; |
| 70 } | 73 } |
| 71 } | 74 } |
| 72 | 75 |
| 73 private: | 76 private: |
| 74 const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; | 77 const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; |
| 75 const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner_; | 78 const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner_; |
| 76 const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; | 79 const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; |
| 77 }; | 80 }; |
| 78 | 81 |
| 79 // Flaky: https://crbug.com/498238 | 82 // Flaky: https://crbug.com/498238 |
| 80 class SyncBackendRegistrarTest : public testing::Test { | 83 class SyncBackendRegistrarTest : public testing::Test { |
| 81 public: | 84 public: |
| 82 void TestNonUIDataTypeActivationAsync(sync_driver::ChangeProcessor* processor, | 85 void TestNonUIDataTypeActivationAsync(sync_driver::ChangeProcessor* processor, |
| 83 base::WaitableEvent* done) { | 86 base::WaitableEvent* done) { |
| 84 registrar_->ActivateDataType(AUTOFILL, syncer::GROUP_DB, processor, | 87 registrar_->ActivateDataType(AUTOFILL, syncer::GROUP_DB, processor, |
| 85 test_user_share_.user_share()); | 88 test_user_share_.user_share()); |
| 86 syncer::ModelSafeRoutingInfo expected_routing_info; | 89 ExpectRoutingInfo(registrar_.get(), {{AUTOFILL, syncer::GROUP_DB}}); |
| 87 expected_routing_info[AUTOFILL] = syncer::GROUP_DB; | |
| 88 ExpectRoutingInfo(registrar_.get(), expected_routing_info); | |
| 89 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet(AUTOFILL)); | 90 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet(AUTOFILL)); |
| 90 TriggerChanges(registrar_.get(), AUTOFILL); | 91 TriggerChanges(registrar_.get(), AUTOFILL); |
| 91 done->Signal(); | 92 done->Signal(); |
| 92 } | 93 } |
| 93 | 94 |
| 94 protected: | 95 protected: |
| 95 SyncBackendRegistrarTest() | 96 SyncBackendRegistrarTest() |
| 96 : db_thread_("DBThreadForTest"), | 97 : db_thread_("DBThreadForTest"), |
| 97 file_thread_("FileThreadForTest"), | 98 file_thread_("FileThreadForTest"), |
| 98 sync_thread_(NULL) {} | 99 sync_thread_(NULL) {} |
| (...skipping 18 matching lines...) Expand all Loading... |
| 117 sync_thread_->task_runner()->PostTask( | 118 sync_thread_->task_runner()->PostTask( |
| 118 FROM_HERE, base::Bind(&SyncBackendRegistrar::Shutdown, | 119 FROM_HERE, base::Bind(&SyncBackendRegistrar::Shutdown, |
| 119 base::Unretained(registrar_.release()))); | 120 base::Unretained(registrar_.release()))); |
| 120 sync_thread_->WaitUntilThreadStarted(); | 121 sync_thread_->WaitUntilThreadStarted(); |
| 121 base::RunLoop().RunUntilIdle(); | 122 base::RunLoop().RunUntilIdle(); |
| 122 } | 123 } |
| 123 | 124 |
| 124 void ExpectRoutingInfo( | 125 void ExpectRoutingInfo( |
| 125 SyncBackendRegistrar* registrar, | 126 SyncBackendRegistrar* registrar, |
| 126 const syncer::ModelSafeRoutingInfo& expected_routing_info) { | 127 const syncer::ModelSafeRoutingInfo& expected_routing_info) { |
| 127 syncer::ModelSafeRoutingInfo routing_info; | 128 syncer::ModelSafeRoutingInfo actual_routing_info; |
| 128 registrar->GetModelSafeRoutingInfo(&routing_info); | 129 registrar->GetModelSafeRoutingInfo(&actual_routing_info); |
| 129 EXPECT_EQ(expected_routing_info, routing_info); | 130 EXPECT_EQ(expected_routing_info, actual_routing_info); |
| 131 } |
| 132 |
| 133 void ExpectRoutingInfo( |
| 134 SyncBackendRegistrar* registrar, |
| 135 std::vector<std::tuple<ModelType, ModelSafeGroup>> expectations) { |
| 136 syncer::ModelSafeRoutingInfo expected_routing_info; |
| 137 for (auto tuple : expectations) { |
| 138 expected_routing_info[std::get<0>(tuple)] = std::get<1>(tuple); |
| 139 } |
| 140 ExpectRoutingInfo(registrar, expected_routing_info); |
| 130 } | 141 } |
| 131 | 142 |
| 132 void ExpectHasProcessorsForTypes(const SyncBackendRegistrar& registrar, | 143 void ExpectHasProcessorsForTypes(const SyncBackendRegistrar& registrar, |
| 133 ModelTypeSet types) { | 144 ModelTypeSet types) { |
| 134 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { | 145 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { |
| 135 ModelType model_type = ModelTypeFromInt(i); | 146 ModelType model_type = ModelTypeFromInt(i); |
| 136 EXPECT_EQ(types.Has(model_type), | 147 EXPECT_EQ(types.Has(model_type), |
| 137 registrar_->IsTypeActivatedForTest(model_type)); | 148 registrar_->IsTypeActivatedForTest(model_type)); |
| 138 } | 149 } |
| 139 } | 150 } |
| 140 | 151 |
| 152 size_t GetWorkersSize() { |
| 153 std::vector<scoped_refptr<syncer::ModelSafeWorker>> workers; |
| 154 registrar_->GetWorkers(&workers); |
| 155 return workers.size(); |
| 156 } |
| 157 |
| 141 const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() { | 158 const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() { |
| 142 return message_loop_.task_runner(); | 159 return message_loop_.task_runner(); |
| 143 } | 160 } |
| 144 | 161 |
| 145 const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner() { | 162 const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner() { |
| 146 return db_thread_.task_runner(); | 163 return db_thread_.task_runner(); |
| 147 } | 164 } |
| 148 | 165 |
| 149 const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner() { | 166 const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner() { |
| 150 return db_thread_.task_runner(); | 167 return db_thread_.task_runner(); |
| 151 } | 168 } |
| 152 | 169 |
| 153 base::MessageLoop message_loop_; | 170 base::MessageLoop message_loop_; |
| 154 base::Thread db_thread_; | 171 base::Thread db_thread_; |
| 155 base::Thread file_thread_; | 172 base::Thread file_thread_; |
| 156 | 173 |
| 157 syncer::TestUserShare test_user_share_; | 174 syncer::TestUserShare test_user_share_; |
| 158 std::unique_ptr<RegistrarSyncClient> sync_client_; | 175 std::unique_ptr<RegistrarSyncClient> sync_client_; |
| 159 std::unique_ptr<SyncBackendRegistrar> registrar_; | 176 std::unique_ptr<SyncBackendRegistrar> registrar_; |
| 160 | 177 |
| 161 base::Thread* sync_thread_; | 178 base::Thread* sync_thread_; |
| 162 }; | 179 }; |
| 163 | 180 |
| 164 TEST_F(SyncBackendRegistrarTest, ConstructorEmpty) { | 181 TEST_F(SyncBackendRegistrarTest, ConstructorEmpty) { |
| 165 registrar_->SetInitialTypes(ModelTypeSet()); | 182 registrar_->SetInitialTypes(ModelTypeSet()); |
| 166 EXPECT_FALSE(registrar_->IsNigoriEnabled()); | 183 EXPECT_FALSE(registrar_->IsNigoriEnabled()); |
| 167 { | 184 EXPECT_EQ(4u, GetWorkersSize()); |
| 168 std::vector<scoped_refptr<syncer::ModelSafeWorker>> workers; | |
| 169 registrar_->GetWorkers(&workers); | |
| 170 EXPECT_EQ(4u, workers.size()); | |
| 171 } | |
| 172 ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo()); | 185 ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo()); |
| 173 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 186 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); |
| 174 } | 187 } |
| 175 | 188 |
| 176 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmpty) { | 189 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmpty) { |
| 177 const ModelTypeSet initial_types(BOOKMARKS, NIGORI, PASSWORDS); | |
| 178 registrar_->RegisterNonBlockingType(BOOKMARKS); | 190 registrar_->RegisterNonBlockingType(BOOKMARKS); |
| 179 registrar_->SetInitialTypes(initial_types); | 191 registrar_->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS)); |
| 180 EXPECT_TRUE(registrar_->IsNigoriEnabled()); | 192 EXPECT_TRUE(registrar_->IsNigoriEnabled()); |
| 181 { | 193 EXPECT_EQ(4u, GetWorkersSize()); |
| 182 std::vector<scoped_refptr<syncer::ModelSafeWorker>> workers; | 194 EXPECT_EQ(ModelTypeSet(NIGORI), registrar_->GetLastConfiguredTypes()); |
| 183 registrar_->GetWorkers(&workers); | 195 // Bookmarks dropped because it is nonblocking. |
| 184 EXPECT_EQ(4u, workers.size()); | 196 // Passwords dropped because of no password store. |
| 185 } | 197 ExpectRoutingInfo(registrar_.get(), {{NIGORI, syncer::GROUP_PASSIVE}}); |
| 186 { | |
| 187 syncer::ModelSafeRoutingInfo expected_routing_info; | |
| 188 expected_routing_info[BOOKMARKS] = syncer::GROUP_NON_BLOCKING; | |
| 189 expected_routing_info[NIGORI] = syncer::GROUP_PASSIVE; | |
| 190 // Passwords dropped because of no password store. | |
| 191 ExpectRoutingInfo(registrar_.get(), expected_routing_info); | |
| 192 } | |
| 193 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 198 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); |
| 194 } | 199 } |
| 195 | 200 |
| 201 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmptyReversedInitialization) { |
| 202 // The blocking types get to set initial types before NonBlocking types here. |
| 203 registrar_->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS)); |
| 204 registrar_->RegisterNonBlockingType(BOOKMARKS); |
| 205 EXPECT_TRUE(registrar_->IsNigoriEnabled()); |
| 206 EXPECT_EQ(4u, GetWorkersSize()); |
| 207 EXPECT_EQ(ModelTypeSet(NIGORI), registrar_->GetLastConfiguredTypes()); |
| 208 // Bookmarks dropped because it is nonblocking. |
| 209 // Passwords dropped because of no password store. |
| 210 ExpectRoutingInfo(registrar_.get(), {{NIGORI, syncer::GROUP_PASSIVE}}); |
| 211 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); |
| 212 } |
| 213 |
| 196 TEST_F(SyncBackendRegistrarTest, ConfigureDataTypes) { | 214 TEST_F(SyncBackendRegistrarTest, ConfigureDataTypes) { |
| 197 registrar_->RegisterNonBlockingType(BOOKMARKS); | 215 registrar_->RegisterNonBlockingType(BOOKMARKS); |
| 198 registrar_->SetInitialTypes(ModelTypeSet()); | 216 registrar_->SetInitialTypes(ModelTypeSet()); |
| 199 | 217 |
| 200 // Add. | 218 // Add. |
| 201 const ModelTypeSet types1(BOOKMARKS, NIGORI, AUTOFILL); | 219 const ModelTypeSet types1(BOOKMARKS, NIGORI, AUTOFILL); |
| 202 EXPECT_EQ(types1, registrar_->ConfigureDataTypes(types1, ModelTypeSet())); | 220 EXPECT_EQ(types1, registrar_->ConfigureDataTypes(types1, ModelTypeSet())); |
| 203 { | 221 ExpectRoutingInfo(registrar_.get(), {{BOOKMARKS, syncer::GROUP_NON_BLOCKING}, |
| 204 syncer::ModelSafeRoutingInfo expected_routing_info; | 222 {NIGORI, syncer::GROUP_PASSIVE}, |
| 205 expected_routing_info[BOOKMARKS] = syncer::GROUP_NON_BLOCKING; | 223 {AUTOFILL, syncer::GROUP_PASSIVE}}); |
| 206 expected_routing_info[NIGORI] = syncer::GROUP_PASSIVE; | |
| 207 expected_routing_info[AUTOFILL] = syncer::GROUP_PASSIVE; | |
| 208 ExpectRoutingInfo(registrar_.get(), expected_routing_info); | |
| 209 } | |
| 210 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 224 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); |
| 211 EXPECT_EQ(types1, registrar_->GetLastConfiguredTypes()); | 225 EXPECT_EQ(types1, registrar_->GetLastConfiguredTypes()); |
| 212 | 226 |
| 213 // Add and remove. | 227 // Add and remove. |
| 214 const ModelTypeSet types2(PREFERENCES, THEMES); | 228 const ModelTypeSet types2(PREFERENCES, THEMES); |
| 215 EXPECT_EQ(types2, registrar_->ConfigureDataTypes(types2, types1)); | 229 EXPECT_EQ(types2, registrar_->ConfigureDataTypes(types2, types1)); |
| 216 { | 230 |
| 217 syncer::ModelSafeRoutingInfo expected_routing_info; | 231 ExpectRoutingInfo(registrar_.get(), {{PREFERENCES, syncer::GROUP_PASSIVE}, |
| 218 expected_routing_info[PREFERENCES] = syncer::GROUP_PASSIVE; | 232 {THEMES, syncer::GROUP_PASSIVE}}); |
| 219 expected_routing_info[THEMES] = syncer::GROUP_PASSIVE; | |
| 220 ExpectRoutingInfo(registrar_.get(), expected_routing_info); | |
| 221 } | |
| 222 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 233 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); |
| 223 EXPECT_EQ(types2, registrar_->GetLastConfiguredTypes()); | 234 EXPECT_EQ(types2, registrar_->GetLastConfiguredTypes()); |
| 224 | 235 |
| 225 // Remove. | 236 // Remove. |
| 226 EXPECT_TRUE(registrar_->ConfigureDataTypes(ModelTypeSet(), types2).Empty()); | 237 EXPECT_TRUE(registrar_->ConfigureDataTypes(ModelTypeSet(), types2).Empty()); |
| 227 ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo()); | 238 ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo()); |
| 228 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 239 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); |
| 229 EXPECT_EQ(ModelTypeSet(), registrar_->GetLastConfiguredTypes()); | 240 EXPECT_EQ(ModelTypeSet(), registrar_->GetLastConfiguredTypes()); |
| 230 } | 241 } |
| 231 | 242 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 242 EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(NULL, _, _)); | 253 EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(NULL, _, _)); |
| 243 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); | 254 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); |
| 244 EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); | 255 EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); |
| 245 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); | 256 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); |
| 246 | 257 |
| 247 const ModelTypeSet types(BOOKMARKS); | 258 const ModelTypeSet types(BOOKMARKS); |
| 248 EXPECT_EQ(types, registrar_->ConfigureDataTypes(types, ModelTypeSet())); | 259 EXPECT_EQ(types, registrar_->ConfigureDataTypes(types, ModelTypeSet())); |
| 249 registrar_->ActivateDataType(BOOKMARKS, syncer::GROUP_UI, | 260 registrar_->ActivateDataType(BOOKMARKS, syncer::GROUP_UI, |
| 250 &change_processor_mock, | 261 &change_processor_mock, |
| 251 test_user_share_.user_share()); | 262 test_user_share_.user_share()); |
| 252 { | 263 ExpectRoutingInfo(registrar_.get(), {{BOOKMARKS, syncer::GROUP_UI}}); |
| 253 syncer::ModelSafeRoutingInfo expected_routing_info; | |
| 254 expected_routing_info[BOOKMARKS] = syncer::GROUP_UI; | |
| 255 ExpectRoutingInfo(registrar_.get(), expected_routing_info); | |
| 256 } | |
| 257 ExpectHasProcessorsForTypes(*registrar_, types); | 264 ExpectHasProcessorsForTypes(*registrar_, types); |
| 258 | 265 |
| 259 TriggerChanges(registrar_.get(), BOOKMARKS); | 266 TriggerChanges(registrar_.get(), BOOKMARKS); |
| 260 | 267 |
| 261 registrar_->DeactivateDataType(BOOKMARKS); | 268 registrar_->DeactivateDataType(BOOKMARKS); |
| 262 ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo()); | 269 ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo()); |
| 263 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 270 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); |
| 264 | 271 |
| 265 // Should do nothing. | 272 // Should do nothing. |
| 266 TriggerChanges(registrar_.get(), BOOKMARKS); | 273 TriggerChanges(registrar_.get(), BOOKMARKS); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 // handled correctly in SyncBackendRegistrar. | 311 // handled correctly in SyncBackendRegistrar. |
| 305 TEST_F(SyncBackendRegistrarTest, ConfigureNonBlockingDataType) { | 312 TEST_F(SyncBackendRegistrarTest, ConfigureNonBlockingDataType) { |
| 306 registrar_->RegisterNonBlockingType(AUTOFILL); | 313 registrar_->RegisterNonBlockingType(AUTOFILL); |
| 307 registrar_->RegisterNonBlockingType(BOOKMARKS); | 314 registrar_->RegisterNonBlockingType(BOOKMARKS); |
| 308 | 315 |
| 309 ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo()); | 316 ExpectRoutingInfo(registrar_.get(), syncer::ModelSafeRoutingInfo()); |
| 310 // Simulate that initial sync was already done for AUTOFILL. | 317 // Simulate that initial sync was already done for AUTOFILL. |
| 311 registrar_->AddRestoredNonBlockingType(AUTOFILL); | 318 registrar_->AddRestoredNonBlockingType(AUTOFILL); |
| 312 // It should be added to routing info and set of configured types. | 319 // It should be added to routing info and set of configured types. |
| 313 EXPECT_EQ(ModelTypeSet(AUTOFILL), registrar_->GetLastConfiguredTypes()); | 320 EXPECT_EQ(ModelTypeSet(AUTOFILL), registrar_->GetLastConfiguredTypes()); |
| 314 { | 321 ExpectRoutingInfo(registrar_.get(), {{AUTOFILL, syncer::GROUP_NON_BLOCKING}}); |
| 315 syncer::ModelSafeRoutingInfo expected_routing_info; | |
| 316 expected_routing_info[AUTOFILL] = syncer::GROUP_NON_BLOCKING; | |
| 317 ExpectRoutingInfo(registrar_.get(), expected_routing_info); | |
| 318 } | |
| 319 | 322 |
| 320 // Configure two non-blocking types. Initial sync wasn't done for BOOKMARKS so | 323 // Configure two non-blocking types. Initial sync wasn't done for BOOKMARKS so |
| 321 // it should be included in types to be downloaded. | 324 // it should be included in types to be downloaded. |
| 322 ModelTypeSet types_to_add(AUTOFILL, BOOKMARKS); | 325 ModelTypeSet types_to_add(AUTOFILL, BOOKMARKS); |
| 323 ModelTypeSet newly_added_types = | 326 ModelTypeSet newly_added_types = |
| 324 registrar_->ConfigureDataTypes(types_to_add, ModelTypeSet()); | 327 registrar_->ConfigureDataTypes(types_to_add, ModelTypeSet()); |
| 325 EXPECT_EQ(ModelTypeSet(BOOKMARKS), newly_added_types); | 328 EXPECT_EQ(ModelTypeSet(BOOKMARKS), newly_added_types); |
| 326 EXPECT_EQ(types_to_add, registrar_->GetLastConfiguredTypes()); | 329 EXPECT_EQ(types_to_add, registrar_->GetLastConfiguredTypes()); |
| 327 { | 330 ExpectRoutingInfo(registrar_.get(), |
| 328 syncer::ModelSafeRoutingInfo expected_routing_info; | 331 {{AUTOFILL, syncer::GROUP_NON_BLOCKING}, |
| 329 expected_routing_info[AUTOFILL] = syncer::GROUP_NON_BLOCKING; | 332 {BOOKMARKS, syncer::GROUP_NON_BLOCKING}}); |
| 330 expected_routing_info[BOOKMARKS] = syncer::GROUP_NON_BLOCKING; | |
| 331 ExpectRoutingInfo(registrar_.get(), expected_routing_info); | |
| 332 } | |
| 333 } | 333 } |
| 334 | 334 |
| 335 class SyncBackendRegistrarShutdownTest : public testing::Test { | 335 class SyncBackendRegistrarShutdownTest : public testing::Test { |
| 336 public: | 336 public: |
| 337 void BlockDBThread() { | 337 void BlockDBThread() { |
| 338 EXPECT_FALSE(db_thread_lock_.Try()); | 338 EXPECT_FALSE(db_thread_lock_.Try()); |
| 339 | 339 |
| 340 db_thread_blocked_.Signal(); | 340 db_thread_blocked_.Signal(); |
| 341 base::AutoLock l(db_thread_lock_); | 341 base::AutoLock l(db_thread_lock_); |
| 342 } | 342 } |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 db_thread_lock_.Release(); | 452 db_thread_lock_.Release(); |
| 453 | 453 |
| 454 // Run the main thread loop until all workers have been removed and the | 454 // Run the main thread loop until all workers have been removed and the |
| 455 // registrar destroyed. | 455 // registrar destroyed. |
| 456 run_loop_.Run(); | 456 run_loop_.Run(); |
| 457 } | 457 } |
| 458 | 458 |
| 459 } // namespace | 459 } // namespace |
| 460 | 460 |
| 461 } // namespace browser_sync | 461 } // namespace browser_sync |
| OLD | NEW |