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

Unified Diff: chrome/browser/sync/profile_sync_service_autofill_unittest.cc

Issue 8184001: The AutofillProfileSyncableService's lifetime should be managed by the WebDataService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix compile after http://crrev.com/104990 Created 9 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 side-by-side diff with in-line comments
Download patch
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 b099148cf6f8eeb52f056dd3c80d8c117cac4e71..8f1a4a377f097255bd25789af2c3b74d6ac371bf 100644
--- a/chrome/browser/sync/profile_sync_service_autofill_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_autofill_unittest.cc
@@ -8,6 +8,7 @@
#include "testing/gtest/include/gtest/gtest.h"
+#include "base/bind.h"
#include "base/callback.h"
#include "base/location.h"
#include "base/memory/ref_counted.h"
@@ -60,7 +61,6 @@ using browser_sync::AutofillChangeProcessor;
using browser_sync::AutofillDataTypeController;
using browser_sync::AutofillModelAssociator;
using browser_sync::AutofillProfileDataTypeController;
-using browser_sync::AutofillProfileSyncableService;
using browser_sync::DataTypeController;
using browser_sync::GenericChangeProcessor;
using browser_sync::SyncableServiceAdapter;
@@ -153,7 +153,28 @@ syncable::ModelType GetModelType<AutofillProfile>() {
class WebDataServiceFake : public WebDataService {
public:
explicit WebDataServiceFake(WebDatabase* web_database)
- : web_database_(web_database) {}
+ : web_database_(web_database),
+ syncable_service_created_or_destroyed_(false, false) {
+ }
+
+ void StartSyncableService() {
+ // The |autofill_profile_syncable_service_| must be constructed on the DB
+ // thread.
+ BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
+ base::Bind(&WebDataServiceFake::CreateSyncableService,
+ base::Unretained(this)));
+ 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)));
+ syncable_service_created_or_destroyed_.Wait();
+ }
+
virtual bool IsDatabaseLoaded() {
return true;
}
@@ -162,8 +183,34 @@ class WebDataServiceFake : public WebDataService {
return web_database_;
}
+ virtual AutofillProfileSyncableService*
+ GetAutofillProfileSyncableService() const OVERRIDE {
+ EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
+ EXPECT_TRUE(autofill_profile_syncable_service_);
+
+ return autofill_profile_syncable_service_;
+ }
+
private:
+ void CreateSyncableService() {
+ ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
+ autofill_profile_syncable_service_ =
+ new AutofillProfileSyncableService(this);
+ syncable_service_created_or_destroyed_.Signal();
+ }
+
+ void DestroySyncableService() {
+ ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
+ delete autofill_profile_syncable_service_;
+ syncable_service_created_or_destroyed_.Signal();
+ }
+
WebDatabase* web_database_;
+
+ // We own the syncable service, but don't use a |scoped_ptr| because the
+ // lifetime must be managed on the DB thread.
+ AutofillProfileSyncableService* autofill_profile_syncable_service_;
+ WaitableEvent syncable_service_created_or_destroyed_;
};
ACTION_P3(MakeAutofillSyncComponents, service, wd, dtc) {
@@ -184,7 +231,7 @@ ACTION_P3(MakeAutofillProfileSyncComponents, service, wds, dtc) {
if (!BrowserThread::CurrentlyOn(BrowserThread::DB))
return ProfileSyncFactory::SyncComponents(NULL, NULL);
AutofillProfileSyncableService* sync_service =
- new AutofillProfileSyncableService(wds);
+ wds->GetAutofillProfileSyncableService();
sync_api::UserShare* user_share = service->GetUserShare();
GenericChangeProcessor* change_processor =
new GenericChangeProcessor(sync_service, dtc, user_share);
@@ -215,8 +262,7 @@ class AutofillEntryFactory : public AbstractAutofillFactory {
ProfileSyncFactory* factory,
ProfileMock* profile,
ProfileSyncService* service) {
- return new AutofillDataTypeController(factory,
- profile);
+ return new AutofillDataTypeController(factory, profile);
}
void SetExpectation(ProfileSyncFactoryMock* factory,
@@ -234,8 +280,7 @@ class AutofillProfileFactory : public AbstractAutofillFactory {
ProfileSyncFactory* factory,
ProfileMock* profile,
ProfileSyncService* service) {
- return new AutofillProfileDataTypeController(factory,
- profile);
+ return new AutofillProfileDataTypeController(factory, profile);
}
void SetExpectation(ProfileSyncFactoryMock* factory,
@@ -262,7 +307,8 @@ template <class T> class AddAutofillTask;
class ProfileSyncServiceAutofillTest : public AbstractProfileSyncServiceTest {
protected:
- ProfileSyncServiceAutofillTest() {}
+ ProfileSyncServiceAutofillTest() {
+ }
AutofillProfileFactory profile_factory_;
AutofillEntryFactory entry_factory_;
@@ -298,10 +344,15 @@ class ProfileSyncServiceAutofillTest : public AbstractProfileSyncServiceTest {
notification_service_ = new ThreadNotificationService(&db_thread_);
notification_service_->Init();
+
+ // Note: This must be called *after* the notification service is created.
+ web_data_service_->StartSyncableService();
}
virtual void TearDown() {
+ // Note: The tear down order is important.
service_.reset();
+ web_data_service_->ShutdownSyncableService();
notification_service_->TearDown();
profile_.ResetRequestContext();
AbstractProfileSyncServiceTest::TearDown();
@@ -335,8 +386,7 @@ class ProfileSyncServiceAutofillTest : public AbstractProfileSyncServiceTest {
WillRepeatedly(Return(true));
// We need tokens to get the tests going
- token_service_->IssueAuthTokenForTest(
- GaiaConstants::kSyncService, "token");
+ token_service_->IssueAuthTokenForTest(GaiaConstants::kSyncService, "token");
EXPECT_CALL(profile_, GetTokenService()).
WillRepeatedly(Return(token_service_.get()));
@@ -365,7 +415,7 @@ class ProfileSyncServiceAutofillTest : public AbstractProfileSyncServiceTest {
bool AddAutofillSyncNode(const AutofillProfile& profile) {
sync_api::WriteTransaction trans(FROM_HERE, service_->GetUserShare());
sync_api::ReadNode autofill_root(&trans);
- if (!autofill_root.InitByTagLookup(browser_sync::kAutofillProfileTag))
+ if (!autofill_root.InitByTagLookup(kAutofillProfileTag))
return false;
sync_api::WriteNode node(&trans);
std::string tag = profile.guid();
@@ -421,7 +471,7 @@ class ProfileSyncServiceAutofillTest : public AbstractProfileSyncServiceTest {
std::vector<AutofillProfile>* profiles) {
sync_api::ReadTransaction trans(FROM_HERE, service_->GetUserShare());
sync_api::ReadNode autofill_root(&trans);
- if (!autofill_root.InitByTagLookup(browser_sync::kAutofillProfileTag))
+ if (!autofill_root.InitByTagLookup(kAutofillProfileTag))
return false;
int64 child_id = autofill_root.GetFirstChildId();
@@ -476,7 +526,7 @@ class ProfileSyncServiceAutofillTest : public AbstractProfileSyncServiceTest {
ProfileMock profile_;
AutofillTableMock autofill_table_;
scoped_ptr<WebDatabaseFake> web_database_;
- scoped_refptr<WebDataService> web_data_service_;
+ scoped_refptr<WebDataServiceFake> web_data_service_;
PersonalDataManagerMock* personal_data_manager_;
};
@@ -484,7 +534,7 @@ template <class T>
class AddAutofillTask : public Task {
public:
AddAutofillTask(ProfileSyncServiceAutofillTest* test,
- const std::vector<T>& entries)
+ const std::vector<T>& entries)
: test_(test), entries_(entries), success_(false) {
}
« no previous file with comments | « chrome/browser/sync/profile_sync_factory_impl.cc ('k') | chrome/browser/webdata/autofill_profile_syncable_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698