Chromium Code Reviews| Index: chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc |
| diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc |
| index ea97c61823c588f4c2dc089330f8780c89905891..a09c2b74c5df6c973e354763b59dcd2daf5f9b1a 100644 |
| --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc |
| +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc |
| @@ -19,16 +19,68 @@ |
| #include "components/password_manager/core/browser/stub_password_manager_client.h" |
| #include "components/password_manager/core/browser/stub_password_manager_driver.h" |
| #include "components/password_manager/core/common/password_manager_ui.h" |
| +#include "content/public/browser/navigation_details.h" |
| #include "content/public/test/test_browser_thread_bundle.h" |
| #include "content/public/test/web_contents_tester.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| +using ::testing::ElementsAre; |
| +using ::testing::Pointee; |
| + |
| namespace { |
| const int64 kSlowNavigationDelayInMS = 2000; |
| const int64 kQuickNavigationDelayInMS = 500; |
| +// This mock is used in tests to ensure that we're just testing the controller |
|
vabr (Chromium)
2015/03/17 09:25:58
The comment speaks about a mock, but the class bel
vasilii
2015/03/17 10:49:49
Done.
|
| +// behavior, and not the behavior of the bits and pieces it relies upon (like |
| +// FormManager). |
| +class TestManagePasswordsUIController : public ManagePasswordsUIController { |
| + public: |
| + explicit TestManagePasswordsUIController(content::WebContents* contents); |
| + ~TestManagePasswordsUIController() override; |
| + |
| + base::TimeDelta Elapsed() const override; |
| + void SetElapsed(base::TimeDelta elapsed) { elapsed_ = elapsed; } |
| + |
| + using ManagePasswordsUIController::DidNavigateMainFrame; |
| + |
| + private: |
| + void UpdateBubbleAndIconVisibility() override; |
| + void UpdateAndroidAccountChooserInfoBarVisibility() override; |
| + void SavePasswordInternal() override {} |
| + void NeverSavePasswordInternal() override {} |
| + |
| + base::TimeDelta elapsed_; |
| +}; |
| + |
| +TestManagePasswordsUIController::TestManagePasswordsUIController( |
| + content::WebContents* contents) |
| + : ManagePasswordsUIController(contents) { |
| + // Do not silently replace an existing ManagePasswordsUIController because it |
| + // unregisters itself in WebContentsDestroyed(). |
| + EXPECT_FALSE(contents->GetUserData(UserDataKey())); |
| + contents->SetUserData(UserDataKey(), this); |
| +} |
| + |
| +TestManagePasswordsUIController::~TestManagePasswordsUIController() { |
| +} |
| + |
| +base::TimeDelta TestManagePasswordsUIController::Elapsed() const { |
| + return elapsed_; |
| +} |
| + |
| +void TestManagePasswordsUIController::UpdateBubbleAndIconVisibility() { |
| + ManagePasswordsUIController::UpdateBubbleAndIconVisibility(); |
| + OnBubbleShown(); |
| +} |
| + |
| +void TestManagePasswordsUIController:: |
| + UpdateAndroidAccountChooserInfoBarVisibility() { |
| + OnBubbleShown(); |
| +} |
| + |
| } // namespace |
| class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness { |
| @@ -41,7 +93,7 @@ class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness { |
| // Create the test UIController here so that it's bound to |
| // |test_web_contents_|, and will be retrieved correctly via |
| // ManagePasswordsUIController::FromWebContents in |controller()|. |
| - new ManagePasswordsUIControllerMock(web_contents()); |
| + new TestManagePasswordsUIController(web_contents()); |
| test_local_form_.origin = GURL("http://example.com"); |
| test_local_form_.username_value = base::ASCIIToUTF16("username"); |
| @@ -62,8 +114,8 @@ class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness { |
| return credential_info_.get(); |
| } |
| - ManagePasswordsUIControllerMock* controller() { |
| - return static_cast<ManagePasswordsUIControllerMock*>( |
| + TestManagePasswordsUIController* controller() { |
| + return static_cast<TestManagePasswordsUIController*>( |
| ManagePasswordsUIController::FromWebContents(web_contents())); |
| } |
| @@ -71,12 +123,24 @@ class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness { |
| credential_info_.reset(new password_manager::CredentialInfo(info)); |
| } |
| + scoped_ptr<password_manager::PasswordFormManager> CreateFormManager(); |
| + |
| private: |
| + password_manager::StubPasswordManagerClient client_; |
| + |
| autofill::PasswordForm test_local_form_; |
| autofill::PasswordForm test_federated_form_; |
| scoped_ptr<password_manager::CredentialInfo> credential_info_; |
| }; |
| +scoped_ptr<password_manager::PasswordFormManager> |
| +ManagePasswordsUIControllerTest::CreateFormManager() { |
| + ScopedVector<autofill::PasswordForm> stored_forms; |
| + stored_forms.push_back(new autofill::PasswordForm(test_local_form())); |
| + return ManagePasswordsUIControllerMock::CreateFormManager( |
| + &client_, test_local_form(), stored_forms.Pass()); |
| +} |
| + |
| TEST_F(ManagePasswordsUIControllerTest, DefaultState) { |
| EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state()); |
| EXPECT_FALSE(controller()->PasswordPendingUserDecision()); |
| @@ -88,7 +152,7 @@ TEST_F(ManagePasswordsUIControllerTest, DefaultState) { |
| } |
| TEST_F(ManagePasswordsUIControllerTest, PasswordAutofilled) { |
| - base::string16 kTestUsername = base::ASCIIToUTF16("test_username"); |
| + base::string16 kTestUsername = test_local_form().username_value; |
| autofill::PasswordFormMap map; |
| map[kTestUsername] = &test_local_form(); |
| controller()->OnPasswordAutofilled(map); |
| @@ -96,12 +160,11 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordAutofilled) { |
| EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state()); |
| EXPECT_FALSE(controller()->PasswordPendingUserDecision()); |
| EXPECT_EQ(test_local_form().origin, controller()->origin()); |
| - EXPECT_EQ(1u, controller()->best_matches().size()); |
| - ASSERT_EQ(1u, controller()->best_matches().count(kTestUsername)); |
| + ASSERT_EQ(1u, controller()->GetCurrentForms().size()); |
| + EXPECT_EQ(kTestUsername, controller()->GetCurrentForms()[0]->username_value); |
| // Controller should store a separate copy of the form as it doesn't own it. |
| - EXPECT_NE(&test_local_form(), |
| - controller()->best_matches().find(kTestUsername)->second); |
| + EXPECT_NE(&test_local_form(), controller()->GetCurrentForms()[0]); |
| ManagePasswordsIconMock mock; |
| controller()->UpdateIconAndBubbleState(&mock); |
| @@ -109,11 +172,8 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordAutofilled) { |
| } |
| TEST_F(ManagePasswordsUIControllerTest, PasswordSubmitted) { |
| - password_manager::StubPasswordManagerClient client; |
| - password_manager::StubPasswordManagerDriver driver; |
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager( |
| - new password_manager::PasswordFormManager( |
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false)); |
| + CreateFormManager()); |
| controller()->OnPasswordSubmitted(test_form_manager.Pass()); |
| EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, |
| controller()->state()); |
| @@ -131,11 +191,11 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSubmitted) { |
| } |
| TEST_F(ManagePasswordsUIControllerTest, PasswordSaved) { |
| - password_manager::StubPasswordManagerClient client; |
| - password_manager::StubPasswordManagerDriver driver; |
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager( |
| - new password_manager::PasswordFormManager( |
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false)); |
| + CreateFormManager()); |
| + test_form_manager->ProvisionallySave( |
| + test_local_form(), |
| + password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
| controller()->OnPasswordSubmitted(test_form_manager.Pass()); |
| ManagePasswordsIconMock mock; |
| @@ -146,11 +206,11 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSaved) { |
| } |
| TEST_F(ManagePasswordsUIControllerTest, PasswordBlacklisted) { |
| - password_manager::StubPasswordManagerClient client; |
| - password_manager::StubPasswordManagerDriver driver; |
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager( |
| - new password_manager::PasswordFormManager( |
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false)); |
| + CreateFormManager()); |
| + test_form_manager->ProvisionallySave( |
| + test_local_form(), |
| + password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
| controller()->OnPasswordSubmitted(test_form_manager.Pass()); |
| ManagePasswordsIconMock mock; |
| @@ -161,11 +221,8 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordBlacklisted) { |
| } |
| TEST_F(ManagePasswordsUIControllerTest, QuickNavigations) { |
| - password_manager::StubPasswordManagerClient client; |
| - password_manager::StubPasswordManagerDriver driver; |
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager( |
| - new password_manager::PasswordFormManager( |
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false)); |
| + CreateFormManager()); |
| controller()->OnPasswordSubmitted(test_form_manager.Pass()); |
| ManagePasswordsIconMock mock; |
| controller()->UpdateIconAndBubbleState(&mock); |
| @@ -187,11 +244,8 @@ TEST_F(ManagePasswordsUIControllerTest, QuickNavigations) { |
| } |
| TEST_F(ManagePasswordsUIControllerTest, SlowNavigations) { |
| - password_manager::StubPasswordManagerClient client; |
| - password_manager::StubPasswordManagerDriver driver; |
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager( |
| - new password_manager::PasswordFormManager( |
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false)); |
| + CreateFormManager()); |
| controller()->OnPasswordSubmitted(test_form_manager.Pass()); |
| ManagePasswordsIconMock mock; |
| controller()->UpdateIconAndBubbleState(&mock); |
| @@ -214,11 +268,8 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedToNonWebbyURL) { |
| content::WebContentsTester::For(web_contents()) |
| ->NavigateAndCommit(GURL("chrome://sign-in")); |
| - password_manager::StubPasswordManagerClient client; |
| - password_manager::StubPasswordManagerDriver driver; |
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager( |
| - new password_manager::PasswordFormManager( |
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false)); |
| + CreateFormManager()); |
| controller()->OnPasswordSubmitted(test_form_manager.Pass()); |
| EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state()); |
| EXPECT_FALSE(controller()->PasswordPendingUserDecision()); |
| @@ -235,7 +286,7 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedToNonWebbyURL) { |
| TEST_F(ManagePasswordsUIControllerTest, BlacklistBlockedAutofill) { |
| test_local_form().blacklisted_by_user = true; |
| - base::string16 kTestUsername = base::ASCIIToUTF16("test_username"); |
| + base::string16 kTestUsername = test_local_form().username_value; |
| autofill::PasswordFormMap map; |
| map[kTestUsername] = &test_local_form(); |
| controller()->OnBlacklistBlockedAutofill(map); |
| @@ -243,12 +294,11 @@ TEST_F(ManagePasswordsUIControllerTest, BlacklistBlockedAutofill) { |
| EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, controller()->state()); |
| EXPECT_FALSE(controller()->PasswordPendingUserDecision()); |
| EXPECT_EQ(test_local_form().origin, controller()->origin()); |
| - EXPECT_EQ(1u, controller()->best_matches().size()); |
| - ASSERT_EQ(1u, controller()->best_matches().count(kTestUsername)); |
| + ASSERT_EQ(1u, controller()->GetCurrentForms().size()); |
| + EXPECT_EQ(kTestUsername, controller()->GetCurrentForms()[0]->username_value); |
| // Controller should store a separate copy of the form as it doesn't own it. |
| - EXPECT_NE(&test_local_form(), |
| - controller()->best_matches().find(kTestUsername)->second); |
| + EXPECT_NE(&test_local_form(), controller()->GetCurrentForms()[0]); |
| ManagePasswordsIconMock mock; |
| controller()->UpdateIconAndBubbleState(&mock); |
| @@ -259,6 +309,7 @@ TEST_F(ManagePasswordsUIControllerTest, ClickedUnblacklist) { |
| base::string16 kTestUsername = base::ASCIIToUTF16("test_username"); |
| autofill::PasswordFormMap map; |
| map[kTestUsername] = &test_local_form(); |
| + test_local_form().blacklisted_by_user = true; |
| controller()->OnBlacklistBlockedAutofill(map); |
| controller()->UnblacklistSite(); |
| @@ -314,11 +365,8 @@ TEST_F(ManagePasswordsUIControllerTest, BlacklistedElsewhere) { |
| } |
| TEST_F(ManagePasswordsUIControllerTest, AutomaticPasswordSave) { |
| - password_manager::StubPasswordManagerClient client; |
| - password_manager::StubPasswordManagerDriver driver; |
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager( |
| - new password_manager::PasswordFormManager( |
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false)); |
| + CreateFormManager()); |
| controller()->OnAutomaticPasswordSave(test_form_manager.Pass()); |
| EXPECT_EQ(password_manager::ui::CONFIRMATION_STATE, controller()->state()); |
| @@ -342,7 +390,8 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialLocal) { |
| controller()->state()); |
| EXPECT_FALSE(controller()->PasswordPendingUserDecision()); |
| EXPECT_EQ(origin, controller()->origin()); |
| - EXPECT_EQ(autofill::ConstPasswordFormMap(), controller()->best_matches()); |
| + EXPECT_THAT(controller()->GetCurrentForms(), |
| + ElementsAre(Pointee(test_local_form()))); |
| ManagePasswordsIconMock mock; |
| controller()->UpdateIconAndBubbleState(&mock); |
| @@ -352,7 +401,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialLocal) { |
| test_local_form(), |
| password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL); |
| controller()->OnBubbleHidden(); |
| - EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state()); |
| + EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state()); |
| ASSERT_TRUE(credential_info()); |
| EXPECT_EQ(test_local_form().username_value, credential_info()->id); |
| EXPECT_EQ(test_local_form().password_value, credential_info()->password); |
| @@ -375,7 +424,8 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialLocalButFederated) { |
| controller()->state()); |
| EXPECT_FALSE(controller()->PasswordPendingUserDecision()); |
| EXPECT_EQ(origin, controller()->origin()); |
| - EXPECT_EQ(autofill::ConstPasswordFormMap(), controller()->best_matches()); |
| + EXPECT_THAT(controller()->GetCurrentForms(), |
| + ElementsAre(Pointee(test_federated_form()))); |
| ManagePasswordsIconMock mock; |
| controller()->UpdateIconAndBubbleState(&mock); |
| @@ -385,7 +435,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialLocalButFederated) { |
| test_federated_form(), |
| password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL); |
| controller()->OnBubbleHidden(); |
| - EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state()); |
| + EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state()); |
| ASSERT_TRUE(credential_info()); |
| EXPECT_EQ(test_federated_form().username_value, credential_info()->id); |
| EXPECT_EQ(test_federated_form().federation_url, |
| @@ -408,7 +458,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialFederated) { |
| EXPECT_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, |
| controller()->state()); |
| EXPECT_FALSE(controller()->PasswordPendingUserDecision()); |
| - EXPECT_EQ(autofill::ConstPasswordFormMap(), controller()->best_matches()); |
| + EXPECT_EQ(0u, controller()->GetCurrentForms().size()); |
| EXPECT_EQ(origin, controller()->origin()); |
| ManagePasswordsIconMock mock; |
| @@ -419,7 +469,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialFederated) { |
| test_local_form(), |
| password_manager::CredentialType::CREDENTIAL_TYPE_FEDERATED); |
| controller()->OnBubbleHidden(); |
| - EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state()); |
| + EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state()); |
| ASSERT_TRUE(credential_info()); |
| EXPECT_EQ(test_local_form().username_value, credential_info()->id); |
| EXPECT_TRUE(credential_info()->password.empty()); |
| @@ -443,7 +493,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialCancel) { |
| test_local_form(), |
| password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY); |
| controller()->OnBubbleHidden(); |
| - EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state()); |
| + EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state()); |
| ASSERT_TRUE(credential_info()); |
| EXPECT_TRUE(credential_info()->federation.is_empty()); |
| EXPECT_TRUE(credential_info()->password.empty()); |
| @@ -457,8 +507,8 @@ TEST_F(ManagePasswordsUIControllerTest, AutoSignin) { |
| controller()->OnAutoSignin(local_credentials.Pass()); |
| EXPECT_EQ(password_manager::ui::AUTO_SIGNIN_STATE, controller()->state()); |
| EXPECT_EQ(test_local_form().origin, controller()->origin()); |
| - ASSERT_FALSE(controller()->local_credentials_forms().empty()); |
| - EXPECT_EQ(test_local_form(), *controller()->local_credentials_forms()[0]); |
| + ASSERT_FALSE(controller()->GetCurrentForms().empty()); |
| + EXPECT_EQ(test_local_form(), *controller()->GetCurrentForms()[0]); |
| ManagePasswordsIconMock mock; |
| controller()->UpdateIconAndBubbleState(&mock); |
| EXPECT_EQ(password_manager::ui::AUTO_SIGNIN_STATE, mock.state()); |