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

Unified Diff: components/password_manager/core/browser/password_form_manager_unittest.cc

Issue 1314903003: Updating of all entries in PasswordManager of the same credentials on password update (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed strings from progress loader Created 5 years, 3 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: components/password_manager/core/browser/password_form_manager_unittest.cc
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc
index a3e0339c253ed5f39724ee725801e4be4a591647..a471b8979a974d5606711d5c1087291d87671de4 100644
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -184,7 +184,12 @@ class PasswordFormManagerTest : public testing::Test {
// Types of possible outcomes of simulated matching, see
// SimulateMatchingPhase.
- enum ResultOfSimulatedMatching { RESULT_MATCH_FOUND, RESULT_NO_MATCH };
+ enum ResultOfSimulatedMatching {
+ RESULT_MATCH_FOUND,
+ RESULT_NO_MATCH,
+ RESULT_PSL_FOUND,
+ RESULT_FULL_AND_PSL_FOUND
vabr (Chromium) 2015/09/24 15:17:33 nit: Maybe it is time to convert this to a bit mas
dvadym 2015/09/25 10:19:52 Thanks, it makes sense, done
+ };
void SetUp() override {
observed_form_.origin = GURL("http://accounts.google.com/a/LoginAuth");
@@ -203,6 +208,11 @@ class PasswordFormManagerTest : public testing::Test {
saved_match_.other_possible_usernames.push_back(
ASCIIToUTF16("test2@gmail.com"));
+ psl_saved_match_ = saved_match_;
+ psl_saved_match_.is_public_suffix_match = true;
+ psl_saved_match_.origin =
+ GURL("http://m.accounts.google.com/a/ServiceLoginAuth");
+
autofill::FormFieldData field;
field.label = ASCIIToUTF16("full_name");
field.name = ASCIIToUTF16("full_name");
@@ -245,9 +255,16 @@ class PasswordFormManagerTest : public testing::Test {
return;
}
- scoped_ptr<PasswordForm> match(new PasswordForm(saved_match_));
+ scoped_ptr<PasswordForm> match;
ScopedVector<PasswordForm> result_form;
- result_form.push_back(match.Pass());
+ if (result != RESULT_PSL_FOUND) {
+ match.reset(new PasswordForm(saved_match_));
+ result_form.push_back(match.Pass());
+ }
+ if (result != RESULT_MATCH_FOUND) {
+ match.reset(new PasswordForm(psl_saved_match_));
+ result_form.push_back(match.Pass());
+ }
p->OnGetPasswordStoreResults(result_form.Pass());
}
@@ -311,6 +328,7 @@ class PasswordFormManagerTest : public testing::Test {
PasswordForm* observed_form() { return &observed_form_; }
PasswordForm* saved_match() { return &saved_match_; }
+ PasswordForm* psl_saved_match() { return &psl_saved_match_; }
PasswordForm* CreateSavedMatch(bool blacklisted) {
// Owned by the caller of this method.
PasswordForm* match = new PasswordForm(saved_match_);
@@ -333,6 +351,7 @@ class PasswordFormManagerTest : public testing::Test {
PasswordForm observed_form_;
PasswordForm saved_match_;
+ PasswordForm psl_saved_match_;
scoped_refptr<NiceMock<MockPasswordStore>> mock_store_;
scoped_ptr<TestPasswordManagerClient> client_;
scoped_ptr<PasswordManager> password_manager_;
@@ -442,7 +461,8 @@ TEST_F(PasswordFormManagerTest, TestBlacklistMatching) {
// Doesn't match because of PSL.
PasswordForm blacklisted_psl = *observed_form();
- blacklisted_psl.original_signon_realm = "http://m.accounts.google.com";
+ blacklisted_psl.signon_realm = "http://m.accounts.google.com";
+ blacklisted_psl.is_public_suffix_match = true;
blacklisted_psl.blacklisted_by_user = true;
// Doesn't match because of different origin.
@@ -508,7 +528,7 @@ TEST_F(PasswordFormManagerTest, AutofillBlacklisted) {
TEST_F(PasswordFormManagerTest,
OverriddenPSLMatchedCredentialsNotMarkedAsPSLMatched) {
// The suggestion needs to be PSL-matched.
- saved_match()->original_signon_realm = "www.example.org";
+ saved_match()->is_public_suffix_match = true;
SimulateMatchingPhase(form_manager(), RESULT_MATCH_FOUND);
// User modifies the suggested password and submits the form.
@@ -525,7 +545,7 @@ TEST_F(PasswordFormManagerTest,
TEST_F(PasswordFormManagerTest, PSLMatchedCredentialsMetadataUpdated) {
// The suggestion needs to be PSL-matched.
- saved_match()->original_signon_realm = "www.example.org";
+ saved_match()->is_public_suffix_match = true;
SimulateMatchingPhase(form_manager(), RESULT_MATCH_FOUND);
PasswordForm submitted_form(*observed_form());
@@ -539,9 +559,9 @@ TEST_F(PasswordFormManagerTest, PSLMatchedCredentialsMetadataUpdated) {
expected_saved_form.times_used = 1;
expected_saved_form.other_possible_usernames.clear();
expected_saved_form.form_data = saved_match()->form_data;
- expected_saved_form.origin = saved_match()->origin;
- expected_saved_form.original_signon_realm =
- saved_match()->original_signon_realm;
+ expected_saved_form.origin = observed_form()->origin;
+ expected_saved_form.is_public_suffix_match =
+ saved_match()->is_public_suffix_match;
PasswordForm actual_saved_form;
EXPECT_CALL(*(client()->mock_driver()->mock_autofill_manager()),
@@ -1056,10 +1076,10 @@ TEST_F(PasswordFormManagerTest,
ScopedVector<PasswordForm> simulated_results;
simulated_results.push_back(CreateSavedMatch(false));
simulated_results.push_back(CreateSavedMatch(false));
- simulated_results[1]->username_value = ASCIIToUTF16("other@gmail.com");
- simulated_results[1]->password_element = ASCIIToUTF16("signup_password");
- simulated_results[1]->username_element = ASCIIToUTF16("signup_username");
- simulated_results[1]->type = PasswordForm::TYPE_GENERATED;
+ simulated_results[0]->username_value = ASCIIToUTF16("other@gmail.com");
vabr (Chromium) 2015/09/24 15:17:33 Why this change (1->0)?
dvadym 2015/09/25 10:19:52 Now we take the first form from the ones that matc
+ simulated_results[0]->password_element = ASCIIToUTF16("signup_password");
+ simulated_results[0]->username_element = ASCIIToUTF16("signup_username");
+ simulated_results[0]->type = PasswordForm::TYPE_GENERATED;
form_manager()->SimulateFetchMatchingLoginsFromPasswordStore();
autofill::PasswordFormFillData fill_data;
@@ -1202,12 +1222,12 @@ TEST_F(PasswordFormManagerTest, TestScoringPublicSuffixMatch) {
// Simulate having two matches for this form, first comes from different
// signon realm, but reports the same origin and action as matched form.
// Second candidate has the same signon realm as the form, but has a different
- // origin and action. Public suffix match is the most important criterion so
- // the second candidate should be selected.
+ // origin and action. Public suffix match is not taken into consideration
vabr (Chromium) 2015/09/24 15:17:33 How come? Line 988 in ScoreResult in your patch st
dvadym 2015/09/25 10:19:52 I meant that the property to be public suffix matc
+ // during scoring. So the second candidate is taken.
ScopedVector<PasswordForm> simulated_results;
simulated_results.push_back(CreateSavedMatch(false));
simulated_results.push_back(CreateSavedMatch(false));
- simulated_results[0]->original_signon_realm = "http://accounts2.google.com";
+ simulated_results[0]->is_public_suffix_match = true;
simulated_results[1]->origin =
GURL("http://accounts.google.com/a/ServiceLoginAuth2");
simulated_results[1]->action =
@@ -1221,10 +1241,8 @@ TEST_F(PasswordFormManagerTest, TestScoringPublicSuffixMatch) {
form_manager()->OnGetPasswordStoreResults(simulated_results.Pass());
EXPECT_TRUE(fill_data.additional_logins.empty());
EXPECT_EQ(1u, form_manager()->best_matches().size());
- EXPECT_TRUE(form_manager()
- ->best_matches()
- .begin()
- ->second->original_signon_realm.empty());
+ EXPECT_TRUE(
+ !form_manager()->best_matches().begin()->second->IsPublicSuffixMatch());
}
TEST_F(PasswordFormManagerTest, AndroidCredentialsAreAutofilled) {
@@ -1235,9 +1253,7 @@ TEST_F(PasswordFormManagerTest, AndroidCredentialsAreAutofilled) {
// filled on username-select.
ScopedVector<PasswordForm> simulated_results;
simulated_results.push_back(new PasswordForm());
- simulated_results[0]->signon_realm = observed_form()->signon_realm;
- simulated_results[0]->original_signon_realm =
- "android://hash@com.google.android";
+ simulated_results[0]->signon_realm = "android://hash@com.google.android";
simulated_results[0]->origin = observed_form()->origin;
simulated_results[0]->username_value = saved_match()->username_value;
simulated_results[0]->password_value = saved_match()->password_value;
@@ -1381,9 +1397,9 @@ TEST_F(PasswordFormManagerTest, CorrectlyUpdatePasswordsWithSameUsername) {
form_manager()->SimulateFetchMatchingLoginsFromPasswordStore();
form_manager()->OnGetPasswordStoreResults(result.Pass());
- // We always take the last credential with a particular username, regardless
+ // We always take the first credential with a particular username, regardless
// of which ones are labeled preferred.
- EXPECT_EQ(ASCIIToUTF16("second"),
+ EXPECT_EQ(ASCIIToUTF16("first"),
form_manager()->preferred_match()->password_value);
PasswordForm login(*observed_form());
@@ -1924,7 +1940,7 @@ TEST_F(PasswordFormManagerTest, RemoveNoUsernameAccounts) {
TEST_F(PasswordFormManagerTest, NotRemovePSLNoUsernameAccounts) {
PasswordForm saved_form = *saved_match();
saved_form.username_value.clear();
- saved_form.original_signon_realm = "www.example.org";
+ saved_form.is_public_suffix_match = true;
ScopedVector<PasswordForm> result;
result.push_back(new PasswordForm(saved_form));
form_manager()->SimulateFetchMatchingLoginsFromPasswordStore();
@@ -2202,4 +2218,158 @@ TEST_F(PasswordFormManagerTest, UpdateFormManagers_IsCalled) {
form_manager()->Save();
}
+TEST_F(PasswordFormManagerTest, TestUpdatePSLMatchedCredentials) {
+ PasswordFormManager form_manager(password_manager(), client(),
+ client()->driver(), *observed_form(), false);
+ SimulateMatchingPhase(&form_manager, RESULT_FULL_AND_PSL_FOUND);
+
+ // User submits current and new credentials to the observed form.
vabr (Chromium) 2015/09/24 15:17:33 What do you mean by "current and new credentials"?
dvadym 2015/09/25 10:19:52 Thanks, it's left from the test I've copied.
+ PasswordForm credentials(*observed_form());
+ credentials.username_value = saved_match()->username_value;
+ credentials.password_value =
+ saved_match()->password_value + ASCIIToUTF16("1");
+ credentials.preferred = true;
+ form_manager.ProvisionallySave(
+ credentials, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES);
+
+ // Successful login. The PasswordManager would instruct PasswordFormManager
+ // to save, and since this is an update, it should know not to save as a new
+ // login.
+ EXPECT_FALSE(form_manager.IsNewLogin());
+
+ // Trigger saving to exercise some special case handling in UpdateLogin().
+ PasswordForm new_credentials[2];
+ EXPECT_CALL(*mock_store(), UpdateLogin(_))
+ .WillOnce(testing::SaveArg<0>(&new_credentials[0]))
+ .WillOnce(testing::SaveArg<0>(&new_credentials[1]));
+
+ form_manager.Save();
+ Mock::VerifyAndClearExpectations(mock_store());
+
+ // No meta-information should be updated, only the password.
+ EXPECT_EQ(credentials.password_value, new_credentials[0].password_value);
+ EXPECT_EQ(saved_match()->username_value, new_credentials[0].username_value);
+ EXPECT_EQ(saved_match()->username_element,
+ new_credentials[0].username_element);
+ EXPECT_EQ(saved_match()->password_element,
+ new_credentials[0].password_element);
+ EXPECT_EQ(saved_match()->origin, new_credentials[0].origin);
+
+ EXPECT_EQ(credentials.password_value, new_credentials[1].password_value);
+ EXPECT_EQ(psl_saved_match()->username_element,
+ new_credentials[1].username_element);
+ EXPECT_EQ(psl_saved_match()->username_element,
+ new_credentials[1].username_element);
+ EXPECT_EQ(psl_saved_match()->password_element,
+ new_credentials[1].password_element);
+ EXPECT_EQ(psl_saved_match()->origin, new_credentials[1].origin);
+}
+
+TEST_F(PasswordFormManagerTest,
+ TestNotUpdatePSLMatchedCredentialsWithAnotherUsername) {
+ PasswordFormManager form_manager(password_manager(), client(),
+ client()->driver(), *observed_form(), false);
+ psl_saved_match()->username_value += ASCIIToUTF16("1");
+ SimulateMatchingPhase(&form_manager, RESULT_FULL_AND_PSL_FOUND);
+
+ // User submits current and new credentials to the observed form.
+ PasswordForm credentials(*observed_form());
+ credentials.username_value = saved_match()->username_value;
+ credentials.password_value =
+ saved_match()->password_value + ASCIIToUTF16("1");
+ credentials.preferred = true;
+ form_manager.ProvisionallySave(
+ credentials, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES);
+
+ // Successful login. The PasswordManager would instruct PasswordFormManager
+ // to save, and since this is an update, it should know not to save as a new
+ // login.
+ EXPECT_FALSE(form_manager.IsNewLogin());
+
+ // Trigger saving to exercise some special case handling in UpdateLogin().
+ PasswordForm new_credentials;
+ EXPECT_CALL(*mock_store(), UpdateLogin(_))
+ .WillOnce(testing::SaveArg<0>(&new_credentials));
+
+ form_manager.Save();
+ Mock::VerifyAndClearExpectations(mock_store());
+
+ // No meta-information should be updated, only the password.
+ EXPECT_EQ(credentials.password_value, new_credentials.password_value);
+ EXPECT_EQ(saved_match()->username_value, new_credentials.username_value);
+ EXPECT_EQ(saved_match()->password_element, new_credentials.password_element);
+ EXPECT_EQ(saved_match()->username_element, new_credentials.username_element);
+ EXPECT_EQ(saved_match()->origin, new_credentials.origin);
+}
+
+TEST_F(PasswordFormManagerTest,
+ TestNotUpdatePSLMatchedCredentialsWithAnotherPassword) {
+ PasswordFormManager form_manager(password_manager(), client(),
+ client()->driver(), *observed_form(), false);
+ psl_saved_match()->password_value += ASCIIToUTF16("2");
+ SimulateMatchingPhase(&form_manager, RESULT_FULL_AND_PSL_FOUND);
+
+ // User submits current and new credentials to the observed form.
+ PasswordForm credentials(*observed_form());
+ credentials.username_value = saved_match()->username_value;
+ credentials.password_value =
+ saved_match()->password_value + ASCIIToUTF16("1");
+ credentials.preferred = true;
+ form_manager.ProvisionallySave(
+ credentials, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES);
+
+ // Successful login. The PasswordManager would instruct PasswordFormManager
+ // to save, and since this is an update, it should know not to save as a new
+ // login.
+ EXPECT_FALSE(form_manager.IsNewLogin());
+
+ // Trigger saving to exercise some special case handling in UpdateLogin().
+ PasswordForm new_credentials;
+ EXPECT_CALL(*mock_store(), UpdateLogin(_))
+ .WillOnce(testing::SaveArg<0>(&new_credentials));
+
+ form_manager.Save();
+ Mock::VerifyAndClearExpectations(mock_store());
+
+ // No meta-information should be updated, only the password.
+ EXPECT_EQ(credentials.password_value, new_credentials.password_value);
+ EXPECT_EQ(saved_match()->username_value, new_credentials.username_value);
+ EXPECT_EQ(saved_match()->password_element, new_credentials.password_element);
+ EXPECT_EQ(saved_match()->username_element, new_credentials.username_element);
+ EXPECT_EQ(saved_match()->origin, new_credentials.origin);
+}
+
+TEST_F(PasswordFormManagerTest, TestNotUpdateWhenOnlyPSLMatched) {
+ PasswordFormManager form_manager(password_manager(), client(),
+ client()->driver(), *observed_form(), false);
+ SimulateMatchingPhase(&form_manager, RESULT_PSL_FOUND);
+
+ // User submits current and new credentials to the observed form.
+ PasswordForm credentials(*observed_form());
+ credentials.username_value = saved_match()->username_value;
+ credentials.password_value =
+ saved_match()->password_value + ASCIIToUTF16("1");
+ credentials.preferred = true;
+ form_manager.ProvisionallySave(
+ credentials, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES);
+
+ EXPECT_TRUE(form_manager.IsNewLogin());
+
+ // PSL matched credential should not be updated, since we are not sure that
+ // this is the same credential as submitted one.
+ PasswordForm new_credentials;
+ EXPECT_CALL(*mock_store(), UpdateLogin(_)).Times(0);
+ EXPECT_CALL(*mock_store(), AddLogin(_))
+ .WillOnce(testing::SaveArg<0>(&new_credentials));
+
+ form_manager.Save();
+ Mock::VerifyAndClearExpectations(mock_store());
+
+ EXPECT_EQ(credentials.password_value, new_credentials.password_value);
+ EXPECT_EQ(credentials.username_value, new_credentials.username_value);
+ EXPECT_EQ(credentials.password_element, new_credentials.password_element);
+ EXPECT_EQ(credentials.username_element, new_credentials.username_element);
+ EXPECT_EQ(credentials.origin, new_credentials.origin);
+}
+
} // namespace password_manager

Powered by Google App Engine
This is Rietveld 408576698