| 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 <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 13 #include "base/threading/thread.h" | 13 #include "base/threading/thread.h" |
| 14 #include "components/sync/driver/change_processor_mock.h" | 14 #include "components/sync/driver/change_processor_mock.h" |
| 15 #include "components/sync/driver/fake_sync_client.h" | |
| 16 #include "components/sync/driver/glue/browser_thread_model_worker.h" | 15 #include "components/sync/driver/glue/browser_thread_model_worker.h" |
| 17 #include "components/sync/driver/sync_api_component_factory_mock.h" | |
| 18 #include "components/sync/engine/passive_model_worker.h" | 16 #include "components/sync/engine/passive_model_worker.h" |
| 19 #include "components/sync/syncable/test_user_share.h" | 17 #include "components/sync/syncable/test_user_share.h" |
| 20 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 20 |
| 23 namespace syncer { | 21 namespace syncer { |
| 24 | 22 |
| 25 namespace { | 23 namespace { |
| 26 | 24 |
| 27 using ::testing::_; | 25 using ::testing::_; |
| 28 using ::testing::InSequence; | 26 using ::testing::InSequence; |
| 29 using ::testing::Return; | 27 using ::testing::Return; |
| 30 using ::testing::StrictMock; | 28 using ::testing::StrictMock; |
| 31 | 29 |
| 32 void TriggerChanges(SyncBackendRegistrar* registrar, ModelType type) { | |
| 33 registrar->OnChangesApplied(type, 0, nullptr, ImmutableChangeRecordList()); | |
| 34 registrar->OnChangesComplete(type); | |
| 35 } | |
| 36 | |
| 37 class RegistrarSyncClient : public FakeSyncClient { | |
| 38 public: | |
| 39 RegistrarSyncClient( | |
| 40 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner, | |
| 41 const scoped_refptr<base::SingleThreadTaskRunner>& db_task_runner, | |
| 42 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) | |
| 43 : ui_task_runner_(ui_task_runner), | |
| 44 db_task_runner_(db_task_runner), | |
| 45 file_task_runner_(file_task_runner) {} | |
| 46 | |
| 47 scoped_refptr<ModelSafeWorker> CreateModelWorkerForGroup( | |
| 48 ModelSafeGroup group) override { | |
| 49 switch (group) { | |
| 50 case GROUP_UI: | |
| 51 return new BrowserThreadModelWorker(ui_task_runner_, group); | |
| 52 case GROUP_DB: | |
| 53 return new BrowserThreadModelWorker(db_task_runner_, group); | |
| 54 case GROUP_FILE: | |
| 55 return new BrowserThreadModelWorker(file_task_runner_, group); | |
| 56 case GROUP_PASSIVE: | |
| 57 return new PassiveModelWorker(); | |
| 58 default: | |
| 59 return nullptr; | |
| 60 } | |
| 61 } | |
| 62 | |
| 63 private: | |
| 64 const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; | |
| 65 const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner_; | |
| 66 const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; | |
| 67 }; | |
| 68 | |
| 69 // Flaky: https://crbug.com/498238 | |
| 70 class SyncBackendRegistrarTest : public testing::Test { | 30 class SyncBackendRegistrarTest : public testing::Test { |
| 71 public: | 31 public: |
| 72 void TestNonUIDataTypeActivationAsync(ChangeProcessor* processor, | |
| 73 base::WaitableEvent* done) { | |
| 74 registrar_->ActivateDataType(AUTOFILL, GROUP_DB, processor, | |
| 75 test_user_share_.user_share()); | |
| 76 ExpectRoutingInfo(registrar_.get(), {{AUTOFILL, GROUP_DB}}); | |
| 77 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet(AUTOFILL)); | |
| 78 TriggerChanges(registrar_.get(), AUTOFILL); | |
| 79 done->Signal(); | |
| 80 } | |
| 81 | |
| 82 protected: | |
| 83 SyncBackendRegistrarTest() | 32 SyncBackendRegistrarTest() |
| 84 : db_thread_("DBThreadForTest"), | 33 : db_thread_("DBThreadForTest"), |
| 85 file_thread_("FileThreadForTest"), | 34 file_thread_("FileThreadForTest"), |
| 86 sync_thread_("SyncThreadForTest") {} | 35 sync_thread_("SyncThreadForTest") {} |
| 87 | 36 |
| 88 ~SyncBackendRegistrarTest() override {} | |
| 89 | |
| 90 void SetUp() override { | 37 void SetUp() override { |
| 91 db_thread_.StartAndWaitForTesting(); | 38 db_thread_.StartAndWaitForTesting(); |
| 92 file_thread_.StartAndWaitForTesting(); | 39 file_thread_.StartAndWaitForTesting(); |
| 93 sync_thread_.StartAndWaitForTesting(); | 40 sync_thread_.StartAndWaitForTesting(); |
| 94 test_user_share_.SetUp(); | 41 test_user_share_.SetUp(); |
| 95 sync_client_ = base::MakeUnique<RegistrarSyncClient>( | 42 registrar_ = base::MakeUnique<SyncBackendRegistrar>( |
| 96 ui_task_runner(), db_task_runner(), file_task_runner()); | 43 "test", base::Bind(&SyncBackendRegistrarTest::CreateModelWorkerForGroup, |
| 97 registrar_ = | 44 base::Unretained(this))); |
| 98 base::MakeUnique<SyncBackendRegistrar>("test", sync_client_.get()); | |
| 99 } | 45 } |
| 100 | 46 |
| 101 void TearDown() override { | 47 void TearDown() override { |
| 102 registrar_->RequestWorkerStopOnUIThread(); | 48 registrar_->RequestWorkerStopOnUIThread(); |
| 103 test_user_share_.TearDown(); | 49 test_user_share_.TearDown(); |
| 104 sync_thread_.task_runner()->DeleteSoon(FROM_HERE, registrar_.release()); | 50 sync_thread_.task_runner()->DeleteSoon(FROM_HERE, registrar_.release()); |
| 105 sync_thread_.FlushForTesting(); | 51 sync_thread_.FlushForTesting(); |
| 106 } | 52 } |
| 107 | 53 |
| 108 void ExpectRoutingInfo(SyncBackendRegistrar* registrar, | 54 void TriggerChanges(ModelType type) { |
| 109 const ModelSafeRoutingInfo& expected_routing_info) { | 55 registrar_->OnChangesApplied(type, 0, nullptr, ImmutableChangeRecordList()); |
| 56 registrar_->OnChangesComplete(type); |
| 57 } |
| 58 |
| 59 void ExpectRoutingInfo(const ModelSafeRoutingInfo& expected_routing_info) { |
| 110 ModelSafeRoutingInfo actual_routing_info; | 60 ModelSafeRoutingInfo actual_routing_info; |
| 111 registrar->GetModelSafeRoutingInfo(&actual_routing_info); | 61 registrar_->GetModelSafeRoutingInfo(&actual_routing_info); |
| 112 EXPECT_EQ(expected_routing_info, actual_routing_info); | 62 EXPECT_EQ(expected_routing_info, actual_routing_info); |
| 113 } | 63 } |
| 114 | 64 |
| 115 void ExpectHasProcessorsForTypes(const SyncBackendRegistrar& registrar, | 65 void ExpectHasProcessorsForTypes(ModelTypeSet types) { |
| 116 ModelTypeSet types) { | |
| 117 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { | 66 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { |
| 118 ModelType model_type = ModelTypeFromInt(i); | 67 ModelType model_type = ModelTypeFromInt(i); |
| 119 EXPECT_EQ(types.Has(model_type), | 68 EXPECT_EQ(types.Has(model_type), |
| 120 registrar_->IsTypeActivatedForTest(model_type)); | 69 registrar_->IsTypeActivatedForTest(model_type)); |
| 121 } | 70 } |
| 122 } | 71 } |
| 123 | 72 |
| 124 size_t GetWorkersSize() { | 73 size_t GetWorkersSize() { |
| 125 std::vector<scoped_refptr<ModelSafeWorker>> workers; | 74 std::vector<scoped_refptr<ModelSafeWorker>> workers; |
| 126 registrar_->GetWorkers(&workers); | 75 registrar_->GetWorkers(&workers); |
| 127 return workers.size(); | 76 return workers.size(); |
| 128 } | 77 } |
| 129 | 78 |
| 130 const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() { | 79 // Part of the ActivateDeactivateNonUIDataType test below. |
| 131 return message_loop_.task_runner(); | 80 void TestNonUIDataTypeActivationAsync(ChangeProcessor* processor, |
| 81 base::WaitableEvent* done) { |
| 82 registrar_->ActivateDataType(AUTOFILL, GROUP_DB, processor, user_share()); |
| 83 ExpectRoutingInfo({{AUTOFILL, GROUP_DB}}); |
| 84 ExpectHasProcessorsForTypes(ModelTypeSet(AUTOFILL)); |
| 85 TriggerChanges(AUTOFILL); |
| 86 done->Signal(); |
| 132 } | 87 } |
| 133 | 88 |
| 134 const scoped_refptr<base::SingleThreadTaskRunner> db_task_runner() { | 89 SyncBackendRegistrar* registrar() { return registrar_.get(); } |
| 90 UserShare* user_share() { return test_user_share_.user_share(); } |
| 91 scoped_refptr<base::SingleThreadTaskRunner> db_task_runner() { |
| 135 return db_thread_.task_runner(); | 92 return db_thread_.task_runner(); |
| 136 } | 93 } |
| 137 | 94 |
| 138 const scoped_refptr<base::SingleThreadTaskRunner> file_task_runner() { | 95 private: |
| 139 return db_thread_.task_runner(); | 96 scoped_refptr<ModelSafeWorker> CreateModelWorkerForGroup( |
| 97 ModelSafeGroup group) { |
| 98 switch (group) { |
| 99 case GROUP_UI: |
| 100 return new BrowserThreadModelWorker(message_loop_.task_runner(), group); |
| 101 case GROUP_DB: |
| 102 return new BrowserThreadModelWorker(db_thread_.task_runner(), group); |
| 103 case GROUP_FILE: |
| 104 return new BrowserThreadModelWorker(file_thread_.task_runner(), group); |
| 105 case GROUP_PASSIVE: |
| 106 return new PassiveModelWorker(); |
| 107 default: |
| 108 return nullptr; |
| 109 } |
| 140 } | 110 } |
| 141 | 111 |
| 142 base::MessageLoop message_loop_; | 112 base::MessageLoop message_loop_; |
| 143 base::Thread db_thread_; | 113 base::Thread db_thread_; |
| 144 base::Thread file_thread_; | 114 base::Thread file_thread_; |
| 145 base::Thread sync_thread_; | 115 base::Thread sync_thread_; |
| 146 | 116 |
| 147 TestUserShare test_user_share_; | 117 TestUserShare test_user_share_; |
| 148 std::unique_ptr<RegistrarSyncClient> sync_client_; | |
| 149 std::unique_ptr<SyncBackendRegistrar> registrar_; | 118 std::unique_ptr<SyncBackendRegistrar> registrar_; |
| 150 }; | 119 }; |
| 151 | 120 |
| 152 TEST_F(SyncBackendRegistrarTest, ConstructorEmpty) { | 121 TEST_F(SyncBackendRegistrarTest, ConstructorEmpty) { |
| 153 registrar_->SetInitialTypes(ModelTypeSet()); | 122 registrar()->SetInitialTypes(ModelTypeSet()); |
| 154 EXPECT_FALSE(registrar_->IsNigoriEnabled()); | 123 EXPECT_FALSE(registrar()->IsNigoriEnabled()); |
| 155 EXPECT_EQ(4u, GetWorkersSize()); | 124 EXPECT_EQ(4u, GetWorkersSize()); |
| 156 ExpectRoutingInfo(registrar_.get(), ModelSafeRoutingInfo()); | 125 ExpectRoutingInfo(ModelSafeRoutingInfo()); |
| 157 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 126 ExpectHasProcessorsForTypes(ModelTypeSet()); |
| 158 } | 127 } |
| 159 | 128 |
| 160 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmpty) { | 129 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmpty) { |
| 161 registrar_->RegisterNonBlockingType(BOOKMARKS); | 130 registrar()->RegisterNonBlockingType(BOOKMARKS); |
| 162 registrar_->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS)); | 131 registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS)); |
| 163 EXPECT_TRUE(registrar_->IsNigoriEnabled()); | 132 EXPECT_TRUE(registrar()->IsNigoriEnabled()); |
| 164 EXPECT_EQ(4u, GetWorkersSize()); | 133 EXPECT_EQ(4u, GetWorkersSize()); |
| 165 EXPECT_EQ(ModelTypeSet(NIGORI), registrar_->GetLastConfiguredTypes()); | 134 EXPECT_EQ(ModelTypeSet(NIGORI), registrar()->GetLastConfiguredTypes()); |
| 166 // Bookmarks dropped because it is nonblocking. | 135 // Bookmarks dropped because it is nonblocking. |
| 167 // Passwords dropped because of no password store. | 136 // Passwords dropped because of no password store. |
| 168 ExpectRoutingInfo(registrar_.get(), {{NIGORI, GROUP_PASSIVE}}); | 137 ExpectRoutingInfo({{NIGORI, GROUP_PASSIVE}}); |
| 169 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 138 ExpectHasProcessorsForTypes(ModelTypeSet()); |
| 170 } | 139 } |
| 171 | 140 |
| 172 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmptyReversedInitialization) { | 141 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmptyReversedInitialization) { |
| 173 // The blocking types get to set initial types before NonBlocking types here. | 142 // The blocking types get to set initial types before NonBlocking types here. |
| 174 registrar_->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS)); | 143 registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS)); |
| 175 registrar_->RegisterNonBlockingType(BOOKMARKS); | 144 registrar()->RegisterNonBlockingType(BOOKMARKS); |
| 176 EXPECT_TRUE(registrar_->IsNigoriEnabled()); | 145 EXPECT_TRUE(registrar()->IsNigoriEnabled()); |
| 177 EXPECT_EQ(4u, GetWorkersSize()); | 146 EXPECT_EQ(4u, GetWorkersSize()); |
| 178 EXPECT_EQ(ModelTypeSet(NIGORI), registrar_->GetLastConfiguredTypes()); | 147 EXPECT_EQ(ModelTypeSet(NIGORI), registrar()->GetLastConfiguredTypes()); |
| 179 // Bookmarks dropped because it is nonblocking. | 148 // Bookmarks dropped because it is nonblocking. |
| 180 // Passwords dropped because of no password store. | 149 // Passwords dropped because of no password store. |
| 181 ExpectRoutingInfo(registrar_.get(), {{NIGORI, GROUP_PASSIVE}}); | 150 ExpectRoutingInfo({{NIGORI, GROUP_PASSIVE}}); |
| 182 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 151 ExpectHasProcessorsForTypes(ModelTypeSet()); |
| 183 } | 152 } |
| 184 | 153 |
| 185 TEST_F(SyncBackendRegistrarTest, ConfigureDataTypes) { | 154 TEST_F(SyncBackendRegistrarTest, ConfigureDataTypes) { |
| 186 registrar_->RegisterNonBlockingType(BOOKMARKS); | 155 registrar()->RegisterNonBlockingType(BOOKMARKS); |
| 187 registrar_->SetInitialTypes(ModelTypeSet()); | 156 registrar()->SetInitialTypes(ModelTypeSet()); |
| 188 | 157 |
| 189 // Add. | 158 // Add. |
| 190 const ModelTypeSet types1(BOOKMARKS, NIGORI, AUTOFILL); | 159 const ModelTypeSet types1(BOOKMARKS, NIGORI, AUTOFILL); |
| 191 EXPECT_EQ(types1, registrar_->ConfigureDataTypes(types1, ModelTypeSet())); | 160 EXPECT_EQ(types1, registrar()->ConfigureDataTypes(types1, ModelTypeSet())); |
| 192 ExpectRoutingInfo(registrar_.get(), {{BOOKMARKS, GROUP_NON_BLOCKING}, | 161 ExpectRoutingInfo({{BOOKMARKS, GROUP_NON_BLOCKING}, |
| 193 {NIGORI, GROUP_PASSIVE}, | 162 {NIGORI, GROUP_PASSIVE}, |
| 194 {AUTOFILL, GROUP_PASSIVE}}); | 163 {AUTOFILL, GROUP_PASSIVE}}); |
| 195 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 164 ExpectHasProcessorsForTypes(ModelTypeSet()); |
| 196 EXPECT_EQ(types1, registrar_->GetLastConfiguredTypes()); | 165 EXPECT_EQ(types1, registrar()->GetLastConfiguredTypes()); |
| 197 | 166 |
| 198 // Add and remove. | 167 // Add and remove. |
| 199 const ModelTypeSet types2(PREFERENCES, THEMES); | 168 const ModelTypeSet types2(PREFERENCES, THEMES); |
| 200 EXPECT_EQ(types2, registrar_->ConfigureDataTypes(types2, types1)); | 169 EXPECT_EQ(types2, registrar()->ConfigureDataTypes(types2, types1)); |
| 201 | 170 |
| 202 ExpectRoutingInfo(registrar_.get(), | 171 ExpectRoutingInfo({{PREFERENCES, GROUP_PASSIVE}, {THEMES, GROUP_PASSIVE}}); |
| 203 {{PREFERENCES, GROUP_PASSIVE}, {THEMES, GROUP_PASSIVE}}); | 172 ExpectHasProcessorsForTypes(ModelTypeSet()); |
| 204 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 173 EXPECT_EQ(types2, registrar()->GetLastConfiguredTypes()); |
| 205 EXPECT_EQ(types2, registrar_->GetLastConfiguredTypes()); | |
| 206 | 174 |
| 207 // Remove. | 175 // Remove. |
| 208 EXPECT_TRUE(registrar_->ConfigureDataTypes(ModelTypeSet(), types2).Empty()); | 176 EXPECT_TRUE(registrar()->ConfigureDataTypes(ModelTypeSet(), types2).Empty()); |
| 209 ExpectRoutingInfo(registrar_.get(), ModelSafeRoutingInfo()); | 177 ExpectRoutingInfo(ModelSafeRoutingInfo()); |
| 210 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 178 ExpectHasProcessorsForTypes(ModelTypeSet()); |
| 211 EXPECT_EQ(ModelTypeSet(), registrar_->GetLastConfiguredTypes()); | 179 EXPECT_EQ(ModelTypeSet(), registrar()->GetLastConfiguredTypes()); |
| 212 } | 180 } |
| 213 | 181 |
| 214 TEST_F(SyncBackendRegistrarTest, ActivateDeactivateUIDataType) { | 182 TEST_F(SyncBackendRegistrarTest, ActivateDeactivateUIDataType) { |
| 215 InSequence in_sequence; | 183 InSequence in_sequence; |
| 216 registrar_->SetInitialTypes(ModelTypeSet()); | 184 registrar()->SetInitialTypes(ModelTypeSet()); |
| 217 | 185 |
| 218 // Should do nothing. | 186 // Should do nothing. |
| 219 TriggerChanges(registrar_.get(), BOOKMARKS); | 187 TriggerChanges(BOOKMARKS); |
| 220 | 188 |
| 221 StrictMock<ChangeProcessorMock> change_processor_mock; | 189 StrictMock<ChangeProcessorMock> change_processor_mock; |
| 222 EXPECT_CALL(change_processor_mock, StartImpl()); | 190 EXPECT_CALL(change_processor_mock, StartImpl()); |
| 223 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); | 191 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); |
| 224 EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(nullptr, _, _)); | 192 EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(nullptr, _, _)); |
| 225 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); | 193 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); |
| 226 EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); | 194 EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); |
| 227 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); | 195 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); |
| 228 | 196 |
| 229 const ModelTypeSet types(BOOKMARKS); | 197 const ModelTypeSet types(BOOKMARKS); |
| 230 EXPECT_EQ(types, registrar_->ConfigureDataTypes(types, ModelTypeSet())); | 198 EXPECT_EQ(types, registrar()->ConfigureDataTypes(types, ModelTypeSet())); |
| 231 registrar_->ActivateDataType(BOOKMARKS, GROUP_UI, &change_processor_mock, | 199 registrar()->ActivateDataType(BOOKMARKS, GROUP_UI, &change_processor_mock, |
| 232 test_user_share_.user_share()); | 200 user_share()); |
| 233 ExpectRoutingInfo(registrar_.get(), {{BOOKMARKS, GROUP_UI}}); | 201 ExpectRoutingInfo({{BOOKMARKS, GROUP_UI}}); |
| 234 ExpectHasProcessorsForTypes(*registrar_, types); | 202 ExpectHasProcessorsForTypes(types); |
| 235 | 203 |
| 236 TriggerChanges(registrar_.get(), BOOKMARKS); | 204 TriggerChanges(BOOKMARKS); |
| 237 | 205 |
| 238 registrar_->DeactivateDataType(BOOKMARKS); | 206 registrar()->DeactivateDataType(BOOKMARKS); |
| 239 ExpectRoutingInfo(registrar_.get(), ModelSafeRoutingInfo()); | 207 ExpectRoutingInfo(ModelSafeRoutingInfo()); |
| 240 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 208 ExpectHasProcessorsForTypes(ModelTypeSet()); |
| 241 | 209 |
| 242 // Should do nothing. | 210 // Should do nothing. |
| 243 TriggerChanges(registrar_.get(), BOOKMARKS); | 211 TriggerChanges(BOOKMARKS); |
| 244 } | 212 } |
| 245 | 213 |
| 246 TEST_F(SyncBackendRegistrarTest, ActivateDeactivateNonUIDataType) { | 214 TEST_F(SyncBackendRegistrarTest, ActivateDeactivateNonUIDataType) { |
| 247 InSequence in_sequence; | 215 InSequence in_sequence; |
| 248 registrar_->SetInitialTypes(ModelTypeSet()); | 216 registrar()->SetInitialTypes(ModelTypeSet()); |
| 249 | 217 |
| 250 // Should do nothing. | 218 // Should do nothing. |
| 251 TriggerChanges(registrar_.get(), AUTOFILL); | 219 TriggerChanges(AUTOFILL); |
| 252 | 220 |
| 253 StrictMock<ChangeProcessorMock> change_processor_mock; | 221 StrictMock<ChangeProcessorMock> change_processor_mock; |
| 254 EXPECT_CALL(change_processor_mock, StartImpl()); | 222 EXPECT_CALL(change_processor_mock, StartImpl()); |
| 255 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); | 223 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); |
| 256 EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(nullptr, _, _)); | 224 EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(nullptr, _, _)); |
| 257 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); | 225 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); |
| 258 EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); | 226 EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); |
| 259 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); | 227 EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); |
| 260 | 228 |
| 261 const ModelTypeSet types(AUTOFILL); | 229 const ModelTypeSet types(AUTOFILL); |
| 262 EXPECT_EQ(types, registrar_->ConfigureDataTypes(types, ModelTypeSet())); | 230 EXPECT_EQ(types, registrar()->ConfigureDataTypes(types, ModelTypeSet())); |
| 263 | 231 |
| 264 base::WaitableEvent done(base::WaitableEvent::ResetPolicy::AUTOMATIC, | 232 base::WaitableEvent done(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| 265 base::WaitableEvent::InitialState::NOT_SIGNALED); | 233 base::WaitableEvent::InitialState::NOT_SIGNALED); |
| 266 db_task_runner()->PostTask( | 234 db_task_runner()->PostTask( |
| 267 FROM_HERE, | 235 FROM_HERE, |
| 268 base::Bind(&SyncBackendRegistrarTest::TestNonUIDataTypeActivationAsync, | 236 base::Bind(&SyncBackendRegistrarTest::TestNonUIDataTypeActivationAsync, |
| 269 base::Unretained(this), &change_processor_mock, &done)); | 237 base::Unretained(this), &change_processor_mock, &done)); |
| 270 done.Wait(); | 238 done.Wait(); |
| 271 | 239 |
| 272 registrar_->DeactivateDataType(AUTOFILL); | 240 registrar()->DeactivateDataType(AUTOFILL); |
| 273 ExpectRoutingInfo(registrar_.get(), ModelSafeRoutingInfo()); | 241 ExpectRoutingInfo(ModelSafeRoutingInfo()); |
| 274 ExpectHasProcessorsForTypes(*registrar_, ModelTypeSet()); | 242 ExpectHasProcessorsForTypes(ModelTypeSet()); |
| 275 | 243 |
| 276 // Should do nothing. | 244 // Should do nothing. |
| 277 TriggerChanges(registrar_.get(), AUTOFILL); | 245 TriggerChanges(AUTOFILL); |
| 278 } | 246 } |
| 279 | 247 |
| 280 // Tests that registration and configuration of non-blocking data types is | 248 // Tests that registration and configuration of non-blocking data types is |
| 281 // handled correctly in SyncBackendRegistrar. | 249 // handled correctly in SyncBackendRegistrar. |
| 282 TEST_F(SyncBackendRegistrarTest, ConfigureNonBlockingDataType) { | 250 TEST_F(SyncBackendRegistrarTest, ConfigureNonBlockingDataType) { |
| 283 registrar_->RegisterNonBlockingType(AUTOFILL); | 251 registrar()->RegisterNonBlockingType(AUTOFILL); |
| 284 registrar_->RegisterNonBlockingType(BOOKMARKS); | 252 registrar()->RegisterNonBlockingType(BOOKMARKS); |
| 285 | 253 |
| 286 ExpectRoutingInfo(registrar_.get(), ModelSafeRoutingInfo()); | 254 ExpectRoutingInfo(ModelSafeRoutingInfo()); |
| 287 // Simulate that initial sync was already done for AUTOFILL. | 255 // Simulate that initial sync was already done for AUTOFILL. |
| 288 registrar_->AddRestoredNonBlockingType(AUTOFILL); | 256 registrar()->AddRestoredNonBlockingType(AUTOFILL); |
| 289 // It should be added to routing info and set of configured types. | 257 // It should be added to routing info and set of configured types. |
| 290 EXPECT_EQ(ModelTypeSet(AUTOFILL), registrar_->GetLastConfiguredTypes()); | 258 EXPECT_EQ(ModelTypeSet(AUTOFILL), registrar()->GetLastConfiguredTypes()); |
| 291 ExpectRoutingInfo(registrar_.get(), {{AUTOFILL, GROUP_NON_BLOCKING}}); | 259 ExpectRoutingInfo({{AUTOFILL, GROUP_NON_BLOCKING}}); |
| 292 | 260 |
| 293 // Configure two non-blocking types. Initial sync wasn't done for BOOKMARKS so | 261 // Configure two non-blocking types. Initial sync wasn't done for BOOKMARKS so |
| 294 // it should be included in types to be downloaded. | 262 // it should be included in types to be downloaded. |
| 295 ModelTypeSet types_to_add(AUTOFILL, BOOKMARKS); | 263 ModelTypeSet types_to_add(AUTOFILL, BOOKMARKS); |
| 296 ModelTypeSet newly_added_types = | 264 ModelTypeSet newly_added_types = |
| 297 registrar_->ConfigureDataTypes(types_to_add, ModelTypeSet()); | 265 registrar()->ConfigureDataTypes(types_to_add, ModelTypeSet()); |
| 298 EXPECT_EQ(ModelTypeSet(BOOKMARKS), newly_added_types); | 266 EXPECT_EQ(ModelTypeSet(BOOKMARKS), newly_added_types); |
| 299 EXPECT_EQ(types_to_add, registrar_->GetLastConfiguredTypes()); | 267 EXPECT_EQ(types_to_add, registrar()->GetLastConfiguredTypes()); |
| 300 ExpectRoutingInfo(registrar_.get(), {{AUTOFILL, GROUP_NON_BLOCKING}, | 268 ExpectRoutingInfo( |
| 301 {BOOKMARKS, GROUP_NON_BLOCKING}}); | 269 {{AUTOFILL, GROUP_NON_BLOCKING}, {BOOKMARKS, GROUP_NON_BLOCKING}}); |
| 302 } | 270 } |
| 303 | 271 |
| 304 } // namespace | 272 } // namespace |
| 305 | 273 |
| 306 } // namespace syncer | 274 } // namespace syncer |
| OLD | NEW |