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

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

Issue 184103016: Autofill: Refactoring to support fetching password after a username is selected (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Actually fix compile failure. Created 6 years, 8 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_autofill_manager_unittest.cc
diff --git a/components/password_manager/core/browser/password_autofill_manager_unittest.cc b/components/password_manager/core/browser/password_autofill_manager_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..19ba317c3b0e482ff9371cd311ac066578faefcc
--- /dev/null
+++ b/components/password_manager/core/browser/password_autofill_manager_unittest.cc
@@ -0,0 +1,191 @@
+// Copyright 2013 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 "base/compiler_specific.h"
+#include "base/message_loop/message_loop.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/popup_item_ids.h"
+#include "components/autofill/core/browser/test_autofill_driver.h"
+#include "components/autofill/core/browser/test_autofill_manager_delegate.h"
+#include "components/password_manager/core/browser/password_autofill_manager.h"
+#include "components/password_manager/core/browser/password_manager_client.h"
+#include "components/password_manager/core/browser/password_manager_driver.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/rect_f.h"
+
+// The name of the username/password element in the form.
+const char kUsernameName[] = "username";
+const char kInvalidUsername[] = "no-username";
+const char kPasswordName[] = "password";
+
+const char kAliceUsername[] = "alice";
+const char kAlicePassword[] = "password";
+
+using testing::_;
+
+namespace autofill {
+class AutofillPopupDelegate;
+}
+
+namespace {
+
+// TODO(dubroy): Implement a TestPasswordManagerDriver that can be shared by
+// all the tests that need it (crbug.com/352566).
+class MockPasswordManagerDriver
+ : public password_manager::PasswordManagerDriver {
+ public:
+ MOCK_METHOD1(FillPasswordForm, void(const autofill::PasswordFormFillData&));
+ MOCK_METHOD0(DidLastPageLoadEncounterSSLErrors, bool());
+ MOCK_METHOD0(IsOffTheRecord, bool());
+ MOCK_METHOD0(GetPasswordGenerationManager,
+ password_manager::PasswordGenerationManager*());
+ MOCK_METHOD0(GetPasswordManager, password_manager::PasswordManager*());
+ MOCK_METHOD0(GetAutofillManager, autofill::AutofillManager*());
+ MOCK_METHOD1(AllowPasswordGenerationForForm, void(autofill::PasswordForm*));
+ MOCK_METHOD1(AccountCreationFormsFound,
+ void(const std::vector<autofill::FormData>&));
+ MOCK_METHOD2(AcceptPasswordAutofillSuggestion,
+ void(const base::string16&, const base::string16&));
+ MOCK_METHOD0(GetPasswordAutofillManager,
+ password_manager::PasswordAutofillManager*());
+};
+
+class TestPasswordManagerClient
+ : public password_manager::PasswordManagerClient {
+ public:
+ virtual void PromptUserToSavePassword(
+ password_manager::PasswordFormManager* form_to_save) OVERRIDE {}
+ virtual password_manager::PasswordStore* GetPasswordStore() OVERRIDE {
+ return NULL;
+ }
+ virtual PrefService* GetPrefs() OVERRIDE { return NULL; }
+ virtual password_manager::PasswordManagerDriver* GetDriver() OVERRIDE {
+ return &driver_;
+ }
+ virtual void AuthenticateAutofillAndFillForm(
+ scoped_ptr<autofill::PasswordFormFillData> fill_data) OVERRIDE {}
+ virtual bool IsPasswordSyncEnabled() OVERRIDE { return false; }
+
+ MockPasswordManagerDriver* mock_driver() { return &driver_; }
+
+ private:
+ MockPasswordManagerDriver driver_;
+};
+
+class MockAutofillManagerDelegate
+ : public autofill::TestAutofillManagerDelegate {
+ public:
+ MOCK_METHOD7(ShowAutofillPopup,
+ void(const gfx::RectF& element_bounds,
+ base::i18n::TextDirection text_direction,
+ const std::vector<base::string16>& values,
+ const std::vector<base::string16>& labels,
+ const std::vector<base::string16>& icons,
+ const std::vector<int>& identifiers,
+ base::WeakPtr<autofill::AutofillPopupDelegate> delegate));
+ MOCK_METHOD0(HideAutofillPopup, void());
+};
+
+} // namespace
+
+class PasswordAutofillManagerTest : public testing::Test {
+ protected:
+ PasswordAutofillManagerTest()
+ : test_username_(base::ASCIIToUTF16(kAliceUsername)),
+ test_password_(base::ASCIIToUTF16(kAlicePassword)) {}
+
+ virtual void SetUp() OVERRIDE {
+ // Add a preferred login and an additional login to the FillData.
+ username_field_.name = base::ASCIIToUTF16(kUsernameName);
+ username_field_.value = test_username_;
+ fill_data_.basic_data.fields.push_back(username_field_);
+
+ autofill::FormFieldData password_field;
+ password_field.name = base::ASCIIToUTF16(kPasswordName);
+ password_field.value = test_password_;
+ fill_data_.basic_data.fields.push_back(password_field);
+ }
+
+ void InitializePasswordAutofillManager(
+ password_manager::PasswordManagerClient* client,
+ autofill::AutofillManagerDelegate* autofill_manager_delegate) {
+ password_autofill_manager_.reset(
+ new password_manager::PasswordAutofillManager(
+ client, autofill_manager_delegate));
+ password_autofill_manager_->OnAddPasswordFormMapping(username_field_,
+ fill_data_);
+ }
+
+ protected:
+ scoped_ptr<password_manager::PasswordAutofillManager>
+ password_autofill_manager_;
+
+ autofill::FormFieldData username_field_;
+ base::string16 test_username_;
+ base::string16 test_password_;
+
+ private:
+ autofill::PasswordFormFillData fill_data_;
+
+ // The TestAutofillDriver uses a SequencedWorkerPool which expects the
+ // existence of a MessageLoop.
+ base::MessageLoop message_loop_;
+};
+
+TEST_F(PasswordAutofillManagerTest, AcceptSuggestion) {
+ scoped_ptr<TestPasswordManagerClient> client(new TestPasswordManagerClient);
+ InitializePasswordAutofillManager(client.get(), NULL);
+
+ EXPECT_CALL(*client->mock_driver(),
+ AcceptPasswordAutofillSuggestion(test_username_, test_password_));
+ EXPECT_TRUE(password_autofill_manager_->AcceptSuggestionForTest(
+ username_field_, test_username_));
+ testing::Mock::VerifyAndClearExpectations(client->mock_driver());
+
+ EXPECT_CALL(*client->mock_driver(),
+ AcceptPasswordAutofillSuggestion(_, _)).Times(0);
+ EXPECT_FALSE(password_autofill_manager_->AcceptSuggestionForTest(
+ username_field_, base::ASCIIToUTF16(kInvalidUsername)));
+
+ autofill::FormFieldData invalid_username_field;
+ invalid_username_field.name = base::ASCIIToUTF16(kInvalidUsername);
+
+ EXPECT_FALSE(password_autofill_manager_->AcceptSuggestionForTest(
+ invalid_username_field, test_username_));
+
+ password_autofill_manager_->Reset();
+ EXPECT_FALSE(password_autofill_manager_->AcceptSuggestionForTest(
+ username_field_, test_username_));
+}
+
+// Test that the popup is marked as visible after recieving password
+// suggestions.
+TEST_F(PasswordAutofillManagerTest, ExternalDelegatePasswordSuggestions) {
+ scoped_ptr<TestPasswordManagerClient> client(new TestPasswordManagerClient);
+ scoped_ptr<MockAutofillManagerDelegate> delegate(
+ new MockAutofillManagerDelegate);
+ InitializePasswordAutofillManager(client.get(), delegate.get());
+
+ gfx::RectF element_bounds;
+ std::vector<base::string16> suggestions;
+ suggestions.push_back(test_username_);
+ std::vector<base::string16> realms;
+ realms.push_back(base::ASCIIToUTF16("http://foo.com/"));
+
+ // The enums must be cast to ints to prevent compile errors on linux_rel.
+ EXPECT_CALL(
+ *delegate,
+ ShowAutofillPopup(_, _, _, _, _,
+ testing::ElementsAre(
+ autofill::POPUP_ITEM_ID_PASSWORD_ENTRY),
+ _));
+ password_autofill_manager_->OnShowPasswordSuggestions(
+ username_field_, element_bounds, suggestions, realms);
+
+ // Accepting a suggestion should trigger a call to hide the popup.
+ EXPECT_CALL(*delegate, HideAutofillPopup());
+ password_autofill_manager_->DidAcceptSuggestion(
+ suggestions[0], autofill::POPUP_ITEM_ID_PASSWORD_ENTRY);
+}

Powered by Google App Engine
This is Rietveld 408576698