| Index: chrome/browser/sync/profile_sync_service_autofill_unittest.cc
|
| diff --git a/chrome/browser/sync/profile_sync_service_autofill_unittest.cc b/chrome/browser/sync/profile_sync_service_autofill_unittest.cc
|
| index 889a7454ea5b0f45294cbe0c1d80038399df1f50..b32d1629042347abc9d0957f6529913ad54c18e5 100644
|
| --- a/chrome/browser/sync/profile_sync_service_autofill_unittest.cc
|
| +++ b/chrome/browser/sync/profile_sync_service_autofill_unittest.cc
|
| @@ -24,6 +24,7 @@
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/synchronization/waitable_event.h"
|
| #include "base/thread_task_runner_handle.h"
|
| +#include "base/threading/thread.h"
|
| #include "base/time/time.h"
|
| #include "chrome/browser/sync/abstract_profile_sync_service_test.h"
|
| #include "chrome/browser/sync/test_profile_sync_service.h"
|
| @@ -46,7 +47,6 @@
|
| #include "components/syncable_prefs/pref_service_syncable.h"
|
| #include "components/webdata/common/web_database.h"
|
| #include "components/webdata_services/web_data_service_test_util.h"
|
| -#include "content/public/test/test_browser_thread.h"
|
| #include "sync/internal_api/public/base/model_type.h"
|
| #include "sync/internal_api/public/data_type_debug_info_listener.h"
|
| #include "sync/internal_api/public/read_node.h"
|
| @@ -74,7 +74,6 @@ using base::TimeDelta;
|
| using base::WaitableEvent;
|
| using browser_sync::AutofillDataTypeController;
|
| using browser_sync::AutofillProfileDataTypeController;
|
| -using content::BrowserThread;
|
| using syncer::AUTOFILL;
|
| using syncer::AUTOFILL_PROFILE;
|
| using syncer::BaseNode;
|
| @@ -144,12 +143,12 @@ class WebDatabaseFake : public WebDatabase {
|
|
|
| class MockAutofillBackend : public autofill::AutofillWebDataBackend {
|
| public:
|
| - MockAutofillBackend(
|
| - WebDatabase* web_database,
|
| - const base::Closure& on_changed)
|
| + MockAutofillBackend(WebDatabase* web_database,
|
| + const base::Closure& on_changed,
|
| + const scoped_refptr<base::SequencedTaskRunner>& ui_thread)
|
| : web_database_(web_database),
|
| - on_changed_(on_changed) {
|
| - }
|
| + on_changed_(on_changed),
|
| + ui_thread_(ui_thread) {}
|
|
|
| ~MockAutofillBackend() override {}
|
| WebDatabase* GetDatabase() override { return web_database_; }
|
| @@ -159,13 +158,14 @@ class MockAutofillBackend : public autofill::AutofillWebDataBackend {
|
| autofill::AutofillWebDataServiceObserverOnDBThread* observer) override {}
|
| void RemoveExpiredFormElements() override {}
|
| void NotifyOfMultipleAutofillChanges() override {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::DB);
|
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, on_changed_);
|
| + DCHECK(!ui_thread_->RunsTasksOnCurrentThread());
|
| + ui_thread_->PostTask(FROM_HERE, on_changed_);
|
| }
|
|
|
| private:
|
| WebDatabase* web_database_;
|
| base::Closure on_changed_;
|
| + const scoped_refptr<base::SequencedTaskRunner> ui_thread_;
|
| };
|
|
|
| class ProfileSyncServiceAutofillTest;
|
| @@ -187,11 +187,10 @@ syncer::ModelType GetModelType<AutofillProfile>() {
|
|
|
| class TokenWebDataServiceFake : public TokenWebData {
|
| public:
|
| - TokenWebDataServiceFake()
|
| - : TokenWebData(
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)) {
|
| - }
|
| + TokenWebDataServiceFake(
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& ui_thread,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& db_thread)
|
| + : TokenWebData(ui_thread, db_thread) {}
|
|
|
| bool IsDatabaseLoaded() override { return true; }
|
|
|
| @@ -215,15 +214,16 @@ class TokenWebDataServiceFake : public TokenWebData {
|
|
|
| class WebDataServiceFake : public AutofillWebDataService {
|
| public:
|
| - WebDataServiceFake()
|
| - : AutofillWebDataService(
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)),
|
| + WebDataServiceFake(
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& ui_thread,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& db_thread)
|
| + : AutofillWebDataService(ui_thread, db_thread),
|
| web_database_(NULL),
|
| autocomplete_syncable_service_(NULL),
|
| autofill_profile_syncable_service_(NULL),
|
| - syncable_service_created_or_destroyed_(false, false) {
|
| - }
|
| + syncable_service_created_or_destroyed_(false, false),
|
| + db_thread_(db_thread),
|
| + ui_thread_(ui_thread) {}
|
|
|
| void SetDatabase(WebDatabase* web_database) {
|
| web_database_ = web_database;
|
| @@ -236,19 +236,18 @@ class WebDataServiceFake : public AutofillWebDataService {
|
| &WebDataServiceFake::NotifyAutofillMultipleChangedOnUIThread,
|
| AsWeakPtr());
|
|
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&WebDataServiceFake::CreateSyncableService,
|
| - base::Unretained(this),
|
| - on_changed_callback));
|
| + db_thread_->PostTask(
|
| + FROM_HERE, base::Bind(&WebDataServiceFake::CreateSyncableService,
|
| + base::Unretained(this), on_changed_callback));
|
| syncable_service_created_or_destroyed_.Wait();
|
| }
|
|
|
| void ShutdownSyncableService() {
|
| // The |autofill_profile_syncable_service_| must be destructed on the DB
|
| // thread.
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&WebDataServiceFake::DestroySyncableService,
|
| - base::Unretained(this)));
|
| + db_thread_->PostTask(FROM_HERE,
|
| + base::Bind(&WebDataServiceFake::DestroySyncableService,
|
| + base::Unretained(this)));
|
| syncable_service_created_or_destroyed_.Wait();
|
| }
|
|
|
| @@ -263,10 +262,8 @@ class WebDataServiceFake : public AutofillWebDataService {
|
| base::Bind(&AutocompleteSyncableService::AutofillEntriesChanged,
|
| base::Unretained(autocomplete_syncable_service_),
|
| changes);
|
| - BrowserThread::PostTask(
|
| - BrowserThread::DB,
|
| - FROM_HERE,
|
| - base::Bind(&RunAndSignal, notify_cb, &event));
|
| + db_thread_->PostTask(FROM_HERE,
|
| + base::Bind(&RunAndSignal, notify_cb, &event));
|
| event.Wait();
|
| }
|
|
|
| @@ -277,10 +274,8 @@ class WebDataServiceFake : public AutofillWebDataService {
|
| base::Bind(&AutocompleteSyncableService::AutofillProfileChanged,
|
| base::Unretained(autofill_profile_syncable_service_),
|
| changes);
|
| - BrowserThread::PostTask(
|
| - BrowserThread::DB,
|
| - FROM_HERE,
|
| - base::Bind(&RunAndSignal, notify_cb, &event));
|
| + db_thread_->PostTask(FROM_HERE,
|
| + base::Bind(&RunAndSignal, notify_cb, &event));
|
| event.Wait();
|
| }
|
|
|
| @@ -288,10 +283,10 @@ class WebDataServiceFake : public AutofillWebDataService {
|
| ~WebDataServiceFake() override {}
|
|
|
| void CreateSyncableService(const base::Closure& on_changed_callback) {
|
| - ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| + ASSERT_TRUE(db_thread_->RunsTasksOnCurrentThread());
|
| // These services are deleted in DestroySyncableService().
|
| - backend_.reset(new MockAutofillBackend(
|
| - GetDatabase(), on_changed_callback));
|
| + backend_.reset(new MockAutofillBackend(GetDatabase(), on_changed_callback,
|
| + ui_thread_.get()));
|
| AutocompleteSyncableService::CreateForWebDataServiceAndBackend(
|
| this, backend_.get());
|
| AutofillProfileSyncableService::CreateForWebDataServiceAndBackend(
|
| @@ -306,7 +301,7 @@ class WebDataServiceFake : public AutofillWebDataService {
|
| }
|
|
|
| void DestroySyncableService() {
|
| - ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| + ASSERT_TRUE(db_thread_->RunsTasksOnCurrentThread());
|
| autocomplete_syncable_service_ = NULL;
|
| autofill_profile_syncable_service_ = NULL;
|
| backend_.reset();
|
| @@ -320,16 +315,12 @@ class WebDataServiceFake : public AutofillWebDataService {
|
|
|
| WaitableEvent syncable_service_created_or_destroyed_;
|
|
|
| + const scoped_refptr<base::SingleThreadTaskRunner> db_thread_;
|
| + const scoped_refptr<base::SingleThreadTaskRunner> ui_thread_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(WebDataServiceFake);
|
| };
|
|
|
| -ACTION_P(MakeAutocompleteSyncComponents, wds) {
|
| - EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| - if (!BrowserThread::CurrentlyOn(BrowserThread::DB))
|
| - return base::WeakPtr<syncer::SyncableService>();
|
| - return AutocompleteSyncableService::FromWebDataService(wds)->AsWeakPtr();
|
| -}
|
| -
|
| ACTION_P(ReturnNewDataTypeManagerWithDebugListener, debug_listener) {
|
| return new sync_driver::DataTypeManagerImpl(
|
| debug_listener,
|
| @@ -367,9 +358,15 @@ class ProfileSyncServiceAutofillTest
|
| RegisterAutofillPrefs(
|
| profile_sync_service_bundle_.pref_service()->registry());
|
|
|
| + data_type_thread_.Start();
|
| + profile_sync_service_bundle_.set_db_thread(data_type_thread_.task_runner());
|
| +
|
| web_database_.reset(new WebDatabaseFake(&autofill_table_));
|
| web_data_wrapper_ = make_scoped_ptr(new MockWebDataServiceWrapper(
|
| - new WebDataServiceFake(), new TokenWebDataServiceFake()));
|
| + new WebDataServiceFake(base::ThreadTaskRunnerHandle::Get(),
|
| + data_type_thread_.task_runner()),
|
| + new TokenWebDataServiceFake(base::ThreadTaskRunnerHandle::Get(),
|
| + data_type_thread_.task_runner())));
|
| web_data_service_ = static_cast<WebDataServiceFake*>(
|
| web_data_wrapper_->GetAutofillWebData().get());
|
| web_data_service_->SetDatabase(web_database_.get());
|
| @@ -407,10 +404,15 @@ class ProfileSyncServiceAutofillTest
|
| }
|
|
|
| ~ProfileSyncServiceAutofillTest() override {
|
| - // Note: The tear down order is important.
|
| - sync_service_->Shutdown();
|
| web_data_service_->ShutdownOnUIThread();
|
| web_data_service_->ShutdownSyncableService();
|
| + web_data_wrapper_->Shutdown();
|
| + web_data_service_ = nullptr;
|
| + web_data_wrapper_.reset();
|
| + web_database_.reset();
|
| + // Shut down the service explicitly before some data members from this
|
| + // test it needs will be deleted.
|
| + sync_service_->Shutdown();
|
| }
|
|
|
| int GetSyncCount(syncer::ModelType type) {
|
| @@ -590,13 +592,11 @@ class ProfileSyncServiceAutofillTest
|
| DCHECK(type == AUTOFILL || type == AUTOFILL_PROFILE);
|
| if (type == AUTOFILL) {
|
| return new AutofillDataTypeController(
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB),
|
| + base::ThreadTaskRunnerHandle::Get(), data_type_thread_.task_runner(),
|
| base::Bind(&base::DoNothing), sync_client_, web_data_service_);
|
| } else {
|
| return new AutofillProfileDataTypeController(
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB),
|
| + base::ThreadTaskRunnerHandle::Get(), data_type_thread_.task_runner(),
|
| base::Bind(&base::DoNothing), sync_client_, web_data_service_);
|
| }
|
| }
|
| @@ -674,20 +674,20 @@ class WriteTransactionTest: public WriteTransaction {
|
| WriteTransactionTest(const tracked_objects::Location& from_here,
|
| WriterTag writer,
|
| syncer::syncable::Directory* directory,
|
| - scoped_ptr<WaitableEvent>* wait_for_syncapi)
|
| + WaitableEvent* wait_for_syncapi)
|
| : WriteTransaction(from_here, writer, directory),
|
| - wait_for_syncapi_(wait_for_syncapi) { }
|
| + wait_for_syncapi_(wait_for_syncapi) {}
|
|
|
| void NotifyTransactionComplete(syncer::ModelTypeSet types) override {
|
| // This is where we differ. Force a thread change here, giving another
|
| // thread a chance to create a WriteTransaction
|
| - (*wait_for_syncapi_)->Wait();
|
| + wait_for_syncapi_->Wait();
|
|
|
| WriteTransaction::NotifyTransactionComplete(types);
|
| }
|
|
|
| private:
|
| - scoped_ptr<WaitableEvent>* wait_for_syncapi_;
|
| + WaitableEvent* const wait_for_syncapi_;
|
| };
|
|
|
| // Our fake server updater. Needs the RefCountedThreadSafe inheritance so we can
|
| @@ -695,17 +695,19 @@ class WriteTransactionTest: public WriteTransaction {
|
| class FakeServerUpdater : public base::RefCountedThreadSafe<FakeServerUpdater> {
|
| public:
|
| FakeServerUpdater(TestProfileSyncService* service,
|
| - scoped_ptr<WaitableEvent>* wait_for_start,
|
| - scoped_ptr<WaitableEvent>* wait_for_syncapi)
|
| + WaitableEvent* wait_for_start,
|
| + WaitableEvent* wait_for_syncapi,
|
| + scoped_refptr<base::SequencedTaskRunner> db_thread)
|
| : entry_(ProfileSyncServiceAutofillTest::MakeAutofillEntry("0", "0", 0)),
|
| service_(service),
|
| wait_for_start_(wait_for_start),
|
| wait_for_syncapi_(wait_for_syncapi),
|
| - is_finished_(false, false) { }
|
| + is_finished_(false, false),
|
| + db_thread_(db_thread) {}
|
|
|
| void Update() {
|
| // This gets called in a modelsafeworker thread.
|
| - ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| + ASSERT_TRUE(db_thread_->RunsTasksOnCurrentThread());
|
|
|
| syncer::UserShare* user_share = service_->GetUserShare();
|
| syncer::syncable::Directory* directory = user_share->directory.get();
|
| @@ -728,7 +730,7 @@ class FakeServerUpdater : public base::RefCountedThreadSafe<FakeServerUpdater> {
|
|
|
| {
|
| // Tell main thread we've started
|
| - (*wait_for_start_)->Signal();
|
| + wait_for_start_->Signal();
|
|
|
| // Create write transaction.
|
| WriteTransactionTest trans(FROM_HERE, UNITTEST, directory,
|
| @@ -754,10 +756,9 @@ class FakeServerUpdater : public base::RefCountedThreadSafe<FakeServerUpdater> {
|
|
|
| void CreateNewEntry(const AutofillEntry& entry) {
|
| entry_ = entry;
|
| - ASSERT_FALSE(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| - if (!BrowserThread::PostTask(
|
| - BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&FakeServerUpdater::Update, this))) {
|
| + ASSERT_FALSE(db_thread_->RunsTasksOnCurrentThread());
|
| + if (!db_thread_->PostTask(FROM_HERE,
|
| + base::Bind(&FakeServerUpdater::Update, this))) {
|
| NOTREACHED() << "Failed to post task to the db thread.";
|
| return;
|
| }
|
| @@ -773,10 +774,13 @@ class FakeServerUpdater : public base::RefCountedThreadSafe<FakeServerUpdater> {
|
|
|
| AutofillEntry entry_;
|
| TestProfileSyncService* service_;
|
| - scoped_ptr<WaitableEvent>* wait_for_start_;
|
| - scoped_ptr<WaitableEvent>* wait_for_syncapi_;
|
| + WaitableEvent* const wait_for_start_;
|
| + WaitableEvent* const wait_for_syncapi_;
|
| WaitableEvent is_finished_;
|
| syncer::syncable::Id parent_id_;
|
| + scoped_refptr<base::SequencedTaskRunner> db_thread_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(FakeServerUpdater);
|
| };
|
|
|
| // TODO(skrul): Test abort startup.
|
| @@ -1216,7 +1220,8 @@ TEST_F(ProfileSyncServiceAutofillTest, ServerChangeRace) {
|
| scoped_ptr<WaitableEvent> wait_for_start(new WaitableEvent(true, false));
|
| scoped_ptr<WaitableEvent> wait_for_syncapi(new WaitableEvent(true, false));
|
| scoped_refptr<FakeServerUpdater> updater(new FakeServerUpdater(
|
| - sync_service_.get(), &wait_for_start, &wait_for_syncapi));
|
| + sync_service_.get(), wait_for_start.get(), wait_for_syncapi.get(),
|
| + data_type_thread_.task_runner()));
|
|
|
| // This server side update will stall waiting for CommitWaiter.
|
| updater->CreateNewEntry(MakeAutofillEntry("server", "entry", 1));
|
|
|