Index: chrome/browser/password_manager/password_form_manager_unittest.cc |
diff --git a/chrome/browser/password_manager/password_form_manager_unittest.cc b/chrome/browser/password_manager/password_form_manager_unittest.cc |
deleted file mode 100644 |
index 37ee238d1d3e296508476f8659f596cfc4b1c32c..0000000000000000000000000000000000000000 |
--- a/chrome/browser/password_manager/password_form_manager_unittest.cc |
+++ /dev/null |
@@ -1,744 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-#include "base/memory/scoped_ptr.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
-#include "chrome/test/base/testing_profile.h" |
-#include "components/autofill/core/common/password_form.h" |
-#include "components/password_manager/core/browser/mock_password_store.h" |
-#include "components/password_manager/core/browser/password_form_manager.h" |
-#include "components/password_manager/core/browser/password_manager.h" |
-#include "components/password_manager/core/browser/password_manager_client.h" |
-#include "components/password_manager/core/browser/password_manager_driver.h" |
-#include "components/password_manager/core/browser/password_store.h" |
-#include "components/password_manager/core/browser/test_password_store.h" |
-#include "content/public/test/test_utils.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
- |
-using autofill::PasswordForm; |
-using base::ASCIIToUTF16; |
-using ::testing::_; |
-using ::testing::Eq; |
-using ::testing::Mock; |
-using ::testing::Return; |
- |
-namespace autofill { |
-class AutofillManager; |
-} |
- |
-namespace { |
- |
-class MockPasswordManagerDriver : public PasswordManagerDriver { |
- public: |
- MockPasswordManagerDriver() {} |
- virtual ~MockPasswordManagerDriver() {} |
- |
- MOCK_METHOD1(FillPasswordForm, void(const autofill::PasswordFormFillData&)); |
- MOCK_METHOD0(DidLastPageLoadEncounterSSLErrors, bool()); |
- MOCK_METHOD0(IsOffTheRecord, bool()); |
- MOCK_METHOD0(GetPasswordGenerationManager, PasswordGenerationManager*()); |
- MOCK_METHOD0(GetPasswordManager, PasswordManager*()); |
- MOCK_METHOD0(GetAutofillManager, autofill::AutofillManager*()); |
- MOCK_METHOD1(AllowPasswordGenerationForForm, void(autofill::PasswordForm*)); |
- MOCK_METHOD1(AccountCreationFormsFound, |
- void(const std::vector<autofill::FormData>&)); |
-}; |
- |
-class TestPasswordManagerClient : public PasswordManagerClient { |
- public: |
- explicit TestPasswordManagerClient(Profile* profile, |
- PasswordStore* password_store) |
- : profile_(profile), |
- password_store_(password_store) {} |
- |
- virtual void PromptUserToSavePassword(PasswordFormManager* form_to_save) |
- OVERRIDE {} |
- virtual PrefService* GetPrefs() OVERRIDE { return profile_->GetPrefs(); } |
- virtual PasswordStore* GetPasswordStore() OVERRIDE { return password_store_;} |
- virtual PasswordManagerDriver* GetDriver() OVERRIDE { return &driver_; } |
- virtual void AuthenticateAutofillAndFillForm( |
- scoped_ptr<autofill::PasswordFormFillData> fill_data) OVERRIDE { |
- driver_.FillPasswordForm(*fill_data.get()); |
- } |
- |
- MockPasswordManagerDriver* GetMockDriver() { return &driver_; } |
- |
- private: |
- Profile* profile_; |
- PasswordStore* password_store_; |
- MockPasswordManagerDriver driver_; |
-}; |
- |
-class TestPasswordManager : public PasswordManager { |
- public: |
- explicit TestPasswordManager(PasswordManagerClient* client) |
- : PasswordManager(client) {} |
- |
- virtual void Autofill( |
- const autofill::PasswordForm& form_for_autofill, |
- const autofill::PasswordFormMap& best_matches, |
- const autofill::PasswordForm& preferred_match, |
- bool wait_for_username) const OVERRIDE { |
- best_matches_ = best_matches; |
- } |
- |
- const autofill::PasswordFormMap& GetLatestBestMatches() { |
- return best_matches_; |
- } |
- |
- private: |
- // Marked mutable to get around constness of Autofill(). |
- mutable autofill::PasswordFormMap best_matches_; |
-}; |
- |
-} // namespace |
- |
-class PasswordFormManagerTest : public testing::Test { |
- public: |
- PasswordFormManagerTest() { |
- } |
- |
- virtual void SetUp() { |
- observed_form_.origin = GURL("http://accounts.google.com/a/LoginAuth"); |
- observed_form_.action = GURL("http://accounts.google.com/a/Login"); |
- observed_form_.username_element = ASCIIToUTF16("Email"); |
- observed_form_.password_element = ASCIIToUTF16("Passwd"); |
- observed_form_.submit_element = ASCIIToUTF16("signIn"); |
- observed_form_.signon_realm = "http://accounts.google.com"; |
- |
- saved_match_ = observed_form_; |
- saved_match_.origin = GURL("http://accounts.google.com/a/ServiceLoginAuth"); |
- saved_match_.action = GURL("http://accounts.google.com/a/ServiceLogin"); |
- saved_match_.preferred = true; |
- saved_match_.username_value = ASCIIToUTF16("test@gmail.com"); |
- saved_match_.password_value = ASCIIToUTF16("test1"); |
- saved_match_.other_possible_usernames.push_back( |
- ASCIIToUTF16("test2@gmail.com")); |
- profile_ = new TestingProfile(); |
- } |
- |
- virtual void TearDown() { |
- delete profile_; |
- if (mock_store_) |
- mock_store_->Shutdown(); |
- } |
- |
- void InitializeMockStore() { |
- if (!mock_store_) { |
- mock_store_ = new MockPasswordStore(); |
- ASSERT_TRUE(mock_store_); |
- } |
- } |
- |
- MockPasswordStore* mock_store() const { |
- return mock_store_.get(); |
- } |
- |
- PasswordForm* GetPendingCredentials(PasswordFormManager* p) { |
- return &p->pending_credentials_; |
- } |
- |
- void SimulateMatchingPhase(PasswordFormManager* p, bool find_match) { |
- // Roll up the state to mock out the matching phase. |
- p->state_ = PasswordFormManager::POST_MATCHING_PHASE; |
- if (!find_match) |
- return; |
- |
- PasswordForm* match = new PasswordForm(saved_match_); |
- // Heap-allocated form is owned by p. |
- p->best_matches_[match->username_value] = match; |
- p->preferred_match_ = match; |
- } |
- |
- void SimulateFetchMatchingLoginsFromPasswordStore( |
- PasswordFormManager* manager) { |
- // Just need to update the internal states. |
- manager->state_ = PasswordFormManager::MATCHING_PHASE; |
- } |
- |
- void SimulateResponseFromPasswordStore( |
- PasswordFormManager* manager, |
- const std::vector<PasswordForm*>& result) { |
- // Simply call the callback method when request done. This will transfer |
- // the ownership of the objects in |result| to the |manager|. |
- manager->OnGetPasswordStoreResults(result); |
- } |
- |
- void SanitizePossibleUsernames(PasswordFormManager* p, PasswordForm* form) { |
- p->SanitizePossibleUsernames(form); |
- } |
- |
- bool IgnoredResult(PasswordFormManager* p, PasswordForm* form) { |
- return p->IgnoreResult(*form); |
- } |
- |
- Profile* profile() { return profile_; } |
- |
- PasswordForm* observed_form() { return &observed_form_; } |
- PasswordForm* saved_match() { return &saved_match_; } |
- PasswordForm* CreateSavedMatch(bool blacklisted) { |
- // Owned by the caller of this method. |
- PasswordForm* match = new PasswordForm(saved_match_); |
- match->blacklisted_by_user = blacklisted; |
- return match; |
- } |
- |
- private: |
- PasswordForm observed_form_; |
- PasswordForm saved_match_; |
- Profile* profile_; |
- scoped_refptr<MockPasswordStore> mock_store_; |
-}; |
- |
-TEST_F(PasswordFormManagerTest, TestNewLogin) { |
- scoped_ptr<TestPasswordManagerClient> client( |
- new TestPasswordManagerClient(profile(), NULL)); |
- scoped_ptr<MockPasswordManagerDriver> driver; |
- PasswordFormManager* manager = new PasswordFormManager( |
- NULL, client.get(), driver.get(), *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, |
- PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
- |
- // 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_EQ(observed_form()->action, |
- GetPendingCredentials(manager)->action); |
- 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); |
- // Set up the new login. |
- base::string16 new_user = ASCIIToUTF16("newuser"); |
- base::string16 new_pass = ASCIIToUTF16("newpass"); |
- credentials.username_value = new_user; |
- credentials.password_value = new_pass; |
- manager->ProvisionallySave( |
- credentials, |
- PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
- |
- // Again, the PasswordFormManager should know this is still a new login. |
- EXPECT_TRUE(manager->IsNewLogin()); |
- // And make sure everything squares up again. |
- 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(new_pass, |
- GetPendingCredentials(manager)->password_value); |
- EXPECT_EQ(new_user, |
- GetPendingCredentials(manager)->username_value); |
- delete manager; |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestUpdatePassword) { |
- // Create a PasswordFormManager with observed_form, as if we just |
- // saw this form and need to find matching logins. |
- scoped_ptr<TestPasswordManagerClient> client( |
- new TestPasswordManagerClient(profile(), NULL)); |
- scoped_ptr<MockPasswordManagerDriver> driver; |
- PasswordFormManager* manager = new PasswordFormManager( |
- NULL, client.get(), driver.get(), *observed_form(), false); |
- |
- SimulateMatchingPhase(manager, true); |
- |
- // User submits credentials for the observed form using a username previously |
- // stored, but a new password. Note that the observed form may have different |
- // origin URL (as it does in this case) than the saved_match, but we want to |
- // make sure the updated password is reflected in saved_match, because that is |
- // what we autofilled. |
- base::string16 new_pass = ASCIIToUTF16("newpassword"); |
- PasswordForm credentials = *observed_form(); |
- credentials.username_value = saved_match()->username_value; |
- credentials.password_value = new_pass; |
- credentials.preferred = true; |
- 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(manager->IsNewLogin()); |
- |
- // Make sure the credentials that would be submitted on successful login |
- // are going to match the stored entry in the db. (This verifies correct |
- // behaviour for bug 1074420). |
- EXPECT_EQ(GetPendingCredentials(manager)->origin.spec(), |
- saved_match()->origin.spec()); |
- EXPECT_EQ(GetPendingCredentials(manager)->signon_realm, |
- saved_match()->signon_realm); |
- EXPECT_TRUE(GetPendingCredentials(manager)->preferred); |
- EXPECT_EQ(new_pass, |
- GetPendingCredentials(manager)->password_value); |
- // Done. |
- delete manager; |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestIgnoreResult) { |
- scoped_ptr<TestPasswordManagerClient> client( |
- new TestPasswordManagerClient(profile(), NULL)); |
- scoped_ptr<MockPasswordManagerDriver> driver; |
- PasswordFormManager* manager = new PasswordFormManager( |
- NULL, client.get(), driver.get(), *observed_form(), false); |
- |
- // Make sure we don't match a PasswordForm if it was originally saved on |
- // an SSL-valid page and we are now on a page with invalid certificate. |
- saved_match()->ssl_valid = true; |
- EXPECT_TRUE(IgnoredResult(manager, saved_match())); |
- |
- saved_match()->ssl_valid = false; |
- // Different paths for action / origin are okay. |
- saved_match()->action = GURL("http://www.google.com/b/Login"); |
- saved_match()->origin = GURL("http://www.google.com/foo"); |
- EXPECT_FALSE(IgnoredResult(manager, saved_match())); |
- |
- // Done. |
- delete manager; |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestEmptyAction) { |
- scoped_ptr<TestPasswordManagerClient> client( |
- new TestPasswordManagerClient(profile(), NULL)); |
- scoped_ptr<MockPasswordManagerDriver> driver; |
- scoped_ptr<PasswordFormManager> manager(new PasswordFormManager( |
- NULL, client.get(), driver.get(), *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, |
- PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
- 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, TestUpdateAction) { |
- scoped_ptr<TestPasswordManagerClient> client( |
- new TestPasswordManagerClient(profile(), NULL)); |
- scoped_ptr<MockPasswordManagerDriver> driver; |
- scoped_ptr<PasswordFormManager> manager(new PasswordFormManager( |
- NULL, client.get(), driver.get(), *observed_form(), false)); |
- |
- 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, |
- PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
- EXPECT_FALSE(manager->IsNewLogin()); |
- // The observed action URL is different from the previously saved one, and |
- // is the same as the one that would be submitted on successful login. |
- EXPECT_NE(observed_form()->action, saved_match()->action); |
- EXPECT_EQ(observed_form()->action, |
- GetPendingCredentials(manager.get())->action); |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestDynamicAction) { |
- scoped_ptr<TestPasswordManagerClient> client( |
- new TestPasswordManagerClient(profile(), NULL)); |
- scoped_ptr<MockPasswordManagerDriver> driver; |
- scoped_ptr<PasswordFormManager> manager(new PasswordFormManager( |
- NULL, client.get(), driver.get(), *observed_form(), false)); |
- |
- SimulateMatchingPhase(manager.get(), false); |
- PasswordForm login(*observed_form()); |
- // The submitted action URL is different from the one observed on page load. |
- GURL new_action = GURL("http://www.google.com/new_action"); |
- login.action = new_action; |
- |
- manager->ProvisionallySave( |
- login, |
- PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
- EXPECT_TRUE(manager->IsNewLogin()); |
- // Check that the provisionally saved action URL is the same as the submitted |
- // action URL, not the one observed on page load. |
- EXPECT_EQ(new_action, |
- GetPendingCredentials(manager.get())->action); |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestAlternateUsername) { |
- // Need a MessageLoop for callbacks. |
- base::MessageLoop message_loop; |
- scoped_refptr<TestPasswordStore> password_store = new TestPasswordStore; |
- CHECK(password_store->Init()); |
- |
- TestPasswordManagerClient client(profile(), password_store.get()); |
- TestPasswordManager password_manager(&client); |
- scoped_ptr<PasswordFormManager> manager( |
- new PasswordFormManager(&password_manager, |
- &client, |
- client.GetDriver(), |
- *observed_form(), |
- false)); |
- |
- password_store->AddLogin(*saved_match()); |
- manager->FetchMatchingLoginsFromPasswordStore(PasswordStore::ALLOW_PROMPT); |
- content::RunAllPendingInMessageLoop(); |
- |
- // The saved match has the right username already. |
- PasswordForm login(*observed_form()); |
- login.username_value = saved_match()->username_value; |
- login.password_value = saved_match()->password_value; |
- login.preferred = true; |
- manager->ProvisionallySave( |
- login, |
- PasswordFormManager::ALLOW_OTHER_POSSIBLE_USERNAMES); |
- |
- EXPECT_FALSE(manager->IsNewLogin()); |
- manager->Save(); |
- content::RunAllPendingInMessageLoop(); |
- |
- // Should be only one password stored, and should not have |
- // |other_possible_usernames| set anymore. |
- TestPasswordStore::PasswordMap passwords = password_store->stored_passwords(); |
- EXPECT_EQ(1U, passwords.size()); |
- ASSERT_EQ(1U, passwords[saved_match()->signon_realm].size()); |
- EXPECT_EQ(saved_match()->username_value, |
- passwords[saved_match()->signon_realm][0].username_value); |
- EXPECT_EQ( |
- 0U, |
- passwords[saved_match()->signon_realm][0]. |
- other_possible_usernames.size()); |
- |
- // This time use an alternate username |
- manager.reset(new PasswordFormManager(&password_manager, |
- &client, |
- client.GetDriver(), |
- *observed_form(), |
- false)); |
- password_store->Clear(); |
- password_store->AddLogin(*saved_match()); |
- manager->FetchMatchingLoginsFromPasswordStore(PasswordStore::ALLOW_PROMPT); |
- content::RunAllPendingInMessageLoop(); |
- |
- base::string16 new_username = saved_match()->other_possible_usernames[0]; |
- login.username_value = new_username; |
- manager->ProvisionallySave( |
- login, |
- PasswordFormManager::ALLOW_OTHER_POSSIBLE_USERNAMES); |
- |
- EXPECT_FALSE(manager->IsNewLogin()); |
- manager->Save(); |
- content::RunAllPendingInMessageLoop(); |
- |
- // |other_possible_usernames| should also be empty, but username_value should |
- // be changed to match |new_username| |
- passwords = password_store->stored_passwords(); |
- EXPECT_EQ(1U, passwords.size()); |
- ASSERT_EQ(1U, passwords[saved_match()->signon_realm].size()); |
- EXPECT_EQ(new_username, |
- passwords[saved_match()->signon_realm][0].username_value); |
- EXPECT_EQ( |
- 0U, |
- passwords[saved_match()->signon_realm][0]. |
- other_possible_usernames.size()); |
- password_store->Shutdown(); |
-} |
- |
-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; |
- |
- // Form with both username_element and password_element. |
- PasswordFormManager manager1(NULL, NULL, 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(NULL, NULL, NULL, credentials, false); |
- SimulateMatchingPhase(&manager2, false); |
- EXPECT_FALSE(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(NULL, NULL, 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(NULL, NULL, NULL, credentials, false); |
- SimulateMatchingPhase(&manager4, false); |
- EXPECT_FALSE(manager4.HasValidPasswordForm()); |
-} |
- |
-TEST_F(PasswordFormManagerTest, 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(NULL, NULL, 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(NULL, NULL, 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(NULL, NULL, 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(NULL, NULL, NULL, credentials, false); |
- SimulateMatchingPhase(&manager4, false); |
- EXPECT_TRUE(manager4.HasValidPasswordForm()); |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestSendNotBlacklistedMessage) { |
- base::MessageLoop message_loop; |
- |
- // A dumb password manager. |
- TestPasswordManagerClient client(profile(), NULL); |
- TestPasswordManager password_manager(&client); |
- scoped_ptr<PasswordFormManager> manager( |
- new PasswordFormManager(&password_manager, |
- &client, |
- client.GetDriver(), |
- *observed_form(), |
- false)); |
- |
- // First time sign up attempt; No login result is found from password store; |
- // We should send the not blacklisted message. |
- EXPECT_CALL(*client.GetMockDriver(), AllowPasswordGenerationForForm(_)) |
- .Times(1); |
- SimulateFetchMatchingLoginsFromPasswordStore(manager.get()); |
- std::vector<PasswordForm*> result; |
- SimulateResponseFromPasswordStore(manager.get(), result); |
- Mock::VerifyAndClearExpectations(client.GetMockDriver()); |
- |
- // Sign up attempt to previously visited sites; Login result is found from |
- // password store, and is not blacklisted; We should send the not blacklisted |
- // message. |
- manager.reset(new PasswordFormManager(&password_manager, |
- &client, |
- client.GetDriver(), |
- *observed_form(), |
- false)); |
- EXPECT_CALL(*client.GetMockDriver(), AllowPasswordGenerationForForm(_)) |
- .Times(1); |
- SimulateFetchMatchingLoginsFromPasswordStore(manager.get()); |
- // We need add heap allocated objects to result. |
- result.push_back(CreateSavedMatch(false)); |
- SimulateResponseFromPasswordStore(manager.get(), result); |
- Mock::VerifyAndClearExpectations(client.GetMockDriver()); |
- |
- // Sign up attempt to previously visited sites; Login result is found from |
- // password store, but is blacklisted; We should not send the not blacklisted |
- // message. |
- manager.reset(new PasswordFormManager(&password_manager, |
- &client, |
- client.GetDriver(), |
- *observed_form(), |
- false)); |
- EXPECT_CALL(*client.GetMockDriver(), AllowPasswordGenerationForForm(_)) |
- .Times(0); |
- SimulateFetchMatchingLoginsFromPasswordStore(manager.get()); |
- result.clear(); |
- result.push_back(CreateSavedMatch(true)); |
- SimulateResponseFromPasswordStore(manager.get(), result); |
- Mock::VerifyAndClearExpectations(client.GetMockDriver()); |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestForceInclusionOfGeneratedPasswords) { |
- base::MessageLoop message_loop; |
- |
- TestPasswordManagerClient client(profile(), NULL); |
- TestPasswordManager password_manager(&client); |
- scoped_ptr<PasswordFormManager> manager( |
- new PasswordFormManager(&password_manager, |
- &client, |
- client.GetDriver(), |
- *observed_form(), |
- false)); |
- |
- // Simulate having two matches for this origin, one of which was from a form |
- // with different HTML tags for elements. Because of scoring differences, |
- // only the first form will be sent to Autofill(). |
- std::vector<PasswordForm*> results; |
- results.push_back(CreateSavedMatch(false)); |
- results.push_back(CreateSavedMatch(false)); |
- results[1]->username_value = ASCIIToUTF16("other@gmail.com"); |
- results[1]->password_element = ASCIIToUTF16("signup_password"); |
- results[1]->username_element = ASCIIToUTF16("signup_username"); |
- SimulateFetchMatchingLoginsFromPasswordStore(manager.get()); |
- SimulateResponseFromPasswordStore(manager.get(), results); |
- EXPECT_EQ(1u, password_manager.GetLatestBestMatches().size()); |
- results.clear(); |
- |
- // Same thing, except this time the credentials that don't match quite as |
- // well are generated. They should now be sent to Autofill(). |
- manager.reset(new PasswordFormManager(&password_manager, |
- &client, |
- client.GetDriver(), |
- *observed_form(), |
- false)); |
- results.push_back(CreateSavedMatch(false)); |
- results.push_back(CreateSavedMatch(false)); |
- results[1]->username_value = ASCIIToUTF16("other@gmail.com"); |
- results[1]->password_element = ASCIIToUTF16("signup_password"); |
- results[1]->username_element = ASCIIToUTF16("signup_username"); |
- results[1]->type = PasswordForm::TYPE_GENERATED; |
- SimulateFetchMatchingLoginsFromPasswordStore(manager.get()); |
- SimulateResponseFromPasswordStore(manager.get(), results); |
- EXPECT_EQ(2u, password_manager.GetLatestBestMatches().size()); |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestSanitizePossibleUsernames) { |
- scoped_ptr<TestPasswordManagerClient> client( |
- new TestPasswordManagerClient(profile(), NULL)); |
- scoped_ptr<MockPasswordManagerDriver> driver; |
- scoped_ptr<PasswordFormManager> manager(new PasswordFormManager( |
- NULL, client.get(), driver.get(), *observed_form(), false)); |
- PasswordForm credentials(*observed_form()); |
- credentials.other_possible_usernames.push_back(ASCIIToUTF16("543-43-1234")); |
- credentials.other_possible_usernames.push_back( |
- ASCIIToUTF16("378282246310005")); |
- credentials.other_possible_usernames.push_back( |
- ASCIIToUTF16("other username")); |
- credentials.username_value = ASCIIToUTF16("test@gmail.com"); |
- |
- SanitizePossibleUsernames(manager.get(), &credentials); |
- |
- // Possible credit card number and SSN are stripped. |
- std::vector<base::string16> expected; |
- expected.push_back(ASCIIToUTF16("other username")); |
- EXPECT_THAT(credentials.other_possible_usernames, Eq(expected)); |
- |
- credentials.other_possible_usernames.clear(); |
- credentials.other_possible_usernames.push_back(ASCIIToUTF16("511-32-9830")); |
- credentials.other_possible_usernames.push_back(ASCIIToUTF16("duplicate")); |
- credentials.other_possible_usernames.push_back(ASCIIToUTF16("duplicate")); |
- credentials.other_possible_usernames.push_back(ASCIIToUTF16("random")); |
- credentials.other_possible_usernames.push_back( |
- ASCIIToUTF16("test@gmail.com")); |
- |
- SanitizePossibleUsernames(manager.get(), &credentials); |
- |
- // SSN, duplicate in |other_possible_usernames| and duplicate of |
- // |username_value| all removed. |
- expected.clear(); |
- expected.push_back(ASCIIToUTF16("duplicate")); |
- expected.push_back(ASCIIToUTF16("random")); |
- EXPECT_THAT(credentials.other_possible_usernames, Eq(expected)); |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestUpdateIncompleteCredentials) { |
- InitializeMockStore(); |
- |
- // We've found this form on a website: |
- PasswordForm encountered_form; |
- encountered_form.origin = GURL("http://accounts.google.com/LoginAuth"); |
- encountered_form.signon_realm = "http://accounts.google.com/"; |
- encountered_form.action = GURL("http://accounts.google.com/Login"); |
- encountered_form.username_element = ASCIIToUTF16("Email"); |
- encountered_form.password_element = ASCIIToUTF16("Passwd"); |
- encountered_form.submit_element = ASCIIToUTF16("signIn"); |
- |
- TestPasswordManagerClient client(profile(), mock_store()); |
- MockPasswordManagerDriver driver; |
- EXPECT_CALL(driver, IsOffTheRecord()).WillRepeatedly(Return(false)); |
- EXPECT_CALL(driver, AllowPasswordGenerationForForm(_)); |
- |
- TestPasswordManager manager(&client); |
- PasswordFormManager form_manager(&manager, |
- &client, |
- &driver, |
- encountered_form, |
- false); |
- |
- const PasswordStore::AuthorizationPromptPolicy auth_policy = |
- PasswordStore::DISALLOW_PROMPT; |
- EXPECT_CALL(*mock_store(), GetLogins(encountered_form, |
- auth_policy, |
- &form_manager)); |
- form_manager.FetchMatchingLoginsFromPasswordStore(auth_policy); |
- |
- // Password store only has these incomplete credentials. |
- PasswordForm* incomplete_form = new PasswordForm(); |
- incomplete_form->origin = GURL("http://accounts.google.com/LoginAuth"); |
- incomplete_form->signon_realm = "http://accounts.google.com/"; |
- incomplete_form->password_value = ASCIIToUTF16("my_password"); |
- incomplete_form->username_value = ASCIIToUTF16("my_username"); |
- incomplete_form->preferred = true; |
- incomplete_form->ssl_valid = false; |
- incomplete_form->scheme = PasswordForm::SCHEME_HTML; |
- |
- // We expect to see this form eventually sent to the Password store. It |
- // has password/username values from the store and 'username_element', |
- // 'password_element', 'submit_element' and 'action' fields copied from |
- // the encountered form. |
- PasswordForm complete_form(*incomplete_form); |
- complete_form.action = encountered_form.action; |
- complete_form.password_element = encountered_form.password_element; |
- complete_form.username_element = encountered_form.username_element; |
- complete_form.submit_element = encountered_form.submit_element; |
- |
- // Feed the incomplete credentials to the manager. |
- std::vector<PasswordForm*> results; |
- results.push_back(incomplete_form); // Takes ownership. |
- form_manager.OnRequestDone(results); |
- |
- form_manager.ProvisionallySave( |
- complete_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
- // By now that form has been used once. |
- complete_form.times_used = 1; |
- |
- // Check that PasswordStore receives an update request with the complete form. |
- EXPECT_CALL(*mock_store(), UpdateLogin(complete_form)); |
- form_manager.Save(); |
-} |