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

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

Issue 10687002: sync: fix reentrancy crash in ModelAssociationManager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: reupload Created 8 years, 5 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/callback.h" 5 #include "base/callback.h"
6 #include "base/message_loop.h" 6 #include "base/message_loop.h"
7 #include "chrome/browser/sync/glue/fake_data_type_controller.h" 7 #include "chrome/browser/sync/glue/fake_data_type_controller.h"
8 #include "chrome/browser/sync/glue/model_association_manager.h" 8 #include "chrome/browser/sync/glue/model_association_manager.h"
9 #include "content/public/test/test_browser_thread.h" 9 #include "content/public/test/test_browser_thread.h"
10 #include "testing/gmock/include/gmock/gmock.h" 10 #include "testing/gmock/include/gmock/gmock.h"
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 model_association_manager.Initialize(types); 204 model_association_manager.Initialize(types);
205 model_association_manager.StopDisabledTypes(); 205 model_association_manager.StopDisabledTypes();
206 model_association_manager.StartAssociationAsync(); 206 model_association_manager.StartAssociationAsync();
207 207
208 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(), 208 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
209 DataTypeController::MODEL_LOADED); 209 DataTypeController::MODEL_LOADED);
210 GetController(controllers_, syncable::BOOKMARKS)->FinishStart( 210 GetController(controllers_, syncable::BOOKMARKS)->FinishStart(
211 DataTypeController::UNRECOVERABLE_ERROR); 211 DataTypeController::UNRECOVERABLE_ERROR);
212 } 212 }
213 213
214 TEST_F(ModelAssociationManagerTest, InitializeAbortsLoad) {
215 controllers_[syncable::BOOKMARKS] =
216 new FakeDataTypeController(syncable::BOOKMARKS);
217 controllers_[syncable::THEMES] =
218 new FakeDataTypeController(syncable::THEMES);
219
220 GetController(controllers_, syncable::BOOKMARKS)->SetDelayModelLoad();
Nicolas Zea 2012/06/27 17:52:09 it's kindda weird to me that we use GetController
221 ModelAssociationManager model_association_manager(&controllers_,
222 &result_processor_);
223 syncable::ModelTypeSet types;
224 types.Put(syncable::BOOKMARKS);
225 types.Put(syncable::THEMES);
226
227 syncable::ModelTypeSet expected_types_waiting_to_load;
Nicolas Zea 2012/06/27 17:52:09 expected_types_waiting_to_load(syncable::BOOKMARKS
228 expected_types_waiting_to_load.Put(syncable::BOOKMARKS);
229 DataTypeManager::ConfigureResult expected_result_partially_done(
230 DataTypeManager::PARTIAL_SUCCESS,
231 types,
232 std::list<csync::SyncError>(),
233 expected_types_waiting_to_load);
234
235 model_association_manager.Initialize(types);
236 model_association_manager.StopDisabledTypes();
237
238 model_association_manager.StartAssociationAsync();
239
240 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
241 WillOnce(VerifyResult(expected_result_partially_done));
242
243 base::OneShotTimer<ModelAssociationManager>* timer =
244 model_association_manager.GetTimerForTesting();
245
246 // Note: Independent of the timeout value this test is not flaky.
247 // The reason is timer posts a task which would never be executed
248 // as we dont let the message loop run.
249 base::Closure task = timer->user_task();
250 timer->Stop();
251 task.Run(); // Bookmark load times out here.
252
253 // Apps finishes associating here.
254 GetController(controllers_, syncable::THEMES)->FinishStart(
255 DataTypeController::OK);
256
257 // At this point, BOOKMARKS is still waiting to load (as evidenced by
258 // expected_result_partially_done). If we schedule another Initialize (which
259 // could happen in practice due to reconfiguration), this should abort
260 // BOOKMARKS. Aborting will call ModelLoadCallback, but the
261 // ModelAssociationManager should be smart enough to know that this is not due
262 // to the type having completed loading.
263 EXPECT_CALL(result_processor_, OnTypesLoaded()).Times(0);
264
265 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
266 DataTypeController::MODEL_STARTING);
267
268 model_association_manager.Initialize(types);
269 EXPECT_EQ(GetController(controllers_, syncable::BOOKMARKS)->state(),
270 DataTypeController::NOT_RUNNING);
271
272 DataTypeManager::ConfigureResult expected_result_done(
273 DataTypeManager::OK,
274 types,
275 std::list<csync::SyncError>(),
276 syncable::ModelTypeSet());
277 EXPECT_CALL(result_processor_, OnModelAssociationDone(_)).
278 WillOnce(VerifyResult(expected_result_done));
279
280 model_association_manager.StopDisabledTypes();
281 model_association_manager.StartAssociationAsync();
282
283 GetController(controllers_,
284 syncable::BOOKMARKS)->SimulateModelLoadFinishing();
285 GetController(controllers_, syncable::BOOKMARKS)->FinishStart(
286 DataTypeController::OK);
287 }
288
214 // Start 2 types. One of which timeout loading. Ensure that type is 289 // Start 2 types. One of which timeout loading. Ensure that type is
215 // fully configured eventually. 290 // fully configured eventually.
216 TEST_F(ModelAssociationManagerTest, ModelStartWithSlowLoadingType) { 291 TEST_F(ModelAssociationManagerTest, ModelStartWithSlowLoadingType) {
217 controllers_[syncable::BOOKMARKS] = 292 controllers_[syncable::BOOKMARKS] =
218 new FakeDataTypeController(syncable::BOOKMARKS); 293 new FakeDataTypeController(syncable::BOOKMARKS);
219 controllers_[syncable::APPS] = 294 controllers_[syncable::APPS] =
220 new FakeDataTypeController(syncable::APPS); 295 new FakeDataTypeController(syncable::APPS);
221 GetController(controllers_, syncable::BOOKMARKS)->SetDelayModelLoad(); 296 GetController(controllers_, syncable::BOOKMARKS)->SetDelayModelLoad();
222 ModelAssociationManager model_association_manager(&controllers_, 297 ModelAssociationManager model_association_manager(&controllers_,
223 &result_processor_); 298 &result_processor_);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 349
275 GetController(controllers_, 350 GetController(controllers_,
276 syncable::BOOKMARKS)->SimulateModelLoadFinishing(); 351 syncable::BOOKMARKS)->SimulateModelLoadFinishing();
277 352
278 GetController(controllers_, syncable::BOOKMARKS)->FinishStart( 353 GetController(controllers_, syncable::BOOKMARKS)->FinishStart(
279 DataTypeController::OK); 354 DataTypeController::OK);
280 } 355 }
281 356
282 357
283 } // namespace browser_sync 358 } // namespace browser_sync
284
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698