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

Unified Diff: chrome/browser/password_manager/password_form_manager_unittest.cc

Issue 190453002: Componentize PasswordManager and PasswordFormManager unittests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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: 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();
-}

Powered by Google App Engine
This is Rietveld 408576698