Chromium Code Reviews| Index: chrome/browser/password_manager/password_form_manager_unittest.cc |
| =================================================================== |
| --- chrome/browser/password_manager/password_form_manager_unittest.cc (revision 133421) |
| +++ chrome/browser/password_manager/password_form_manager_unittest.cc (working copy) |
| @@ -35,6 +35,26 @@ |
| profile_ = new TestingProfile(); |
| } |
| + // Remove the username and regenerate the profile. |
| + // This function changes the observed_form_ and saved_match_. |
| + // This function should be called at the beginning of tests |
| + // for which there is no username. |
|
Ilya Sherman
2012/04/26 23:42:42
nit: "no username" -> "no username field".
|
| + void SetUpForNoUsernameTests() { |
| + observed_form_.origin = GURL("http://www.google.com/b/LoginAuth"); |
| + observed_form_.action = GURL("http://www.google.com/b/Login"); |
| + observed_form_.username_element = ASCIIToUTF16(""); |
| + observed_form_.password_element = ASCIIToUTF16("Passwd"); |
| + observed_form_.submit_element = ASCIIToUTF16("signIn"); |
| + observed_form_.signon_realm = "http://www.google.com"; |
| + |
| + saved_match_ = observed_form_; |
| + saved_match_.origin = GURL("http://www.google.com/b/ServiceLoginAuth"); |
| + saved_match_.action = GURL("http://www.google.com/b/ServiceLogin"); |
| + saved_match_.preferred = true; |
| + saved_match_.username_value = ASCIIToUTF16(""); |
| + saved_match_.password_value = ASCIIToUTF16("test2"); |
| + } |
| + |
| virtual void TearDown() { |
| delete profile_; |
| } |
| @@ -59,6 +79,109 @@ |
| return p->IgnoreResult(*form); |
| } |
| + void VerifyNewLogin(PasswordFormManager* manager) { |
| + // Successful login. The PasswordManager would instruct PasswordFormManager |
| + // to save, which should know this is a new login. |
| + EXPECT_TRUE(manager->IsNewLogin()); |
| + // Make sure the credentials that would be submitted on successful login |
| + // are going to match the stored entry in the db. |
| + EXPECT_EQ(observed_form()->origin.spec(), |
| + GetPendingCredentials(manager)->origin.spec()); |
| + EXPECT_EQ(observed_form()->signon_realm, |
| + GetPendingCredentials(manager)->signon_realm); |
| + EXPECT_TRUE(GetPendingCredentials(manager)->preferred); |
| + EXPECT_EQ(saved_match()->password_value, |
| + GetPendingCredentials(manager)->password_value); |
| + EXPECT_EQ(saved_match()->username_value, |
| + GetPendingCredentials(manager)->username_value); |
| + } |
| + |
| + void TestEmptyAction() { |
| + scoped_ptr<PasswordFormManager> manager(new PasswordFormManager( |
| + profile(), NULL, *observed_form(), false)); |
| + |
| + saved_match()->action = GURL(); |
| + SimulateMatchingPhase(manager.get(), true); |
| + // User logs in with the autofilled username / password from saved_match. |
| + PasswordForm login = *observed_form(); |
| + login.username_value = saved_match()->username_value; |
| + login.password_value = saved_match()->password_value; |
| + manager->ProvisionallySave(login); |
| + EXPECT_FALSE(manager->IsNewLogin()); |
| + // We bless our saved PasswordForm entry with the action URL of the |
| + // observed form. |
| + EXPECT_EQ(observed_form()->action, |
| + GetPendingCredentials(manager.get())->action); |
| + } |
| + |
| + void TestValidForms() { |
| + // User submits credentials for the observed form. |
| + PasswordForm credentials = *observed_form(); |
| + credentials.scheme = PasswordForm::SCHEME_HTML; |
| + credentials.username_value = saved_match()->username_value; |
| + credentials.password_value = saved_match()->password_value; |
| + |
| + // Form with both username_element and password_element. |
| + PasswordFormManager manager1(profile(), NULL, credentials, false); |
| + SimulateMatchingPhase(&manager1, false); |
| + EXPECT_TRUE(manager1.HasValidPasswordForm()); |
| + |
| + // Form without a username_element but with a password_element. |
| + // It should be true, because we should save and autofill a password |
| + // if there isn't any username. |
| + credentials.username_element.clear(); |
| + PasswordFormManager manager2(profile(), NULL, credentials, false); |
| + SimulateMatchingPhase(&manager2, false); |
| + EXPECT_TRUE(manager2.HasValidPasswordForm()); |
| + |
| + // Form without a password_element but with a username_element. |
| + credentials.username_element = saved_match()->username_element; |
| + credentials.password_element.clear(); |
| + PasswordFormManager manager3(profile(), NULL, credentials, false); |
| + SimulateMatchingPhase(&manager3, false); |
| + EXPECT_FALSE(manager3.HasValidPasswordForm()); |
| + |
| + // Form with neither a password_element nor a username_element. |
| + credentials.username_element.clear(); |
| + credentials.password_element.clear(); |
| + PasswordFormManager manager4(profile(), NULL, credentials, false); |
| + SimulateMatchingPhase(&manager4, false); |
| + EXPECT_FALSE(manager4.HasValidPasswordForm()); |
| + } |
| + |
| + void TestValidFormsBasic() { |
| + // User submits credentials for the observed form. |
| + PasswordForm credentials = *observed_form(); |
| + credentials.scheme = PasswordForm::SCHEME_BASIC; |
| + credentials.username_value = saved_match()->username_value; |
| + credentials.password_value = saved_match()->password_value; |
| + |
| + // Form with both username_element and password_element. |
| + PasswordFormManager manager1(profile(), NULL, credentials, false); |
| + SimulateMatchingPhase(&manager1, false); |
| + EXPECT_TRUE(manager1.HasValidPasswordForm()); |
| + |
| + // Form without a username_element but with a password_element. |
| + credentials.username_element.clear(); |
| + PasswordFormManager manager2(profile(), NULL, credentials, false); |
| + SimulateMatchingPhase(&manager2, false); |
| + EXPECT_TRUE(manager2.HasValidPasswordForm()); |
| + |
| + // Form without a password_element but with a username_element. |
| + credentials.username_element = saved_match()->username_element; |
| + credentials.password_element.clear(); |
| + PasswordFormManager manager3(profile(), NULL, credentials, false); |
| + SimulateMatchingPhase(&manager3, false); |
| + EXPECT_TRUE(manager3.HasValidPasswordForm()); |
| + |
| + // Form with neither a password_element nor a username_element. |
| + credentials.username_element.clear(); |
| + credentials.password_element.clear(); |
| + PasswordFormManager manager4(profile(), NULL, credentials, false); |
| + SimulateMatchingPhase(&manager4, false); |
| + EXPECT_TRUE(manager4.HasValidPasswordForm()); |
| + } |
| + |
| Profile* profile() { return profile_; } |
| PasswordForm* observed_form() { return &observed_form_; } |
| @@ -71,58 +194,79 @@ |
| }; |
| TEST_F(PasswordFormManagerTest, TestNewLogin) { |
| - PasswordFormManager* manager = new PasswordFormManager( |
| - profile(), NULL, *observed_form(), false); |
| - SimulateMatchingPhase(manager, false); |
| + PasswordFormManager manager(profile(), NULL, *observed_form(), false); |
| + SimulateMatchingPhase(&manager, false); |
| // User submits credentials for the observed form. |
| PasswordForm credentials = *observed_form(); |
| credentials.username_value = saved_match()->username_value; |
| credentials.password_value = saved_match()->password_value; |
| credentials.preferred = true; |
| - manager->ProvisionallySave(credentials); |
| + manager.ProvisionallySave(credentials); |
| + VerifyNewLogin(&manager); |
| - // Successful login. The PasswordManager would instruct PasswordFormManager |
| - // to save, which should know this is a new login. |
| - EXPECT_TRUE(manager->IsNewLogin()); |
| - // Make sure the credentials that would be submitted on successful login |
| - // are going to match the stored entry in the db. |
| - EXPECT_EQ(observed_form()->origin.spec(), |
| - GetPendingCredentials(manager)->origin.spec()); |
| - EXPECT_EQ(observed_form()->signon_realm, |
| - GetPendingCredentials(manager)->signon_realm); |
| - EXPECT_TRUE(GetPendingCredentials(manager)->preferred); |
| - EXPECT_EQ(saved_match()->password_value, |
| - GetPendingCredentials(manager)->password_value); |
| - EXPECT_EQ(saved_match()->username_value, |
| - GetPendingCredentials(manager)->username_value); |
| - |
| // Now, suppose the user re-visits the site and wants to save an additional |
| // login for the site with a new username. In this case, the matching phase |
| // will yield the previously saved login. |
| - SimulateMatchingPhase(manager, true); |
| + SimulateMatchingPhase(&manager, true); |
| // Set up the new login. |
| string16 new_user = ASCIIToUTF16("newuser"); |
| string16 new_pass = ASCIIToUTF16("newpass"); |
| credentials.username_value = new_user; |
| credentials.password_value = new_pass; |
| - manager->ProvisionallySave(credentials); |
| + manager.ProvisionallySave(credentials); |
| // Again, the PasswordFormManager should know this is still a new login. |
| - EXPECT_TRUE(manager->IsNewLogin()); |
| + EXPECT_TRUE(manager.IsNewLogin()); |
| // And make sure everything squares up again. |
| EXPECT_EQ(observed_form()->origin.spec(), |
| - GetPendingCredentials(manager)->origin.spec()); |
| + GetPendingCredentials(&manager)->origin.spec()); |
| EXPECT_EQ(observed_form()->signon_realm, |
| - GetPendingCredentials(manager)->signon_realm); |
| - EXPECT_TRUE(GetPendingCredentials(manager)->preferred); |
| + GetPendingCredentials(&manager)->signon_realm); |
| + EXPECT_TRUE(GetPendingCredentials(&manager)->preferred); |
| EXPECT_EQ(new_pass, |
| - GetPendingCredentials(manager)->password_value); |
| + GetPendingCredentials(&manager)->password_value); |
| EXPECT_EQ(new_user, |
| - GetPendingCredentials(manager)->username_value); |
| + GetPendingCredentials(&manager)->username_value); |
| // Done. |
| - delete manager; |
| } |
| +TEST_F(PasswordFormManagerTest, TestNewLoginAndUpdateWithoutUsername) { |
| + SetUpForNoUsernameTests(); |
| + PasswordFormManager manager(profile(), NULL, *observed_form(), false); |
| + SimulateMatchingPhase(&manager, false); |
| + |
| + // User submits credentials for the observed form. |
| + PasswordForm credentials = *observed_form(); |
| + credentials.username_value = saved_match()->username_value; |
| + credentials.password_value = saved_match()->password_value; |
| + credentials.preferred = true; |
| + manager.ProvisionallySave(credentials); |
| + VerifyNewLogin(&manager); |
| + |
| + // Now, suppose the user re-visits the site and wants to save an additional |
| + // login for the site with a new password. In this case, the matching phase |
| + // will yield the previously saved login. |
| + SimulateMatchingPhase(&manager, true); |
| + |
| + // Set up the update login. |
| + string16 new_pass = ASCIIToUTF16("newpass2"); |
| + credentials.password_value = new_pass; |
| + manager.ProvisionallySave(credentials); |
| + |
| + // If there is no username, we assume it's an update. |
| + EXPECT_FALSE(manager.IsNewLogin()); |
| + |
| + // And make sure everything squares up again. |
| + EXPECT_EQ(saved_match()->origin.spec(), |
| + GetPendingCredentials(&manager)->origin.spec()); |
| + EXPECT_EQ(saved_match()->signon_realm, |
| + GetPendingCredentials(&manager)->signon_realm); |
| + EXPECT_TRUE(GetPendingCredentials(&manager)->preferred); |
| + EXPECT_EQ(new_pass, |
| + GetPendingCredentials(&manager)->password_value); |
| +} |
| + |
| + |
| TEST_F(PasswordFormManagerTest, TestUpdatePassword) { |
| // Create a PasswordFormManager with observed_form, as if we just |
| // saw this form and need to find matching logins. |
| @@ -180,85 +324,45 @@ |
| } |
| TEST_F(PasswordFormManagerTest, TestEmptyAction) { |
| - scoped_ptr<PasswordFormManager> manager(new PasswordFormManager( |
| - profile(), NULL, *observed_form(), false)); |
| + TestEmptyAction(); |
| +} |
| - saved_match()->action = GURL(); |
| - SimulateMatchingPhase(manager.get(), true); |
| - // User logs in with the autofilled username / password from saved_match. |
| - PasswordForm login = *observed_form(); |
| - login.username_value = saved_match()->username_value; |
| - login.password_value = saved_match()->password_value; |
| - manager->ProvisionallySave(login); |
| - EXPECT_FALSE(manager->IsNewLogin()); |
| - // We bless our saved PasswordForm entry with the action URL of the |
| - // observed form. |
| - EXPECT_EQ(observed_form()->action, |
| - GetPendingCredentials(manager.get())->action); |
| +TEST_F(PasswordFormManagerTest, TestEmptyActionWithoutUsername) { |
| + SetUpForNoUsernameTests(); |
| + TestEmptyAction(); |
| } |
| TEST_F(PasswordFormManagerTest, TestValidForms) { |
| - // User submits credentials for the observed form. |
| - PasswordForm credentials = *observed_form(); |
| - credentials.scheme = PasswordForm::SCHEME_HTML; |
| - credentials.username_value = saved_match()->username_value; |
| - credentials.password_value = saved_match()->password_value; |
| + TestValidForms(); |
| +} |
| - // Form with both username_element and password_element. |
| - PasswordFormManager manager1(profile(), NULL, credentials, false); |
| - SimulateMatchingPhase(&manager1, false); |
| - EXPECT_TRUE(manager1.HasValidPasswordForm()); |
| +TEST_F(PasswordFormManagerTest, TestValidFormsWithNoUsername) { |
| + SetUpForNoUsernameTests(); |
| + TestValidForms(); |
| +} |
| - // Form without a username_element but with a password_element. |
| - credentials.username_element.clear(); |
| - PasswordFormManager manager2(profile(), NULL, credentials, false); |
| - SimulateMatchingPhase(&manager2, false); |
| - EXPECT_FALSE(manager2.HasValidPasswordForm()); |
| +TEST_F(PasswordFormManagerTest, TestValidFormsBasic) { |
| + TestValidFormsBasic(); |
| +} |
| - // Form without a password_element but with a username_element. |
| - credentials.username_element = saved_match()->username_element; |
| - credentials.password_element.clear(); |
| - PasswordFormManager manager3(profile(), NULL, credentials, false); |
| - SimulateMatchingPhase(&manager3, false); |
| - EXPECT_FALSE(manager3.HasValidPasswordForm()); |
| - |
| - // Form with neither a password_element nor a username_element. |
| - credentials.username_element.clear(); |
| - credentials.password_element.clear(); |
| - PasswordFormManager manager4(profile(), NULL, credentials, false); |
| - SimulateMatchingPhase(&manager4, false); |
| - EXPECT_FALSE(manager4.HasValidPasswordForm()); |
| +TEST_F(PasswordFormManagerTest, TestValidFormsBasicWithoutUsername) { |
| + SetUpForNoUsernameTests(); |
| + TestValidFormsBasic(); |
| } |
| -TEST_F(PasswordFormManagerTest, TestValidFormsBasic) { |
| - // User submits credentials for the observed form. |
| +TEST_F(PasswordFormManagerTest, TestVisitOtherForm) { |
| + // Create forms haven't username element. |
| + SetUpForNoUsernameTests(); |
| + |
| + // Save the password for a form with no username element |
| + // on http://www.google.com/b/LoginAuth |
| + PasswordFormManager manager(profile(), NULL, *observed_form(), false); |
| + SimulateMatchingPhase(&manager, false); |
| PasswordForm credentials = *observed_form(); |
| - credentials.scheme = PasswordForm::SCHEME_BASIC; |
| credentials.username_value = saved_match()->username_value; |
| credentials.password_value = saved_match()->password_value; |
| + credentials.preferred = true; |
| + manager.ProvisionallySave(credentials); |
| + VerifyNewLogin(&manager); |
|
Ilya Sherman
2012/04/26 23:42:42
nit: Please remove this blank line (367)
|
| - // Form with both username_element and password_element. |
| - PasswordFormManager manager1(profile(), NULL, credentials, false); |
| - SimulateMatchingPhase(&manager1, false); |
| - EXPECT_TRUE(manager1.HasValidPasswordForm()); |
| - |
| - // Form without a username_element but with a password_element. |
| - credentials.username_element.clear(); |
| - PasswordFormManager manager2(profile(), NULL, credentials, false); |
| - SimulateMatchingPhase(&manager2, false); |
| - EXPECT_TRUE(manager2.HasValidPasswordForm()); |
| - |
| - // Form without a password_element but with a username_element. |
| - credentials.username_element = saved_match()->username_element; |
| - credentials.password_element.clear(); |
| - PasswordFormManager manager3(profile(), NULL, credentials, false); |
| - SimulateMatchingPhase(&manager3, false); |
| - EXPECT_TRUE(manager3.HasValidPasswordForm()); |
| - |
| - // Form with neither a password_element nor a username_element. |
| - credentials.username_element.clear(); |
| - credentials.password_element.clear(); |
| - PasswordFormManager manager4(profile(), NULL, credentials, false); |
| - SimulateMatchingPhase(&manager4, false); |
| - EXPECT_TRUE(manager4.HasValidPasswordForm()); |
| } |