OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/non_ui_model_type_controller.h" | 5 #include "components/sync/driver/non_ui_model_type_controller.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/callback.h" | 11 #include "base/callback.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
16 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
17 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
18 #include "base/sequenced_task_runner.h" | 18 #include "base/sequenced_task_runner.h" |
19 #include "base/test/test_simple_task_runner.h" | 19 #include "base/test/test_simple_task_runner.h" |
20 #include "base/threading/thread.h" | 20 #include "base/threading/thread.h" |
21 #include "components/sync/api/stub_model_type_service.h" | 21 #include "components/sync/api/stub_model_type_service.h" |
22 #include "components/sync/core/activation_context.h" | 22 #include "components/sync/core/activation_context.h" |
23 #include "components/sync/core/shared_model_type_processor.h" | 23 #include "components/sync/core/shared_model_type_processor.h" |
24 #include "components/sync/driver/backend_data_type_configurer.h" | 24 #include "components/sync/driver/backend_data_type_configurer.h" |
25 #include "components/sync/driver/fake_sync_client.h" | 25 #include "components/sync/driver/fake_sync_client.h" |
26 #include "components/sync/engine/commit_queue.h" | 26 #include "components/sync/engine/commit_queue.h" |
27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
28 | 28 |
29 namespace syncer { | 29 namespace sync_driver_v2 { |
30 | 30 |
31 namespace { | 31 namespace { |
32 | 32 |
33 // Test controller derived from NonUIModelTypeController. | 33 // Test controller derived from NonUIModelTypeController. |
34 class TestNonUIModelTypeController : public NonUIModelTypeController { | 34 class TestNonUIModelTypeController : public NonUIModelTypeController { |
35 public: | 35 public: |
36 TestNonUIModelTypeController( | 36 TestNonUIModelTypeController( |
37 ModelType model_type, | 37 syncer::ModelType model_type, |
38 const scoped_refptr<base::TaskRunner>& model_task_runner, | 38 const scoped_refptr<base::TaskRunner>& model_task_runner, |
39 const base::Closure& dump_stack, | 39 const base::Closure& dump_stack, |
40 SyncClient* sync_client) | 40 sync_driver::SyncClient* sync_client) |
41 : NonUIModelTypeController(model_type, dump_stack, sync_client), | 41 : NonUIModelTypeController(model_type, dump_stack, sync_client), |
42 model_task_runner_(model_task_runner) {} | 42 model_task_runner_(model_task_runner) {} |
43 ~TestNonUIModelTypeController() override {} | 43 ~TestNonUIModelTypeController() override {} |
44 | 44 |
45 bool RunOnModelThread(const tracked_objects::Location& from_here, | 45 bool RunOnModelThread(const tracked_objects::Location& from_here, |
46 const base::Closure& task) override { | 46 const base::Closure& task) override { |
47 DCHECK(model_task_runner_); | 47 DCHECK(model_task_runner_); |
48 return model_task_runner_->PostTask(from_here, task); | 48 return model_task_runner_->PostTask(from_here, task); |
49 } | 49 } |
50 | 50 |
51 private: | 51 private: |
52 scoped_refptr<base::TaskRunner> model_task_runner_; | 52 scoped_refptr<base::TaskRunner> model_task_runner_; |
53 }; | 53 }; |
54 | 54 |
55 // A no-op instance of CommitQueue. | 55 // A no-op instance of CommitQueue. |
56 class NullCommitQueue : public CommitQueue { | 56 class NullCommitQueue : public syncer_v2::CommitQueue { |
57 public: | 57 public: |
58 NullCommitQueue() {} | 58 NullCommitQueue() {} |
59 ~NullCommitQueue() override {} | 59 ~NullCommitQueue() override {} |
60 | 60 |
61 void EnqueueForCommit(const CommitRequestDataList& list) override { | 61 void EnqueueForCommit(const syncer_v2::CommitRequestDataList& list) override { |
62 NOTREACHED() << "Not implemented."; | 62 NOTREACHED() << "Not implemented."; |
63 } | 63 } |
64 }; | 64 }; |
65 | 65 |
66 // A class that pretends to be the sync backend. | 66 // A class that pretends to be the sync backend. |
67 class MockSyncBackend { | 67 class MockSyncBackend { |
68 public: | 68 public: |
69 void Connect(ModelType type, | 69 void Connect( |
70 std::unique_ptr<ActivationContext> activation_context) { | 70 syncer::ModelType type, |
| 71 std::unique_ptr<syncer_v2::ActivationContext> activation_context) { |
71 enabled_types_.Put(type); | 72 enabled_types_.Put(type); |
72 activation_context->type_processor->ConnectSync( | 73 activation_context->type_processor->ConnectSync( |
73 base::MakeUnique<NullCommitQueue>()); | 74 base::MakeUnique<NullCommitQueue>()); |
74 } | 75 } |
75 | 76 |
76 void Disconnect(ModelType type) { | 77 void Disconnect(syncer::ModelType type) { |
77 DCHECK(enabled_types_.Has(type)); | 78 DCHECK(enabled_types_.Has(type)); |
78 enabled_types_.Remove(type); | 79 enabled_types_.Remove(type); |
79 } | 80 } |
80 | 81 |
81 private: | 82 private: |
82 ModelTypeSet enabled_types_; | 83 syncer::ModelTypeSet enabled_types_; |
83 }; | 84 }; |
84 | 85 |
85 // Fake implementation of BackendDataTypeConfigurer that pretends to be Sync | 86 // Fake implementation of BackendDataTypeConfigurer that pretends to be Sync |
86 // backend. | 87 // backend. |
87 class MockBackendDataTypeConfigurer : public BackendDataTypeConfigurer { | 88 class MockBackendDataTypeConfigurer |
| 89 : public sync_driver::BackendDataTypeConfigurer { |
88 public: | 90 public: |
89 MockBackendDataTypeConfigurer( | 91 MockBackendDataTypeConfigurer( |
90 MockSyncBackend* backend, | 92 MockSyncBackend* backend, |
91 const scoped_refptr<base::TaskRunner>& sync_task_runner) | 93 const scoped_refptr<base::TaskRunner>& sync_task_runner) |
92 : backend_(backend), sync_task_runner_(sync_task_runner) {} | 94 : backend_(backend), sync_task_runner_(sync_task_runner) {} |
93 ~MockBackendDataTypeConfigurer() override {} | 95 ~MockBackendDataTypeConfigurer() override {} |
94 | 96 |
95 ModelTypeSet ConfigureDataTypes( | 97 syncer::ModelTypeSet ConfigureDataTypes( |
96 ConfigureReason reason, | 98 syncer::ConfigureReason reason, |
97 const DataTypeConfigStateMap& config_state_map, | 99 const DataTypeConfigStateMap& config_state_map, |
98 const base::Callback<void(ModelTypeSet, ModelTypeSet)>& ready_task, | 100 const base::Callback<void(syncer::ModelTypeSet, syncer::ModelTypeSet)>& |
| 101 ready_task, |
99 const base::Callback<void()>& retry_callback) override { | 102 const base::Callback<void()>& retry_callback) override { |
100 NOTREACHED() << "Not implemented."; | 103 NOTREACHED() << "Not implemented."; |
101 return ModelTypeSet(); | 104 return syncer::ModelTypeSet(); |
102 } | 105 } |
103 | 106 |
104 void ActivateDirectoryDataType(ModelType type, | 107 void ActivateDirectoryDataType( |
105 ModelSafeGroup group, | 108 syncer::ModelType type, |
106 ChangeProcessor* change_processor) override { | 109 syncer::ModelSafeGroup group, |
| 110 sync_driver::ChangeProcessor* change_processor) override { |
107 NOTREACHED() << "Not implemented."; | 111 NOTREACHED() << "Not implemented."; |
108 } | 112 } |
109 | 113 |
110 void DeactivateDirectoryDataType(ModelType type) override { | 114 void DeactivateDirectoryDataType(syncer::ModelType type) override { |
111 NOTREACHED() << "Not implemented."; | 115 NOTREACHED() << "Not implemented."; |
112 } | 116 } |
113 | 117 |
114 void ActivateNonBlockingDataType( | 118 void ActivateNonBlockingDataType(syncer::ModelType type, |
115 ModelType type, | 119 std::unique_ptr<syncer_v2::ActivationContext> |
116 std::unique_ptr<ActivationContext> activation_context) override { | 120 activation_context) override { |
117 // Post on Sync thread just like the real implementation does. | 121 // Post on Sync thread just like the real implementation does. |
118 sync_task_runner_->PostTask( | 122 sync_task_runner_->PostTask( |
119 FROM_HERE, | 123 FROM_HERE, |
120 base::Bind(&MockSyncBackend::Connect, base::Unretained(backend_), type, | 124 base::Bind(&MockSyncBackend::Connect, base::Unretained(backend_), type, |
121 base::Passed(std::move(activation_context)))); | 125 base::Passed(std::move(activation_context)))); |
122 } | 126 } |
123 | 127 |
124 void DeactivateNonBlockingDataType(ModelType type) override { | 128 void DeactivateNonBlockingDataType(syncer::ModelType type) override { |
125 sync_task_runner_->PostTask(FROM_HERE, | 129 sync_task_runner_->PostTask(FROM_HERE, |
126 base::Bind(&MockSyncBackend::Disconnect, | 130 base::Bind(&MockSyncBackend::Disconnect, |
127 base::Unretained(backend_), type)); | 131 base::Unretained(backend_), type)); |
128 } | 132 } |
129 | 133 |
130 private: | 134 private: |
131 MockSyncBackend* backend_; | 135 MockSyncBackend* backend_; |
132 scoped_refptr<base::TaskRunner> sync_task_runner_; | 136 scoped_refptr<base::TaskRunner> sync_task_runner_; |
133 }; | 137 }; |
134 | 138 |
135 } // namespace | 139 } // namespace |
136 | 140 |
137 class NonUIModelTypeControllerTest : public testing::Test, | 141 class NonUIModelTypeControllerTest : public testing::Test, |
138 public FakeSyncClient { | 142 public sync_driver::FakeSyncClient { |
139 public: | 143 public: |
140 NonUIModelTypeControllerTest() | 144 NonUIModelTypeControllerTest() |
141 : auto_run_tasks_(true), | 145 : auto_run_tasks_(true), |
142 load_models_callback_called_(false), | 146 load_models_callback_called_(false), |
143 association_callback_called_(false), | 147 association_callback_called_(false), |
144 model_thread_("modelthread"), | 148 model_thread_("modelthread"), |
145 configurer_(&backend_, ui_loop_.task_runner()) {} | 149 configurer_(&backend_, ui_loop_.task_runner()) {} |
146 | 150 |
147 ~NonUIModelTypeControllerTest() override {} | 151 ~NonUIModelTypeControllerTest() override {} |
148 | 152 |
149 void SetUp() override { | 153 void SetUp() override { |
150 model_thread_.Start(); | 154 model_thread_.Start(); |
151 model_thread_runner_ = model_thread_.task_runner(); | 155 model_thread_runner_ = model_thread_.task_runner(); |
152 InitializeModelTypeService(); | 156 InitializeModelTypeService(); |
153 controller_.reset(new TestNonUIModelTypeController( | 157 controller_.reset(new TestNonUIModelTypeController( |
154 DICTIONARY, model_thread_runner_, base::Closure(), this)); | 158 syncer::DICTIONARY, model_thread_runner_, base::Closure(), this)); |
155 } | 159 } |
156 | 160 |
157 void TearDown() override { | 161 void TearDown() override { |
158 ClearModelTypeService(); | 162 ClearModelTypeService(); |
159 RunQueuedUIThreadTasks(); | 163 RunQueuedUIThreadTasks(); |
160 } | 164 } |
161 | 165 |
162 base::WeakPtr<ModelTypeService> GetModelTypeServiceForType( | 166 base::WeakPtr<syncer_v2::ModelTypeService> GetModelTypeServiceForType( |
163 ModelType type) override { | 167 syncer::ModelType type) override { |
164 return service_->AsWeakPtr(); | 168 return service_->AsWeakPtr(); |
165 } | 169 } |
166 | 170 |
167 protected: | 171 protected: |
168 std::unique_ptr<ModelTypeChangeProcessor> CreateProcessor( | 172 std::unique_ptr<syncer_v2::ModelTypeChangeProcessor> CreateProcessor( |
169 ModelType type, | 173 syncer::ModelType type, |
170 ModelTypeService* service) { | 174 syncer_v2::ModelTypeService* service) { |
171 std::unique_ptr<SharedModelTypeProcessor> processor = | 175 std::unique_ptr<syncer_v2::SharedModelTypeProcessor> processor = |
172 base::MakeUnique<SharedModelTypeProcessor>(type, service); | 176 base::MakeUnique<syncer_v2::SharedModelTypeProcessor>(type, service); |
173 type_processor_ = processor.get(); | 177 type_processor_ = processor.get(); |
174 return std::move(processor); | 178 return std::move(processor); |
175 } | 179 } |
176 | 180 |
177 void InitializeModelTypeService() { | 181 void InitializeModelTypeService() { |
178 if (!model_thread_runner_ || | 182 if (!model_thread_runner_ || |
179 model_thread_runner_->BelongsToCurrentThread()) { | 183 model_thread_runner_->BelongsToCurrentThread()) { |
180 service_.reset(new StubModelTypeService( | 184 service_.reset(new syncer_v2::StubModelTypeService( |
181 base::Bind(&NonUIModelTypeControllerTest::CreateProcessor, | 185 base::Bind(&NonUIModelTypeControllerTest::CreateProcessor, |
182 base::Unretained(this)))); | 186 base::Unretained(this)))); |
183 } else { | 187 } else { |
184 model_thread_runner_->PostTask( | 188 model_thread_runner_->PostTask( |
185 FROM_HERE, | 189 FROM_HERE, |
186 base::Bind(&NonUIModelTypeControllerTest::InitializeModelTypeService, | 190 base::Bind(&NonUIModelTypeControllerTest::InitializeModelTypeService, |
187 base::Unretained(this))); | 191 base::Unretained(this))); |
188 RunQueuedModelThreadTasks(); | 192 RunQueuedModelThreadTasks(); |
189 } | 193 } |
190 } | 194 } |
(...skipping 20 matching lines...) Expand all Loading... |
211 FROM_HERE, | 215 FROM_HERE, |
212 base::Bind(&NonUIModelTypeControllerTest::ExpectProcessorConnected, | 216 base::Bind(&NonUIModelTypeControllerTest::ExpectProcessorConnected, |
213 base::Unretained(this), isConnected)); | 217 base::Unretained(this), isConnected)); |
214 RunQueuedModelThreadTasks(); | 218 RunQueuedModelThreadTasks(); |
215 } | 219 } |
216 } | 220 } |
217 | 221 |
218 void OnMetadataLoaded() { | 222 void OnMetadataLoaded() { |
219 if (model_thread_runner_->BelongsToCurrentThread()) { | 223 if (model_thread_runner_->BelongsToCurrentThread()) { |
220 if (!type_processor_->IsAllowingChanges()) { | 224 if (!type_processor_->IsAllowingChanges()) { |
221 type_processor_->OnMetadataLoaded(SyncError(), | 225 type_processor_->OnMetadataLoaded( |
222 base::MakeUnique<MetadataBatch>()); | 226 syncer::SyncError(), base::MakeUnique<syncer_v2::MetadataBatch>()); |
223 } | 227 } |
224 } else { | 228 } else { |
225 model_thread_runner_->PostTask( | 229 model_thread_runner_->PostTask( |
226 FROM_HERE, base::Bind(&NonUIModelTypeControllerTest::OnMetadataLoaded, | 230 FROM_HERE, base::Bind(&NonUIModelTypeControllerTest::OnMetadataLoaded, |
227 base::Unretained(this))); | 231 base::Unretained(this))); |
228 } | 232 } |
229 } | 233 } |
230 | 234 |
231 void LoadModels() { | 235 void LoadModels() { |
232 controller_->LoadModels(base::Bind( | 236 controller_->LoadModels(base::Bind( |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 model_thread_runner_->PostTaskAndReply( | 281 model_thread_runner_->PostTaskAndReply( |
278 FROM_HERE, base::Bind(&base::DoNothing), | 282 FROM_HERE, base::Bind(&base::DoNothing), |
279 base::Bind(&base::RunLoop::Quit, base::Unretained(&run_loop))); | 283 base::Bind(&base::RunLoop::Quit, base::Unretained(&run_loop))); |
280 run_loop.Run(); | 284 run_loop.Run(); |
281 } | 285 } |
282 | 286 |
283 void SetAutoRunTasks(bool auto_run_tasks) { | 287 void SetAutoRunTasks(bool auto_run_tasks) { |
284 auto_run_tasks_ = auto_run_tasks; | 288 auto_run_tasks_ = auto_run_tasks; |
285 } | 289 } |
286 | 290 |
287 void LoadModelsDone(ModelType type, const SyncError& error) { | 291 void LoadModelsDone(syncer::ModelType type, const syncer::SyncError& error) { |
288 load_models_callback_called_ = true; | 292 load_models_callback_called_ = true; |
289 load_models_error_ = error; | 293 load_models_error_ = error; |
290 } | 294 } |
291 | 295 |
292 void AssociationDone(DataTypeController::ConfigureResult result, | 296 void AssociationDone(sync_driver::DataTypeController::ConfigureResult result, |
293 const SyncMergeResult& local_merge_result, | 297 const syncer::SyncMergeResult& local_merge_result, |
294 const SyncMergeResult& syncer_merge_result) { | 298 const syncer::SyncMergeResult& syncer_merge_result) { |
295 EXPECT_EQ(DataTypeController::OK, result); | 299 EXPECT_EQ(sync_driver::DataTypeController::OK, result); |
296 association_callback_called_ = true; | 300 association_callback_called_ = true; |
297 } | 301 } |
298 | 302 |
299 SharedModelTypeProcessor* type_processor_; | 303 syncer_v2::SharedModelTypeProcessor* type_processor_; |
300 std::unique_ptr<TestNonUIModelTypeController> controller_; | 304 std::unique_ptr<TestNonUIModelTypeController> controller_; |
301 | 305 |
302 bool auto_run_tasks_; | 306 bool auto_run_tasks_; |
303 bool load_models_callback_called_; | 307 bool load_models_callback_called_; |
304 SyncError load_models_error_; | 308 syncer::SyncError load_models_error_; |
305 bool association_callback_called_; | 309 bool association_callback_called_; |
306 base::MessageLoopForUI ui_loop_; | 310 base::MessageLoopForUI ui_loop_; |
307 base::Thread model_thread_; | 311 base::Thread model_thread_; |
308 scoped_refptr<base::SingleThreadTaskRunner> model_thread_runner_; | 312 scoped_refptr<base::SingleThreadTaskRunner> model_thread_runner_; |
309 MockSyncBackend backend_; | 313 MockSyncBackend backend_; |
310 MockBackendDataTypeConfigurer configurer_; | 314 MockBackendDataTypeConfigurer configurer_; |
311 std::unique_ptr<StubModelTypeService> service_; | 315 std::unique_ptr<syncer_v2::StubModelTypeService> service_; |
312 }; | 316 }; |
313 | 317 |
314 TEST_F(NonUIModelTypeControllerTest, InitialState) { | 318 TEST_F(NonUIModelTypeControllerTest, InitialState) { |
315 EXPECT_EQ(DICTIONARY, controller_->type()); | 319 EXPECT_EQ(syncer::DICTIONARY, controller_->type()); |
316 EXPECT_EQ(DataTypeController::NOT_RUNNING, controller_->state()); | 320 EXPECT_EQ(sync_driver::DataTypeController::NOT_RUNNING, controller_->state()); |
317 } | 321 } |
318 | 322 |
319 TEST_F(NonUIModelTypeControllerTest, LoadModelsOnBackendThread) { | 323 TEST_F(NonUIModelTypeControllerTest, LoadModelsOnBackendThread) { |
320 SetAutoRunTasks(false); | 324 SetAutoRunTasks(false); |
321 LoadModels(); | 325 LoadModels(); |
322 EXPECT_EQ(DataTypeController::MODEL_STARTING, controller_->state()); | 326 EXPECT_EQ(sync_driver::DataTypeController::MODEL_STARTING, |
| 327 controller_->state()); |
323 RunAllTasks(); | 328 RunAllTasks(); |
324 EXPECT_EQ(DataTypeController::MODEL_LOADED, controller_->state()); | 329 EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED, |
| 330 controller_->state()); |
325 EXPECT_TRUE(load_models_callback_called_); | 331 EXPECT_TRUE(load_models_callback_called_); |
326 EXPECT_FALSE(load_models_error_.IsSet()); | 332 EXPECT_FALSE(load_models_error_.IsSet()); |
327 ExpectProcessorConnected(false); | 333 ExpectProcessorConnected(false); |
328 } | 334 } |
329 | 335 |
330 TEST_F(NonUIModelTypeControllerTest, LoadModelsTwice) { | 336 TEST_F(NonUIModelTypeControllerTest, LoadModelsTwice) { |
331 LoadModels(); | 337 LoadModels(); |
332 SetAutoRunTasks(false); | 338 SetAutoRunTasks(false); |
333 LoadModels(); | 339 LoadModels(); |
334 EXPECT_EQ(DataTypeController::MODEL_LOADED, controller_->state()); | 340 EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED, |
| 341 controller_->state()); |
335 // The second LoadModels call should set the error. | 342 // The second LoadModels call should set the error. |
336 EXPECT_TRUE(load_models_error_.IsSet()); | 343 EXPECT_TRUE(load_models_error_.IsSet()); |
337 } | 344 } |
338 | 345 |
339 TEST_F(NonUIModelTypeControllerTest, ActivateDataTypeOnBackendThread) { | 346 TEST_F(NonUIModelTypeControllerTest, ActivateDataTypeOnBackendThread) { |
340 LoadModels(); | 347 LoadModels(); |
341 EXPECT_EQ(DataTypeController::MODEL_LOADED, controller_->state()); | 348 EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED, |
| 349 controller_->state()); |
342 RegisterWithBackend(); | 350 RegisterWithBackend(); |
343 ExpectProcessorConnected(true); | 351 ExpectProcessorConnected(true); |
344 | 352 |
345 StartAssociating(); | 353 StartAssociating(); |
346 EXPECT_EQ(DataTypeController::RUNNING, controller_->state()); | 354 EXPECT_EQ(sync_driver::DataTypeController::RUNNING, controller_->state()); |
347 } | 355 } |
348 | 356 |
349 TEST_F(NonUIModelTypeControllerTest, Stop) { | 357 TEST_F(NonUIModelTypeControllerTest, Stop) { |
350 LoadModels(); | 358 LoadModels(); |
351 RegisterWithBackend(); | 359 RegisterWithBackend(); |
352 ExpectProcessorConnected(true); | 360 ExpectProcessorConnected(true); |
353 | 361 |
354 StartAssociating(); | 362 StartAssociating(); |
355 | 363 |
356 DeactivateDataTypeAndStop(); | 364 DeactivateDataTypeAndStop(); |
357 EXPECT_EQ(DataTypeController::NOT_RUNNING, controller_->state()); | 365 EXPECT_EQ(sync_driver::DataTypeController::NOT_RUNNING, controller_->state()); |
358 } | 366 } |
359 | 367 |
360 } // namespace syncer | 368 } // namespace sync_driver_v2 |
OLD | NEW |