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

Side by Side Diff: chrome/browser/sync/glue/model_association_manager_unittest.cc

Issue 10387144: [Sync] - Implement isolated model association. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: For review. Created 8 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 "base/message_loop.h" 5 #include "base/message_loop.h"
6 #include "chrome/browser/sync/glue/fake_data_type_controller.h" 6 #include "chrome/browser/sync/glue/fake_data_type_controller.h"
7 #include "chrome/browser/sync/glue/model_association_manager.h" 7 #include "chrome/browser/sync/glue/model_association_manager.h"
8 #include "content/test/test_browser_thread.h" 8 #include "content/test/test_browser_thread.h"
9 #include "testing/gmock/include/gmock/gmock.h" 9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 11
12 using ::testing::_; 12 using ::testing::_;
13 namespace browser_sync { 13 namespace browser_sync {
14 class MockModelAssociationResultProcessor : 14 class MockModelAssociationResultProcessor :
15 public ModelAssociationResultProcessor { 15 public ModelAssociationResultProcessor {
16 public: 16 public:
17 MockModelAssociationResultProcessor() {} 17 MockModelAssociationResultProcessor() {}
18 ~MockModelAssociationResultProcessor() {} 18 ~MockModelAssociationResultProcessor() {}
19 MOCK_METHOD1(OnModelAssociationDone, void( 19 MOCK_METHOD1(OnModelAssociationDone, void(
20 const DataTypeManager::ConfigureResult& result)); 20 const DataTypeManager::ConfigureResult& result));
21 MOCK_METHOD0(OnTypesLoaded, void());
21 }; 22 };
22 23
23 scoped_refptr<FakeDataTypeController> GetController( 24 scoped_refptr<FakeDataTypeController> GetController(
24 const DataTypeController::TypeMap& controllers, 25 const DataTypeController::TypeMap& controllers,
25 syncable::ModelType model_type) { 26 syncable::ModelType model_type) {
26 DataTypeController::TypeMap::const_iterator it = 27 DataTypeController::TypeMap::const_iterator it =
27 controllers.find(model_type); 28 controllers.find(model_type);
28 if (it == controllers.end()) { 29 if (it == controllers.end()) {
29 return NULL; 30 return NULL;
30 } 31 }
31 return make_scoped_refptr( 32 return make_scoped_refptr(
32 static_cast<FakeDataTypeController*>(it->second.get())); 33 static_cast<FakeDataTypeController*>(it->second.get()));
33 } 34 }
34 35
35 ACTION_P(VerifyResult, expected_result) { 36 ACTION_P(VerifyResult, expected_result) {
36 EXPECT_EQ(arg0.status, expected_result.status); 37 EXPECT_EQ(arg0.status, expected_result.status);
37 EXPECT_TRUE(arg0.requested_types.Equals(expected_result.requested_types)); 38 EXPECT_TRUE(arg0.requested_types.Equals(expected_result.requested_types));
38 EXPECT_EQ(arg0.errors.size(), expected_result.errors.size()); 39 EXPECT_EQ(arg0.failed_data_types.size(),
40 expected_result.failed_data_types.size());
39 41
40 if (arg0.errors.size() == expected_result.errors.size()) { 42 if (arg0.failed_data_types.size() ==
43 expected_result.failed_data_types.size()) {
41 std::list<SyncError>::const_iterator it1, it2; 44 std::list<SyncError>::const_iterator it1, it2;
42 for (it1 = arg0.errors.begin(), 45 for (it1 = arg0.failed_data_types.begin(),
43 it2 = expected_result.errors.begin(); 46 it2 = expected_result.failed_data_types.begin();
44 it1 != arg0.errors.end(); 47 it1 != arg0.failed_data_types.end();
45 ++it1, ++it2) { 48 ++it1, ++it2) {
46 EXPECT_EQ((*it1).type(), (*it2).type()); 49 EXPECT_EQ((*it1).type(), (*it2).type());
47 } 50 }
48 } 51 }
52
53 EXPECT_TRUE(arg0.waiting_to_start.Equals(expected_result.waiting_to_start));
49 } 54 }
50 55
51 class ModelAssociationManagerTest : public testing::Test { 56 class ModelAssociationManagerTest : public testing::Test {
52 public: 57 public:
53 ModelAssociationManagerTest() : 58 ModelAssociationManagerTest() :
54 ui_thread_(content::BrowserThread::UI, &ui_loop_) { 59 ui_thread_(content::BrowserThread::UI, &ui_loop_) {
55 } 60 }
56 61
57 protected: 62 protected:
58 MessageLoopForUI ui_loop_; 63 MessageLoopForUI ui_loop_;
59 content::TestBrowserThread ui_thread_; 64 content::TestBrowserThread ui_thread_;
60 MockModelAssociationResultProcessor result_processor_; 65 MockModelAssociationResultProcessor result_processor_;
61 DataTypeController::TypeMap controllers_; 66 DataTypeController::TypeMap controllers_;
62 }; 67 };
63 68
64 // Start a type and make sure ModelAssociationManager callst the |Start| 69 // Start a type and make sure ModelAssociationManager callst the |Start|
65 // method and calls the callback when it is done. 70 // method and calls the callback when it is done.
66 TEST_F(ModelAssociationManagerTest, SimpleModelStart) { 71 TEST_F(ModelAssociationManagerTest, SimpleModelStart) {
67 controllers_[syncable::BOOKMARKS] = 72 controllers_[syncable::BOOKMARKS] =
68 new FakeDataTypeController(syncable::BOOKMARKS); 73 new FakeDataTypeController(syncable::BOOKMARKS);
69 ModelAssociationManager model_association_manager(&controllers_, 74 ModelAssociationManager model_association_manager(&controllers_,
70 &result_processor_); 75 &result_processor_);
71 syncable::ModelTypeSet types; 76 syncable::ModelTypeSet types;
72 types.Put(syncable::BOOKMARKS); 77 types.Put(syncable::BOOKMARKS);
73 DataTypeManager::ConfigureResult expected_result( 78 DataTypeManager::ConfigureResult expected_result(
74 DataTypeManager::OK, 79 DataTypeManager::OK,
75 types, 80 types,
76 std::list<SyncError>()); 81 std::list<SyncError>(),
82 syncable::ModelTypeSet());
77 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)). 83 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
78 WillOnce(VerifyResult(expected_result)); 84 WillOnce(VerifyResult(expected_result));
79 85
80 model_association_manager.Initialize(types); 86 model_association_manager.Initialize(types);
81 model_association_manager.StopDisabledTypes(); 87 model_association_manager.StopDisabledTypes();
82 model_association_manager.StartAssociationAsync(); 88 model_association_manager.StartAssociationAsync();
83 89
84 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(), 90 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
85 DataTypeController::MODEL_STARTING); 91 DataTypeController::MODEL_STARTING);
86 GetController(controllers_, syncable::BOOKMARKS)->FinishStart( 92 GetController(controllers_, syncable::BOOKMARKS)->FinishStart(
87 DataTypeController::OK); 93 DataTypeController::OK);
88 } 94 }
89 95
90 // Start a type and call stop before it finishes associating. 96 // Start a type and call stop before it finishes associating.
91 TEST_F(ModelAssociationManagerTest, StopModelBeforeFinish) { 97 TEST_F(ModelAssociationManagerTest, StopModelBeforeFinish) {
92 controllers_[syncable::BOOKMARKS] = 98 controllers_[syncable::BOOKMARKS] =
93 new FakeDataTypeController(syncable::BOOKMARKS); 99 new FakeDataTypeController(syncable::BOOKMARKS);
94 ModelAssociationManager model_association_manager(&controllers_, 100 ModelAssociationManager model_association_manager(&controllers_,
95 &result_processor_); 101 &result_processor_);
96 102
97 syncable::ModelTypeSet types; 103 syncable::ModelTypeSet types;
98 types.Put(syncable::BOOKMARKS); 104 types.Put(syncable::BOOKMARKS);
99 105
100 DataTypeManager::ConfigureResult expected_result( 106 DataTypeManager::ConfigureResult expected_result(
101 DataTypeManager::ABORTED, 107 DataTypeManager::ABORTED,
102 types, 108 types,
103 std::list<SyncError>()); 109 std::list<SyncError>(),
110 syncable::ModelTypeSet());
104 111
105 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)). 112 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
106 WillOnce(VerifyResult(expected_result)); 113 WillOnce(VerifyResult(expected_result));
107 114
108 model_association_manager.Initialize(types); 115 model_association_manager.Initialize(types);
109 model_association_manager.StopDisabledTypes(); 116 model_association_manager.StopDisabledTypes();
110 model_association_manager.StartAssociationAsync(); 117 model_association_manager.StartAssociationAsync();
111 118
112 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(), 119 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
113 DataTypeController::MODEL_STARTING); 120 DataTypeController::MODEL_STARTING);
114 model_association_manager.Stop(); 121 model_association_manager.Stop();
115 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(), 122 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
116 DataTypeController::NOT_RUNNING); 123 DataTypeController::NOT_RUNNING);
117 } 124 }
118 125
119 // Start a type, let it finish and then call stop. 126 // Start a type, let it finish and then call stop.
120 TEST_F(ModelAssociationManagerTest, StopAfterFinish) { 127 TEST_F(ModelAssociationManagerTest, StopAfterFinish) {
121 controllers_[syncable::BOOKMARKS] = 128 controllers_[syncable::BOOKMARKS] =
122 new FakeDataTypeController(syncable::BOOKMARKS); 129 new FakeDataTypeController(syncable::BOOKMARKS);
123 ModelAssociationManager model_association_manager(&controllers_, 130 ModelAssociationManager model_association_manager(&controllers_,
124 &result_processor_); 131 &result_processor_);
125 syncable::ModelTypeSet types; 132 syncable::ModelTypeSet types;
126 types.Put(syncable::BOOKMARKS); 133 types.Put(syncable::BOOKMARKS);
127 DataTypeManager::ConfigureResult expected_result( 134 DataTypeManager::ConfigureResult expected_result(
128 DataTypeManager::OK, 135 DataTypeManager::OK,
129 types, 136 types,
130 std::list<SyncError>()); 137 std::list<SyncError>(),
138 syncable::ModelTypeSet());
131 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)). 139 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
132 WillOnce(VerifyResult(expected_result)); 140 WillOnce(VerifyResult(expected_result));
133 141
134 model_association_manager.Initialize(types); 142 model_association_manager.Initialize(types);
135 model_association_manager.StopDisabledTypes(); 143 model_association_manager.StopDisabledTypes();
136 model_association_manager.StartAssociationAsync(); 144 model_association_manager.StartAssociationAsync();
137 145
138 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(), 146 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
139 DataTypeController::MODEL_STARTING); 147 DataTypeController::MODEL_STARTING);
140 GetController(controllers_, syncable::BOOKMARKS)->FinishStart( 148 GetController(controllers_, syncable::BOOKMARKS)->FinishStart(
(...skipping 11 matching lines...) Expand all
152 ModelAssociationManager model_association_manager(&controllers_, 160 ModelAssociationManager model_association_manager(&controllers_,
153 &result_processor_); 161 &result_processor_);
154 syncable::ModelTypeSet types; 162 syncable::ModelTypeSet types;
155 types.Put(syncable::BOOKMARKS); 163 types.Put(syncable::BOOKMARKS);
156 std::list<SyncError> errors; 164 std::list<SyncError> errors;
157 SyncError error(FROM_HERE, "Failed", syncable::BOOKMARKS); 165 SyncError error(FROM_HERE, "Failed", syncable::BOOKMARKS);
158 errors.push_back(error); 166 errors.push_back(error);
159 DataTypeManager::ConfigureResult expected_result( 167 DataTypeManager::ConfigureResult expected_result(
160 DataTypeManager::PARTIAL_SUCCESS, 168 DataTypeManager::PARTIAL_SUCCESS,
161 types, 169 types,
162 errors); 170 errors,
171 syncable::ModelTypeSet());
163 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)). 172 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
164 WillOnce(VerifyResult(expected_result)); 173 WillOnce(VerifyResult(expected_result));
165 174
166 model_association_manager.Initialize(types); 175 model_association_manager.Initialize(types);
167 model_association_manager.StopDisabledTypes(); 176 model_association_manager.StopDisabledTypes();
168 model_association_manager.StartAssociationAsync(); 177 model_association_manager.StartAssociationAsync();
169 178
170 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(), 179 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
171 DataTypeController::MODEL_STARTING); 180 DataTypeController::MODEL_STARTING);
172 GetController(controllers_, syncable::BOOKMARKS)->FinishStart( 181 GetController(controllers_, syncable::BOOKMARKS)->FinishStart(
173 DataTypeController::ASSOCIATION_FAILED); 182 DataTypeController::ASSOCIATION_FAILED);
174 } 183 }
175 184
176 // Ensure configuring stops when a type returns a unrecoverable error. 185 // Ensure configuring stops when a type returns a unrecoverable error.
177 TEST_F(ModelAssociationManagerTest, TypeReturnUnrecoverableError) { 186 TEST_F(ModelAssociationManagerTest, TypeReturnUnrecoverableError) {
178 controllers_[syncable::BOOKMARKS] = 187 controllers_[syncable::BOOKMARKS] =
179 new FakeDataTypeController(syncable::BOOKMARKS); 188 new FakeDataTypeController(syncable::BOOKMARKS);
180 ModelAssociationManager model_association_manager(&controllers_, 189 ModelAssociationManager model_association_manager(&controllers_,
181 &result_processor_); 190 &result_processor_);
182 syncable::ModelTypeSet types; 191 syncable::ModelTypeSet types;
183 types.Put(syncable::BOOKMARKS); 192 types.Put(syncable::BOOKMARKS);
184 std::list<SyncError> errors; 193 std::list<SyncError> errors;
185 SyncError error(FROM_HERE, "Failed", syncable::BOOKMARKS); 194 SyncError error(FROM_HERE, "Failed", syncable::BOOKMARKS);
186 errors.push_back(error); 195 errors.push_back(error);
187 DataTypeManager::ConfigureResult expected_result( 196 DataTypeManager::ConfigureResult expected_result(
188 DataTypeManager::UNRECOVERABLE_ERROR, 197 DataTypeManager::UNRECOVERABLE_ERROR,
189 types, 198 types,
190 errors); 199 errors,
200 syncable::ModelTypeSet());
191 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)). 201 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
192 WillOnce(VerifyResult(expected_result)); 202 WillOnce(VerifyResult(expected_result));
193 203
194 model_association_manager.Initialize(types); 204 model_association_manager.Initialize(types);
195 model_association_manager.StopDisabledTypes(); 205 model_association_manager.StopDisabledTypes();
196 model_association_manager.StartAssociationAsync(); 206 model_association_manager.StartAssociationAsync();
197 207
198 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(), 208 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
199 DataTypeController::MODEL_STARTING); 209 DataTypeController::MODEL_STARTING);
200 GetController(controllers_, syncable::BOOKMARKS)->FinishStart( 210 GetController(controllers_, syncable::BOOKMARKS)->FinishStart(
201 DataTypeController::UNRECOVERABLE_ERROR); 211 DataTypeController::UNRECOVERABLE_ERROR);
202 } 212 }
203 213
214 // Start 2 types. One of which timeout loading. Ensure that type is
215 // fully configured eventually.
216 TEST_F(ModelAssociationManagerTest, ModelStartWithSlowLoadingType) {
217 controllers_[syncable::BOOKMARKS] =
218 new FakeDataTypeController(syncable::BOOKMARKS);
219 controllers_[syncable::APPS] =
220 new FakeDataTypeController(syncable::APPS);
221 GetController(controllers_, syncable::BOOKMARKS)->SetDelayModelLoad();
222 ModelAssociationManager model_association_manager(&controllers_,
223 &result_processor_);
224 syncable::ModelTypeSet types;
225 types.Put(syncable::BOOKMARKS);
226 types.Put(syncable::APPS);
227
228 syncable::ModelTypeSet expected_types_waiting_to_load;
229 expected_types_waiting_to_load.Put(syncable::BOOKMARKS);
230 DataTypeManager::ConfigureResult expected_result_partially_done(
231 DataTypeManager::PARTIAL_SUCCESS,
232 types,
233 std::list<SyncError>(),
234 expected_types_waiting_to_load);
235
236 DataTypeManager::ConfigureResult expected_result_done(
237 DataTypeManager::OK,
238 types,
239 std::list<SyncError>(),
240 syncable::ModelTypeSet());
241
242
243 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
244 WillOnce(VerifyResult(expected_result_partially_done));
245 EXPECT_CALL(result_processor_, OnTypesLoaded());
246
247 model_association_manager.Initialize(types);
248 model_association_manager.StopDisabledTypes();
249 model_association_manager.StartAssociationAsync();
250
251 model_association_manager.TestSimulateDataTypeLoadTimeout();
252
253 GetController(controllers_, syncable::APPS)->FinishStart(
254 DataTypeController::OK);
255
256 GetController(controllers_, syncable::BOOKMARKS)->FinishModelLoad();
257
258 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
259 WillOnce(VerifyResult(expected_result_done));
260
261 // Do it once more to associate bookmarks.
262 model_association_manager.Initialize(types);
263 model_association_manager.StopDisabledTypes();
264 model_association_manager.StartAssociationAsync();
265
266 GetController(controllers_, syncable::BOOKMARKS)->FinishModelLoad();
267
268 GetController(controllers_, syncable::BOOKMARKS)->FinishStart(
269 DataTypeController::OK);
270 }
271
272
204 } // namespace browser_sync 273 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698