Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: components/sync/driver/non_ui_model_type_controller_unittest.cc

Issue 2376123003: [Sync] Move //components/sync to the syncer namespace. (Closed)
Patch Set: Rebase. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 sync_driver_v2 { 29 namespace syncer {
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 syncer::ModelType model_type, 37 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 sync_driver::SyncClient* sync_client) 40 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 syncer_v2::CommitQueue { 56 class NullCommitQueue : public CommitQueue {
57 public: 57 public:
58 NullCommitQueue() {} 58 NullCommitQueue() {}
59 ~NullCommitQueue() override {} 59 ~NullCommitQueue() override {}
60 60
61 void EnqueueForCommit(const syncer_v2::CommitRequestDataList& list) override { 61 void EnqueueForCommit(const 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( 69 void Connect(ModelType type,
70 syncer::ModelType type, 70 std::unique_ptr<ActivationContext> activation_context) {
71 std::unique_ptr<syncer_v2::ActivationContext> activation_context) {
72 enabled_types_.Put(type); 71 enabled_types_.Put(type);
73 activation_context->type_processor->ConnectSync( 72 activation_context->type_processor->ConnectSync(
74 base::MakeUnique<NullCommitQueue>()); 73 base::MakeUnique<NullCommitQueue>());
75 } 74 }
76 75
77 void Disconnect(syncer::ModelType type) { 76 void Disconnect(ModelType type) {
78 DCHECK(enabled_types_.Has(type)); 77 DCHECK(enabled_types_.Has(type));
79 enabled_types_.Remove(type); 78 enabled_types_.Remove(type);
80 } 79 }
81 80
82 private: 81 private:
83 syncer::ModelTypeSet enabled_types_; 82 ModelTypeSet enabled_types_;
84 }; 83 };
85 84
86 // Fake implementation of BackendDataTypeConfigurer that pretends to be Sync 85 // Fake implementation of BackendDataTypeConfigurer that pretends to be Sync
87 // backend. 86 // backend.
88 class MockBackendDataTypeConfigurer 87 class MockBackendDataTypeConfigurer : public BackendDataTypeConfigurer {
89 : public sync_driver::BackendDataTypeConfigurer {
90 public: 88 public:
91 MockBackendDataTypeConfigurer( 89 MockBackendDataTypeConfigurer(
92 MockSyncBackend* backend, 90 MockSyncBackend* backend,
93 const scoped_refptr<base::TaskRunner>& sync_task_runner) 91 const scoped_refptr<base::TaskRunner>& sync_task_runner)
94 : backend_(backend), sync_task_runner_(sync_task_runner) {} 92 : backend_(backend), sync_task_runner_(sync_task_runner) {}
95 ~MockBackendDataTypeConfigurer() override {} 93 ~MockBackendDataTypeConfigurer() override {}
96 94
97 syncer::ModelTypeSet ConfigureDataTypes( 95 ModelTypeSet ConfigureDataTypes(
98 syncer::ConfigureReason reason, 96 ConfigureReason reason,
99 const DataTypeConfigStateMap& config_state_map, 97 const DataTypeConfigStateMap& config_state_map,
100 const base::Callback<void(syncer::ModelTypeSet, syncer::ModelTypeSet)>& 98 const base::Callback<void(ModelTypeSet, ModelTypeSet)>& ready_task,
101 ready_task,
102 const base::Callback<void()>& retry_callback) override { 99 const base::Callback<void()>& retry_callback) override {
103 NOTREACHED() << "Not implemented."; 100 NOTREACHED() << "Not implemented.";
104 return syncer::ModelTypeSet(); 101 return ModelTypeSet();
105 } 102 }
106 103
107 void ActivateDirectoryDataType( 104 void ActivateDirectoryDataType(ModelType type,
108 syncer::ModelType type, 105 ModelSafeGroup group,
109 syncer::ModelSafeGroup group, 106 ChangeProcessor* change_processor) override {
110 sync_driver::ChangeProcessor* change_processor) override {
111 NOTREACHED() << "Not implemented."; 107 NOTREACHED() << "Not implemented.";
112 } 108 }
113 109
114 void DeactivateDirectoryDataType(syncer::ModelType type) override { 110 void DeactivateDirectoryDataType(ModelType type) override {
115 NOTREACHED() << "Not implemented."; 111 NOTREACHED() << "Not implemented.";
116 } 112 }
117 113
118 void ActivateNonBlockingDataType(syncer::ModelType type, 114 void ActivateNonBlockingDataType(
119 std::unique_ptr<syncer_v2::ActivationContext> 115 ModelType type,
120 activation_context) override { 116 std::unique_ptr<ActivationContext> activation_context) override {
121 // Post on Sync thread just like the real implementation does. 117 // Post on Sync thread just like the real implementation does.
122 sync_task_runner_->PostTask( 118 sync_task_runner_->PostTask(
123 FROM_HERE, 119 FROM_HERE,
124 base::Bind(&MockSyncBackend::Connect, base::Unretained(backend_), type, 120 base::Bind(&MockSyncBackend::Connect, base::Unretained(backend_), type,
125 base::Passed(std::move(activation_context)))); 121 base::Passed(std::move(activation_context))));
126 } 122 }
127 123
128 void DeactivateNonBlockingDataType(syncer::ModelType type) override { 124 void DeactivateNonBlockingDataType(ModelType type) override {
129 sync_task_runner_->PostTask(FROM_HERE, 125 sync_task_runner_->PostTask(FROM_HERE,
130 base::Bind(&MockSyncBackend::Disconnect, 126 base::Bind(&MockSyncBackend::Disconnect,
131 base::Unretained(backend_), type)); 127 base::Unretained(backend_), type));
132 } 128 }
133 129
134 private: 130 private:
135 MockSyncBackend* backend_; 131 MockSyncBackend* backend_;
136 scoped_refptr<base::TaskRunner> sync_task_runner_; 132 scoped_refptr<base::TaskRunner> sync_task_runner_;
137 }; 133 };
138 134
139 } // namespace 135 } // namespace
140 136
141 class NonUIModelTypeControllerTest : public testing::Test, 137 class NonUIModelTypeControllerTest : public testing::Test,
142 public sync_driver::FakeSyncClient { 138 public FakeSyncClient {
143 public: 139 public:
144 NonUIModelTypeControllerTest() 140 NonUIModelTypeControllerTest()
145 : auto_run_tasks_(true), 141 : auto_run_tasks_(true),
146 load_models_callback_called_(false), 142 load_models_callback_called_(false),
147 association_callback_called_(false), 143 association_callback_called_(false),
148 model_thread_("modelthread"), 144 model_thread_("modelthread"),
149 configurer_(&backend_, ui_loop_.task_runner()) {} 145 configurer_(&backend_, ui_loop_.task_runner()) {}
150 146
151 ~NonUIModelTypeControllerTest() override {} 147 ~NonUIModelTypeControllerTest() override {}
152 148
153 void SetUp() override { 149 void SetUp() override {
154 model_thread_.Start(); 150 model_thread_.Start();
155 model_thread_runner_ = model_thread_.task_runner(); 151 model_thread_runner_ = model_thread_.task_runner();
156 InitializeModelTypeService(); 152 InitializeModelTypeService();
157 controller_.reset(new TestNonUIModelTypeController( 153 controller_.reset(new TestNonUIModelTypeController(
158 syncer::DICTIONARY, model_thread_runner_, base::Closure(), this)); 154 DICTIONARY, model_thread_runner_, base::Closure(), this));
159 } 155 }
160 156
161 void TearDown() override { 157 void TearDown() override {
162 ClearModelTypeService(); 158 ClearModelTypeService();
163 RunQueuedUIThreadTasks(); 159 RunQueuedUIThreadTasks();
164 } 160 }
165 161
166 base::WeakPtr<syncer_v2::ModelTypeService> GetModelTypeServiceForType( 162 base::WeakPtr<ModelTypeService> GetModelTypeServiceForType(
167 syncer::ModelType type) override { 163 ModelType type) override {
168 return service_->AsWeakPtr(); 164 return service_->AsWeakPtr();
169 } 165 }
170 166
171 protected: 167 protected:
172 std::unique_ptr<syncer_v2::ModelTypeChangeProcessor> CreateProcessor( 168 std::unique_ptr<ModelTypeChangeProcessor> CreateProcessor(
173 syncer::ModelType type, 169 ModelType type,
174 syncer_v2::ModelTypeService* service) { 170 ModelTypeService* service) {
175 std::unique_ptr<syncer_v2::SharedModelTypeProcessor> processor = 171 std::unique_ptr<SharedModelTypeProcessor> processor =
176 base::MakeUnique<syncer_v2::SharedModelTypeProcessor>(type, service); 172 base::MakeUnique<SharedModelTypeProcessor>(type, service);
177 type_processor_ = processor.get(); 173 type_processor_ = processor.get();
178 return std::move(processor); 174 return std::move(processor);
179 } 175 }
180 176
181 void InitializeModelTypeService() { 177 void InitializeModelTypeService() {
182 if (!model_thread_runner_ || 178 if (!model_thread_runner_ ||
183 model_thread_runner_->BelongsToCurrentThread()) { 179 model_thread_runner_->BelongsToCurrentThread()) {
184 service_.reset(new syncer_v2::StubModelTypeService( 180 service_.reset(new StubModelTypeService(
185 base::Bind(&NonUIModelTypeControllerTest::CreateProcessor, 181 base::Bind(&NonUIModelTypeControllerTest::CreateProcessor,
186 base::Unretained(this)))); 182 base::Unretained(this))));
187 } else { 183 } else {
188 model_thread_runner_->PostTask( 184 model_thread_runner_->PostTask(
189 FROM_HERE, 185 FROM_HERE,
190 base::Bind(&NonUIModelTypeControllerTest::InitializeModelTypeService, 186 base::Bind(&NonUIModelTypeControllerTest::InitializeModelTypeService,
191 base::Unretained(this))); 187 base::Unretained(this)));
192 RunQueuedModelThreadTasks(); 188 RunQueuedModelThreadTasks();
193 } 189 }
194 } 190 }
(...skipping 20 matching lines...) Expand all
215 FROM_HERE, 211 FROM_HERE,
216 base::Bind(&NonUIModelTypeControllerTest::ExpectProcessorConnected, 212 base::Bind(&NonUIModelTypeControllerTest::ExpectProcessorConnected,
217 base::Unretained(this), isConnected)); 213 base::Unretained(this), isConnected));
218 RunQueuedModelThreadTasks(); 214 RunQueuedModelThreadTasks();
219 } 215 }
220 } 216 }
221 217
222 void OnMetadataLoaded() { 218 void OnMetadataLoaded() {
223 if (model_thread_runner_->BelongsToCurrentThread()) { 219 if (model_thread_runner_->BelongsToCurrentThread()) {
224 if (!type_processor_->IsAllowingChanges()) { 220 if (!type_processor_->IsAllowingChanges()) {
225 type_processor_->OnMetadataLoaded( 221 type_processor_->OnMetadataLoaded(SyncError(),
226 syncer::SyncError(), base::MakeUnique<syncer_v2::MetadataBatch>()); 222 base::MakeUnique<MetadataBatch>());
227 } 223 }
228 } else { 224 } else {
229 model_thread_runner_->PostTask( 225 model_thread_runner_->PostTask(
230 FROM_HERE, base::Bind(&NonUIModelTypeControllerTest::OnMetadataLoaded, 226 FROM_HERE, base::Bind(&NonUIModelTypeControllerTest::OnMetadataLoaded,
231 base::Unretained(this))); 227 base::Unretained(this)));
232 } 228 }
233 } 229 }
234 230
235 void LoadModels() { 231 void LoadModels() {
236 controller_->LoadModels(base::Bind( 232 controller_->LoadModels(base::Bind(
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 model_thread_runner_->PostTaskAndReply( 277 model_thread_runner_->PostTaskAndReply(
282 FROM_HERE, base::Bind(&base::DoNothing), 278 FROM_HERE, base::Bind(&base::DoNothing),
283 base::Bind(&base::RunLoop::Quit, base::Unretained(&run_loop))); 279 base::Bind(&base::RunLoop::Quit, base::Unretained(&run_loop)));
284 run_loop.Run(); 280 run_loop.Run();
285 } 281 }
286 282
287 void SetAutoRunTasks(bool auto_run_tasks) { 283 void SetAutoRunTasks(bool auto_run_tasks) {
288 auto_run_tasks_ = auto_run_tasks; 284 auto_run_tasks_ = auto_run_tasks;
289 } 285 }
290 286
291 void LoadModelsDone(syncer::ModelType type, const syncer::SyncError& error) { 287 void LoadModelsDone(ModelType type, const SyncError& error) {
292 load_models_callback_called_ = true; 288 load_models_callback_called_ = true;
293 load_models_error_ = error; 289 load_models_error_ = error;
294 } 290 }
295 291
296 void AssociationDone(sync_driver::DataTypeController::ConfigureResult result, 292 void AssociationDone(DataTypeController::ConfigureResult result,
297 const syncer::SyncMergeResult& local_merge_result, 293 const SyncMergeResult& local_merge_result,
298 const syncer::SyncMergeResult& syncer_merge_result) { 294 const SyncMergeResult& syncer_merge_result) {
299 EXPECT_EQ(sync_driver::DataTypeController::OK, result); 295 EXPECT_EQ(DataTypeController::OK, result);
300 association_callback_called_ = true; 296 association_callback_called_ = true;
301 } 297 }
302 298
303 syncer_v2::SharedModelTypeProcessor* type_processor_; 299 SharedModelTypeProcessor* type_processor_;
304 std::unique_ptr<TestNonUIModelTypeController> controller_; 300 std::unique_ptr<TestNonUIModelTypeController> controller_;
305 301
306 bool auto_run_tasks_; 302 bool auto_run_tasks_;
307 bool load_models_callback_called_; 303 bool load_models_callback_called_;
308 syncer::SyncError load_models_error_; 304 SyncError load_models_error_;
309 bool association_callback_called_; 305 bool association_callback_called_;
310 base::MessageLoopForUI ui_loop_; 306 base::MessageLoopForUI ui_loop_;
311 base::Thread model_thread_; 307 base::Thread model_thread_;
312 scoped_refptr<base::SingleThreadTaskRunner> model_thread_runner_; 308 scoped_refptr<base::SingleThreadTaskRunner> model_thread_runner_;
313 MockSyncBackend backend_; 309 MockSyncBackend backend_;
314 MockBackendDataTypeConfigurer configurer_; 310 MockBackendDataTypeConfigurer configurer_;
315 std::unique_ptr<syncer_v2::StubModelTypeService> service_; 311 std::unique_ptr<StubModelTypeService> service_;
316 }; 312 };
317 313
318 TEST_F(NonUIModelTypeControllerTest, InitialState) { 314 TEST_F(NonUIModelTypeControllerTest, InitialState) {
319 EXPECT_EQ(syncer::DICTIONARY, controller_->type()); 315 EXPECT_EQ(DICTIONARY, controller_->type());
320 EXPECT_EQ(sync_driver::DataTypeController::NOT_RUNNING, controller_->state()); 316 EXPECT_EQ(DataTypeController::NOT_RUNNING, controller_->state());
321 } 317 }
322 318
323 TEST_F(NonUIModelTypeControllerTest, LoadModelsOnBackendThread) { 319 TEST_F(NonUIModelTypeControllerTest, LoadModelsOnBackendThread) {
324 SetAutoRunTasks(false); 320 SetAutoRunTasks(false);
325 LoadModels(); 321 LoadModels();
326 EXPECT_EQ(sync_driver::DataTypeController::MODEL_STARTING, 322 EXPECT_EQ(DataTypeController::MODEL_STARTING, controller_->state());
327 controller_->state());
328 RunAllTasks(); 323 RunAllTasks();
329 EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED, 324 EXPECT_EQ(DataTypeController::MODEL_LOADED, controller_->state());
330 controller_->state());
331 EXPECT_TRUE(load_models_callback_called_); 325 EXPECT_TRUE(load_models_callback_called_);
332 EXPECT_FALSE(load_models_error_.IsSet()); 326 EXPECT_FALSE(load_models_error_.IsSet());
333 ExpectProcessorConnected(false); 327 ExpectProcessorConnected(false);
334 } 328 }
335 329
336 TEST_F(NonUIModelTypeControllerTest, LoadModelsTwice) { 330 TEST_F(NonUIModelTypeControllerTest, LoadModelsTwice) {
337 LoadModels(); 331 LoadModels();
338 SetAutoRunTasks(false); 332 SetAutoRunTasks(false);
339 LoadModels(); 333 LoadModels();
340 EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED, 334 EXPECT_EQ(DataTypeController::MODEL_LOADED, controller_->state());
341 controller_->state());
342 // The second LoadModels call should set the error. 335 // The second LoadModels call should set the error.
343 EXPECT_TRUE(load_models_error_.IsSet()); 336 EXPECT_TRUE(load_models_error_.IsSet());
344 } 337 }
345 338
346 TEST_F(NonUIModelTypeControllerTest, ActivateDataTypeOnBackendThread) { 339 TEST_F(NonUIModelTypeControllerTest, ActivateDataTypeOnBackendThread) {
347 LoadModels(); 340 LoadModels();
348 EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED, 341 EXPECT_EQ(DataTypeController::MODEL_LOADED, controller_->state());
349 controller_->state());
350 RegisterWithBackend(); 342 RegisterWithBackend();
351 ExpectProcessorConnected(true); 343 ExpectProcessorConnected(true);
352 344
353 StartAssociating(); 345 StartAssociating();
354 EXPECT_EQ(sync_driver::DataTypeController::RUNNING, controller_->state()); 346 EXPECT_EQ(DataTypeController::RUNNING, controller_->state());
355 } 347 }
356 348
357 TEST_F(NonUIModelTypeControllerTest, Stop) { 349 TEST_F(NonUIModelTypeControllerTest, Stop) {
358 LoadModels(); 350 LoadModels();
359 RegisterWithBackend(); 351 RegisterWithBackend();
360 ExpectProcessorConnected(true); 352 ExpectProcessorConnected(true);
361 353
362 StartAssociating(); 354 StartAssociating();
363 355
364 DeactivateDataTypeAndStop(); 356 DeactivateDataTypeAndStop();
365 EXPECT_EQ(sync_driver::DataTypeController::NOT_RUNNING, controller_->state()); 357 EXPECT_EQ(DataTypeController::NOT_RUNNING, controller_->state());
366 } 358 }
367 359
368 } // namespace sync_driver_v2 360 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/driver/non_ui_model_type_controller.cc ('k') | components/sync/driver/pref_names.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698