Index: chrome/browser/sync/profile_sync_service_password_unittest.cc |
diff --git a/chrome/browser/sync/profile_sync_service_password_unittest.cc b/chrome/browser/sync/profile_sync_service_password_unittest.cc |
index 94f216964d350aaec3fbb1576c9e5cee41910848..75f0c791fb09bbf6aa3be2a3ec113a408a553606 100644 |
--- a/chrome/browser/sync/profile_sync_service_password_unittest.cc |
+++ b/chrome/browser/sync/profile_sync_service_password_unittest.cc |
@@ -83,6 +83,13 @@ ACTION_P3(MakePasswordSyncComponents, service, ps, dtc) { |
change_processor); |
} |
+ACTION_P(AcquireSyncTransaction, password_test_service) { |
+ // Check to make sure we can aquire a transaction (will crash if a transaction |
+ // is already held by this thread, deadlock if held by another thread). |
+ sync_api::WriteTransaction trans(password_test_service->GetUserShare()); |
+ VLOG(1) << "Sync transaction acquired."; |
+} |
+ |
static void QuitMessageLoop() { |
MessageLoop::current()->Quit(); |
} |
@@ -137,6 +144,10 @@ class PasswordTestProfileSyncService : public TestProfileSyncService { |
}; |
class ProfileSyncServicePasswordTest : public AbstractProfileSyncServiceTest { |
+ public: |
+ sync_api::UserShare* GetUserShare() { |
+ return service_->GetUserShare(); |
+ } |
protected: |
ProfileSyncServicePasswordTest() |
: db_thread_(BrowserThread::DB) { |
@@ -477,6 +488,71 @@ TEST_F(ProfileSyncServicePasswordTest, HasNativeHasSyncNoMerge) { |
EXPECT_TRUE(ComparePasswords(expected_forms[1], new_sync_forms[1])); |
} |
+// Same as HasNativeHasEmptyNoMerge, but we attempt to aquire a sync transaction |
+// every time the password store is accessed. |
+TEST_F(ProfileSyncServicePasswordTest, EnsureNoTransactions) { |
+ std::vector<PasswordForm*> native_forms; |
+ std::vector<PasswordForm> sync_forms; |
+ std::vector<PasswordForm> expected_forms; |
+ { |
+ PasswordForm* new_form = new PasswordForm; |
+ new_form->scheme = PasswordForm::SCHEME_HTML; |
+ new_form->signon_realm = "pie"; |
+ new_form->origin = GURL("http://pie.com"); |
+ new_form->action = GURL("http://pie.com/submit"); |
+ new_form->username_element = UTF8ToUTF16("name"); |
+ new_form->username_value = UTF8ToUTF16("tom"); |
+ new_form->password_element = UTF8ToUTF16("cork"); |
+ new_form->password_value = UTF8ToUTF16("password1"); |
+ new_form->ssl_valid = true; |
+ new_form->preferred = false; |
+ new_form->date_created = base::Time::FromInternalValue(1234); |
+ new_form->blacklisted_by_user = false; |
+ |
+ native_forms.push_back(new_form); |
+ expected_forms.push_back(*new_form); |
+ } |
+ |
+ { |
+ PasswordForm new_form; |
+ new_form.scheme = PasswordForm::SCHEME_HTML; |
+ new_form.signon_realm = "pie2"; |
+ new_form.origin = GURL("http://pie2.com"); |
+ new_form.action = GURL("http://pie2.com/submit"); |
+ new_form.username_element = UTF8ToUTF16("name2"); |
+ new_form.username_value = UTF8ToUTF16("tom2"); |
+ new_form.password_element = UTF8ToUTF16("cork2"); |
+ new_form.password_value = UTF8ToUTF16("password12"); |
+ new_form.ssl_valid = false; |
+ new_form.preferred = true; |
+ new_form.date_created = base::Time::FromInternalValue(12345); |
+ new_form.blacklisted_by_user = false; |
+ sync_forms.push_back(new_form); |
+ expected_forms.push_back(new_form); |
+ } |
+ |
+ EXPECT_CALL(*password_store_, FillAutofillableLogins(_)) |
+ .WillOnce(DoAll(SetArgumentPointee<0>(native_forms), |
+ AcquireSyncTransaction(this), |
+ Return(true))); |
+ EXPECT_CALL(*password_store_, FillBlacklistLogins(_)) |
+ .WillOnce(DoAll(AcquireSyncTransaction(this), |
+ Return(true))); |
+ EXPECT_CALL(*password_store_, AddLoginImpl(_)) |
+ .WillOnce(AcquireSyncTransaction(this)); |
+ |
+ CreateRootTask root_task(this, syncable::PASSWORDS); |
+ AddPasswordEntriesTask node_task(this, sync_forms); |
+ StartSyncService(&root_task, &node_task); |
+ |
+ std::vector<PasswordForm> new_sync_forms; |
+ GetPasswordEntriesFromSyncDB(&new_sync_forms); |
+ |
+ EXPECT_EQ(2U, new_sync_forms.size()); |
+ EXPECT_TRUE(ComparePasswords(expected_forms[0], new_sync_forms[0])); |
+ EXPECT_TRUE(ComparePasswords(expected_forms[1], new_sync_forms[1])); |
+} |
+ |
TEST_F(ProfileSyncServicePasswordTest, HasNativeHasSyncMergeEntry) { |
std::vector<PasswordForm*> native_forms; |
std::vector<PasswordForm> sync_forms; |