Chromium Code Reviews| Index: components/password_manager/core/browser/login_database_unittest.cc |
| diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc |
| index 7a4840e1e87c57dfc93ef12848aff30b574365da..a1d77fbc179c7477887c043a1be13787345b91dd 100644 |
| --- a/components/password_manager/core/browser/login_database_unittest.cc |
| +++ b/components/password_manager/core/browser/login_database_unittest.cc |
| @@ -22,6 +22,15 @@ using base::ASCIIToUTF16; |
| using ::testing::Eq; |
| namespace password_manager { |
| +namespace { |
| + |
| +PasswordStoreChangeList ChangeListFromForm(const PasswordForm& form) { |
|
Garrett Casto
2014/05/14 07:46:35
nit: Doesn't seem like the name quite captures exa
vasilii
2014/05/14 11:20:18
Done.
|
| + return PasswordStoreChangeList(1, |
| + PasswordStoreChange(PasswordStoreChange::ADD, |
| + form)); |
| +} |
| + |
| +} // namespace |
| class LoginDatabaseTest : public testing::Test { |
| protected: |
| @@ -50,7 +59,7 @@ class LoginDatabaseTest : public testing::Test { |
| } |
| void TestNonHTMLFormPSLMatching(const PasswordForm::Scheme& scheme) { |
| - std::vector<PasswordForm*> result; |
| + ScopedVector<PasswordForm> result; |
| base::Time now = base::Time::Now(); |
| @@ -61,6 +70,7 @@ class LoginDatabaseTest : public testing::Test { |
| non_html_auth.password_value = ASCIIToUTF16("test"); |
| non_html_auth.signon_realm = "http://example.com/Realm"; |
| non_html_auth.scheme = scheme; |
| + non_html_auth.date_created = now; |
|
Garrett Casto
2014/05/14 07:46:35
Was the lack of date_created causing test failures
vasilii
2014/05/14 11:20:18
Yes. RemoveLoginsCreatedBetween did nothing.
|
| // Simple password form. |
| PasswordForm html_form(non_html_auth); |
| @@ -71,14 +81,13 @@ class LoginDatabaseTest : public testing::Test { |
| html_form.submit_element = ASCIIToUTF16(""); |
| html_form.signon_realm = "http://example.com/"; |
| html_form.scheme = PasswordForm::SCHEME_HTML; |
| + html_form.date_created = now; |
| // Add them and make sure it is there. |
| - EXPECT_TRUE(db_.AddLogin(non_html_auth)); |
| - EXPECT_TRUE(db_.AddLogin(html_form)); |
| - EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| + EXPECT_EQ(ChangeListFromForm(non_html_auth), db_.AddLogin(non_html_auth)); |
| + EXPECT_EQ(ChangeListFromForm(html_form), db_.AddLogin(html_form)); |
| + EXPECT_TRUE(db_.GetAutofillableLogins(&result.get())); |
| EXPECT_EQ(2U, result.size()); |
| - delete result[0]; |
| - delete result[1]; |
| result.clear(); |
| PasswordForm second_non_html_auth(non_html_auth); |
| @@ -86,7 +95,7 @@ class LoginDatabaseTest : public testing::Test { |
| second_non_html_auth.signon_realm = "http://second.example.com/Realm"; |
| // This shouldn't match anything. |
| - EXPECT_TRUE(db_.GetLogins(second_non_html_auth, &result)); |
| + EXPECT_TRUE(db_.GetLogins(second_non_html_auth, &result.get())); |
| EXPECT_EQ(0U, result.size()); |
| // Clear state. |
| @@ -124,7 +133,7 @@ TEST_F(LoginDatabaseTest, Logins) { |
| // Add it and make sure it is there and that all the fields were retrieved |
| // correctly. |
| - EXPECT_TRUE(db_.AddLogin(form)); |
| + EXPECT_EQ(ChangeListFromForm(form), db_.AddLogin(form)); |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| EXPECT_EQ(1U, result.size()); |
| FormsAreEqual(form, *result[0]); |
| @@ -168,7 +177,7 @@ TEST_F(LoginDatabaseTest, Logins) { |
| EXPECT_EQ(0U, result.size()); |
| // Let's imagine the user logs into the secure site. |
| - EXPECT_TRUE(db_.AddLogin(form4)); |
| + EXPECT_EQ(ChangeListFromForm(form4), db_.AddLogin(form4)); |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| EXPECT_EQ(2U, result.size()); |
| delete result[0]; |
| @@ -262,7 +271,7 @@ TEST_F(LoginDatabaseTest, TestPublicSuffixDomainMatching) { |
| form.scheme = PasswordForm::SCHEME_HTML; |
| // Add it and make sure it is there. |
| - EXPECT_TRUE(db_.AddLogin(form)); |
| + EXPECT_EQ(ChangeListFromForm(form), db_.AddLogin(form)); |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| EXPECT_EQ(1U, result.size()); |
| delete result[0]; |
| @@ -320,7 +329,7 @@ TEST_F(LoginDatabaseTest, TestPublicSuffixDomainMatchingShouldMatchingApply) { |
| form.scheme = PasswordForm::SCHEME_HTML; |
| // Add it and make sure it is there. |
| - EXPECT_TRUE(db_.AddLogin(form)); |
| + EXPECT_EQ(ChangeListFromForm(form), db_.AddLogin(form)); |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| EXPECT_EQ(1U, result.size()); |
| delete result[0]; |
| @@ -370,7 +379,7 @@ TEST_F(LoginDatabaseTest, TestPublicSuffixDomainMatchingDifferentSites) { |
| form.scheme = PasswordForm::SCHEME_HTML; |
| // Add it and make sure it is there. |
| - EXPECT_TRUE(db_.AddLogin(form)); |
| + EXPECT_EQ(ChangeListFromForm(form), db_.AddLogin(form)); |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| EXPECT_EQ(1U, result.size()); |
| delete result[0]; |
| @@ -410,7 +419,7 @@ TEST_F(LoginDatabaseTest, TestPublicSuffixDomainMatchingDifferentSites) { |
| form.scheme = PasswordForm::SCHEME_HTML; |
| // Add it and make sure it is there. |
| - EXPECT_TRUE(db_.AddLogin(form)); |
| + EXPECT_EQ(ChangeListFromForm(form), db_.AddLogin(form)); |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| EXPECT_EQ(2U, result.size()); |
| delete result[0]; |
| @@ -464,7 +473,7 @@ TEST_F(LoginDatabaseTest, TestPublicSuffixDomainMatchingRegexp) { |
| form.scheme = PasswordForm::SCHEME_HTML; |
| // Add it and make sure it is there. |
| - EXPECT_TRUE(db_.AddLogin(form)); |
| + EXPECT_EQ(ChangeListFromForm(form), db_.AddLogin(form)); |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| EXPECT_EQ(1U, result.size()); |
| delete result[0]; |
| @@ -475,7 +484,7 @@ TEST_F(LoginDatabaseTest, TestPublicSuffixDomainMatchingRegexp) { |
| GetFormWithNewSignonRealm(form, "http://www.foo-bar.com/"); |
| // Add it and make sure it is there. |
| - EXPECT_TRUE(db_.AddLogin(form_dash)); |
| + EXPECT_EQ(ChangeListFromForm(form_dash), db_.AddLogin(form_dash)); |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| EXPECT_EQ(2U, result.size()); |
| delete result[0]; |
| @@ -575,7 +584,7 @@ static bool AddTimestampedLogin(LoginDatabase* db, std::string url, |
| form.submit_element = ASCIIToUTF16("signIn"); |
| form.signon_realm = url; |
| form.date_created = time; |
| - return db->AddLogin(form); |
| + return db->AddLogin(form) == ChangeListFromForm(form); |
| } |
| static void ClearResults(std::vector<PasswordForm*>* results) { |
| @@ -647,7 +656,7 @@ TEST_F(LoginDatabaseTest, BlacklistedLogins) { |
| form.preferred = true; |
| form.blacklisted_by_user = true; |
| form.scheme = PasswordForm::SCHEME_HTML; |
| - EXPECT_TRUE(db_.AddLogin(form)); |
| + EXPECT_EQ(ChangeListFromForm(form), db_.AddLogin(form)); |
| // Get all non-blacklisted logins (should be none). |
| EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| @@ -700,7 +709,7 @@ TEST_F(LoginDatabaseTest, UpdateIncompleteCredentials) { |
| incomplete_form.preferred = true; |
| incomplete_form.blacklisted_by_user = false; |
| incomplete_form.scheme = PasswordForm::SCHEME_HTML; |
| - EXPECT_TRUE(db_.AddLogin(incomplete_form)); |
| + EXPECT_EQ(ChangeListFromForm(incomplete_form), db_.AddLogin(incomplete_form)); |
| // A form on some website. It should trigger a match with the stored one. |
| PasswordForm encountered_form; |
| @@ -773,7 +782,7 @@ TEST_F(LoginDatabaseTest, UpdateOverlappingCredentials) { |
| incomplete_form.preferred = true; |
| incomplete_form.blacklisted_by_user = false; |
| incomplete_form.scheme = PasswordForm::SCHEME_HTML; |
| - EXPECT_TRUE(db_.AddLogin(incomplete_form)); |
| + EXPECT_EQ(ChangeListFromForm(incomplete_form), db_.AddLogin(incomplete_form)); |
| // Save a complete version of the previous form. Both forms could exist if |
| // the user created the complete version before importing the incomplete |
| @@ -783,7 +792,7 @@ TEST_F(LoginDatabaseTest, UpdateOverlappingCredentials) { |
| complete_form.username_element = ASCIIToUTF16("username_element"); |
| complete_form.password_element = ASCIIToUTF16("password_element"); |
| complete_form.submit_element = ASCIIToUTF16("submit"); |
| - EXPECT_TRUE(db_.AddLogin(complete_form)); |
| + EXPECT_EQ(ChangeListFromForm(complete_form), db_.AddLogin(complete_form)); |
| // Make sure both passwords exist. |
| ScopedVector<autofill::PasswordForm> result; |
| @@ -808,6 +817,26 @@ TEST_F(LoginDatabaseTest, UpdateOverlappingCredentials) { |
| EXPECT_EQ(expected_form, *result[0]); |
| } |
| +TEST_F(LoginDatabaseTest, DoubleAdd) { |
| + PasswordForm form; |
| + form.origin = GURL("http://accounts.google.com/LoginAuth"); |
| + form.signon_realm = "http://accounts.google.com/"; |
| + form.username_value = ASCIIToUTF16("my_username"); |
| + form.password_value = ASCIIToUTF16("my_password"); |
| + form.ssl_valid = false; |
| + form.preferred = true; |
| + form.blacklisted_by_user = false; |
| + form.scheme = PasswordForm::SCHEME_HTML; |
| + EXPECT_EQ(ChangeListFromForm(form), db_.AddLogin(form)); |
| + |
| + // Add almost the same form again. |
| + form.times_used++; |
| + PasswordStoreChangeList list; |
| + list.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form)); |
| + list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); |
| + EXPECT_EQ(list, db_.AddLogin(form)); |
| +} |
| + |
| #if defined(OS_POSIX) |
| // Only the current user has permission to read the database. |
| // |