Index: components/password_manager/content/browser/content_credential_manager_dispatcher_unittest.cc |
diff --git a/components/password_manager/content/browser/content_credential_manager_dispatcher_unittest.cc b/components/password_manager/content/browser/content_credential_manager_dispatcher_unittest.cc |
deleted file mode 100644 |
index 0c4c6dc84250f419a8ed1cc307446ae0388670c5..0000000000000000000000000000000000000000 |
--- a/components/password_manager/content/browser/content_credential_manager_dispatcher_unittest.cc |
+++ /dev/null |
@@ -1,461 +0,0 @@ |
-// Copyright 2014 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 "components/password_manager/content/browser/credential_manager_dispatcher.h" |
- |
-#include "base/bind.h" |
-#include "base/command_line.h" |
-#include "base/prefs/pref_registry_simple.h" |
-#include "base/prefs/testing_pref_service.h" |
-#include "base/run_loop.h" |
-#include "base/strings/string16.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "components/password_manager/content/browser/credential_manager_password_form_manager.h" |
-#include "components/password_manager/content/common/credential_manager_messages.h" |
-#include "components/password_manager/content/common/credential_manager_types.h" |
-#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/browser/test_password_store.h" |
-#include "components/password_manager/core/common/password_manager_pref_names.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/test/mock_render_process_host.h" |
-#include "content/public/test/test_renderer_host.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using content::BrowserContext; |
-using content::WebContents; |
- |
-namespace { |
- |
-// Chosen by fair dice roll. Guaranteed to be random. |
-const int kRequestId = 4; |
- |
-class TestPasswordManagerClient |
- : public password_manager::StubPasswordManagerClient { |
- public: |
- TestPasswordManagerClient(password_manager::PasswordStore* store) |
- : did_prompt_user_to_save_(false), |
- did_prompt_user_to_choose_(false), |
- is_off_the_record_(false), |
- store_(store) { |
- prefs_.registry()->RegisterBooleanPref( |
- password_manager::prefs::kPasswordManagerAutoSignin, true); |
- } |
- ~TestPasswordManagerClient() override {} |
- |
- password_manager::PasswordStore* GetPasswordStore() override { |
- return store_; |
- } |
- |
- PrefService* GetPrefs() override { return &prefs_; } |
- |
- bool PromptUserToSavePassword( |
- scoped_ptr<password_manager::PasswordFormManager> manager) override { |
- did_prompt_user_to_save_ = true; |
- manager_.reset(manager.release()); |
- return true; |
- } |
- |
- bool PromptUserToChooseCredentials( |
- const std::vector<autofill::PasswordForm*>& local_forms, |
- const std::vector<autofill::PasswordForm*>& federated_forms, |
- base::Callback<void(const password_manager::CredentialInfo&)> callback) |
- override { |
- // TODO(melandory): Use ScopedVector instead of std::vector in arguments. |
- // ContentCredentialManagerDispatcher::OnGetPasswordStoreResults contains a |
- // memory leak because of this. |
- EXPECT_FALSE(local_forms.empty() && federated_forms.empty()); |
- did_prompt_user_to_choose_ = true; |
- ScopedVector<autofill::PasswordForm> local_entries; |
- local_entries.assign(local_forms.begin(), local_forms.end()); |
- ScopedVector<autofill::PasswordForm> federated_entries; |
- federated_entries.assign(federated_forms.begin(), federated_forms.end()); |
- password_manager::CredentialInfo info( |
- local_forms.empty() ? *federated_forms[0] : *local_entries[0], |
- local_forms.empty() |
- ? password_manager::CredentialType::CREDENTIAL_TYPE_FEDERATED |
- : password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL); |
- base::MessageLoop::current()->PostTask(FROM_HERE, |
- base::Bind(callback, info)); |
- return true; |
- } |
- |
- bool IsOffTheRecord() override { return is_off_the_record_; } |
- |
- bool did_prompt_user_to_save() const { return did_prompt_user_to_save_; } |
- bool did_prompt_user_to_choose() const { return did_prompt_user_to_choose_; } |
- |
- password_manager::PasswordFormManager* pending_manager() const { |
- return manager_.get(); |
- } |
- |
- void set_off_the_record(bool off_the_record) { |
- is_off_the_record_ = off_the_record; |
- } |
- |
- void set_zero_click_enabled(bool zero_click_enabled) { |
- prefs_.SetBoolean(password_manager::prefs::kPasswordManagerAutoSignin, |
- zero_click_enabled); |
- } |
- |
- private: |
- TestingPrefServiceSimple prefs_; |
- bool did_prompt_user_to_save_; |
- bool did_prompt_user_to_choose_; |
- bool is_off_the_record_; |
- password_manager::PasswordStore* store_; |
- scoped_ptr<password_manager::PasswordFormManager> manager_; |
-}; |
- |
-class TestCredentialManagerDispatcher |
- : public password_manager::CredentialManagerDispatcher { |
- public: |
- TestCredentialManagerDispatcher( |
- content::WebContents* web_contents, |
- password_manager::PasswordManagerClient* client, |
- password_manager::PasswordManagerDriver* driver); |
- |
- private: |
- base::WeakPtr<password_manager::PasswordManagerDriver> GetDriver() override; |
- |
- base::WeakPtr<password_manager::PasswordManagerDriver> driver_; |
-}; |
- |
-TestCredentialManagerDispatcher::TestCredentialManagerDispatcher( |
- content::WebContents* web_contents, |
- password_manager::PasswordManagerClient* client, |
- password_manager::PasswordManagerDriver* driver) |
- : CredentialManagerDispatcher(web_contents, client), |
- driver_(driver->AsWeakPtr()) { |
-} |
- |
-base::WeakPtr<password_manager::PasswordManagerDriver> |
-TestCredentialManagerDispatcher::GetDriver() { |
- return driver_; |
-} |
- |
-void RunAllPendingTasks() { |
- base::RunLoop run_loop; |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); |
- run_loop.Run(); |
-} |
- |
-} // namespace |
- |
-namespace password_manager { |
- |
-class CredentialManagerDispatcherTest |
- : public content::RenderViewHostTestHarness { |
- public: |
- CredentialManagerDispatcherTest() {} |
- |
- void SetUp() override { |
- content::RenderViewHostTestHarness::SetUp(); |
- store_ = new TestPasswordStore; |
- client_.reset(new TestPasswordManagerClient(store_.get())); |
- dispatcher_.reset(new TestCredentialManagerDispatcher( |
- web_contents(), client_.get(), &stub_driver_)); |
- |
- NavigateAndCommit(GURL("https://example.com/test.html")); |
- |
- form_.username_value = base::ASCIIToUTF16("Username"); |
- form_.display_name = base::ASCIIToUTF16("Display Name"); |
- form_.password_value = base::ASCIIToUTF16("Password"); |
- form_.origin = web_contents()->GetLastCommittedURL().GetOrigin(); |
- form_.signon_realm = form_.origin.spec(); |
- form_.scheme = autofill::PasswordForm::SCHEME_HTML; |
- |
- form2_.username_value = base::ASCIIToUTF16("Username 2"); |
- form2_.display_name = base::ASCIIToUTF16("Display Name 2"); |
- form2_.password_value = base::ASCIIToUTF16("Password 2"); |
- form2_.origin = web_contents()->GetLastCommittedURL().GetOrigin(); |
- form2_.signon_realm = form_.origin.spec(); |
- form2_.scheme = autofill::PasswordForm::SCHEME_HTML; |
- |
- cross_origin_form_.username_value = base::ASCIIToUTF16("Username"); |
- cross_origin_form_.display_name = base::ASCIIToUTF16("Display Name"); |
- cross_origin_form_.password_value = base::ASCIIToUTF16("Password"); |
- cross_origin_form_.origin = GURL("https://example.net/"); |
- cross_origin_form_.signon_realm = cross_origin_form_.origin.spec(); |
- cross_origin_form_.scheme = autofill::PasswordForm::SCHEME_HTML; |
- |
- store_->Clear(); |
- EXPECT_TRUE(store_->IsEmpty()); |
- } |
- |
- void TearDown() override { |
- store_->Shutdown(); |
- content::RenderViewHostTestHarness::TearDown(); |
- } |
- |
- CredentialManagerDispatcher* dispatcher() { return dispatcher_.get(); } |
- |
- protected: |
- autofill::PasswordForm form_; |
- autofill::PasswordForm form2_; |
- autofill::PasswordForm cross_origin_form_; |
- scoped_refptr<TestPasswordStore> store_; |
- scoped_ptr<TestPasswordManagerClient> client_; |
- StubPasswordManagerDriver stub_driver_; |
- scoped_ptr<CredentialManagerDispatcher> dispatcher_; |
-}; |
- |
-TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifyFailedSignIn) { |
- CredentialInfo info; |
- info.type = CredentialType::CREDENTIAL_TYPE_LOCAL; |
- dispatcher()->OnNotifyFailedSignIn(kRequestId, info); |
- |
- const uint32 kMsgID = CredentialManagerMsg_AcknowledgeFailedSignIn::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- process()->sink().ClearMessages(); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifySignedIn) { |
- CredentialInfo info(form_, |
- password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL); |
- dispatcher()->OnNotifySignedIn(kRequestId, info); |
- |
- const uint32 kMsgID = CredentialManagerMsg_AcknowledgeSignedIn::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- process()->sink().ClearMessages(); |
- |
- // Allow the PasswordFormManager to talk to the password store, determine |
- // that the form is new, and set it as pending. |
- RunAllPendingTasks(); |
- |
- EXPECT_TRUE(client_->did_prompt_user_to_save()); |
- EXPECT_TRUE(client_->pending_manager()->HasCompletedMatching()); |
- |
- autofill::PasswordForm new_form = |
- client_->pending_manager()->pending_credentials(); |
- EXPECT_EQ(form_.username_value, new_form.username_value); |
- EXPECT_EQ(form_.display_name, new_form.display_name); |
- EXPECT_EQ(form_.password_value, new_form.password_value); |
- EXPECT_EQ(form_.origin, new_form.origin); |
- EXPECT_EQ(form_.signon_realm, new_form.signon_realm); |
- EXPECT_EQ(autofill::PasswordForm::SCHEME_HTML, new_form.scheme); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, CredentialManagerIncognitoSignedIn) { |
- CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_LOCAL); |
- client_->set_off_the_record(true); |
- dispatcher()->OnNotifySignedIn(kRequestId, info); |
- |
- const uint32 kMsgID = CredentialManagerMsg_AcknowledgeSignedIn::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- process()->sink().ClearMessages(); |
- |
- RunAllPendingTasks(); |
- |
- EXPECT_FALSE(client_->did_prompt_user_to_save()); |
- EXPECT_FALSE(client_->pending_manager()); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifySignedOut) { |
- store_->AddLogin(form_); |
- store_->AddLogin(cross_origin_form_); |
- RunAllPendingTasks(); |
- |
- TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); |
- EXPECT_EQ(2U, passwords.size()); |
- EXPECT_EQ(1U, passwords[form_.signon_realm].size()); |
- EXPECT_EQ(1U, passwords[cross_origin_form_.signon_realm].size()); |
- EXPECT_FALSE(passwords[form_.signon_realm][0].skip_zero_click); |
- EXPECT_FALSE(passwords[cross_origin_form_.signon_realm][0].skip_zero_click); |
- |
- dispatcher()->OnNotifySignedOut(kRequestId); |
- RunAllPendingTasks(); |
- |
- const uint32 kMsgID = CredentialManagerMsg_AcknowledgeSignedOut::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- process()->sink().ClearMessages(); |
- |
- passwords = store_->stored_passwords(); |
- EXPECT_EQ(2U, passwords.size()); |
- EXPECT_EQ(1U, passwords[form_.signon_realm].size()); |
- EXPECT_EQ(1U, passwords[cross_origin_form_.signon_realm].size()); |
- EXPECT_TRUE(passwords[form_.signon_realm][0].skip_zero_click); |
- EXPECT_FALSE(passwords[cross_origin_form_.signon_realm][0].skip_zero_click); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, |
- CredentialManagerOnRequestCredentialWithEmptyPasswordStore) { |
- std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, false, federations); |
- |
- RunAllPendingTasks(); |
- |
- const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- CredentialManagerMsg_SendCredential::Param param; |
- CredentialManagerMsg_SendCredential::Read(message, ¶m); |
- EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(param).type); |
- process()->sink().ClearMessages(); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, |
- CredentialManagerOnRequestCredentialWithCrossOriginPasswordStore) { |
- store_->AddLogin(cross_origin_form_); |
- |
- std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, false, federations); |
- |
- RunAllPendingTasks(); |
- |
- const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- CredentialManagerMsg_SendCredential::Param param; |
- CredentialManagerMsg_SendCredential::Read(message, ¶m); |
- EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(param).type); |
- process()->sink().ClearMessages(); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, |
- CredentialManagerOnRequestCredentialWithFullPasswordStore) { |
- client_->set_zero_click_enabled(false); |
- store_->AddLogin(form_); |
- |
- std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, false, federations); |
- |
- RunAllPendingTasks(); |
- |
- const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- EXPECT_TRUE(client_->did_prompt_user_to_choose()); |
-} |
- |
-TEST_F( |
- CredentialManagerDispatcherTest, |
- CredentialManagerOnRequestCredentialWithZeroClickOnlyEmptyPasswordStore) { |
- std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, true, federations); |
- |
- RunAllPendingTasks(); |
- |
- const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- CredentialManagerMsg_SendCredential::Param send_param; |
- CredentialManagerMsg_SendCredential::Read(message, &send_param); |
- EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(send_param).type); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, |
- CredentialManagerOnRequestCredentialWithZeroClickOnlyFullPasswordStore) { |
- store_->AddLogin(form_); |
- |
- std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, true, federations); |
- |
- RunAllPendingTasks(); |
- |
- const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- CredentialManagerMsg_SendCredential::Param send_param; |
- CredentialManagerMsg_SendCredential::Read(message, &send_param); |
- EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_LOCAL, get<1>(send_param).type); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, |
- CredentialManagerOnRequestCredentialWithZeroClickOnlyTwoPasswordStore) { |
- store_->AddLogin(form_); |
- store_->AddLogin(form2_); |
- |
- std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, true, federations); |
- |
- RunAllPendingTasks(); |
- |
- const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- CredentialManagerMsg_SendCredential::Param send_param; |
- CredentialManagerMsg_SendCredential::Read(message, &send_param); |
- |
- // With two items in the password store, we shouldn't get credentials back. |
- EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(send_param).type); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, |
- CredentialManagerOnRequestCredentialWhileRequestPending) { |
- client_->set_zero_click_enabled(false); |
- store_->AddLogin(form_); |
- |
- std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, false, federations); |
- dispatcher()->OnRequestCredential(kRequestId, false, federations); |
- |
- // Check that the second request triggered a rejection. |
- uint32 kMsgID = CredentialManagerMsg_RejectCredentialRequest::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- CredentialManagerMsg_RejectCredentialRequest::Param reject_param; |
- CredentialManagerMsg_RejectCredentialRequest::Read(message, &reject_param); |
- EXPECT_EQ(blink::WebCredentialManagerError::ErrorTypePendingRequest, |
- get<1>(reject_param)); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- |
- process()->sink().ClearMessages(); |
- |
- // Execute the PasswordStore asynchronousness. |
- RunAllPendingTasks(); |
- |
- // Check that the first request resolves. |
- kMsgID = CredentialManagerMsg_SendCredential::ID; |
- message = process()->sink().GetFirstMessageMatching(kMsgID); |
- EXPECT_TRUE(message); |
- CredentialManagerMsg_SendCredential::Param send_param; |
- CredentialManagerMsg_SendCredential::Read(message, &send_param); |
- EXPECT_NE(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(send_param).type); |
- process()->sink().ClearMessages(); |
- EXPECT_TRUE(client_->did_prompt_user_to_choose()); |
-} |
- |
-TEST_F(CredentialManagerDispatcherTest, IncognitoRequestCredential) { |
- client_->set_off_the_record(true); |
- store_->AddLogin(form_); |
- |
- std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, true, federations); |
- |
- RunAllPendingTasks(); |
- |
- const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; |
- const IPC::Message* message = |
- process()->sink().GetFirstMessageMatching(kMsgID); |
- ASSERT_TRUE(message); |
- CredentialManagerMsg_SendCredential::Param param; |
- CredentialManagerMsg_SendCredential::Read(message, ¶m); |
- EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(param).type); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
-} |
- |
-} // namespace password_manager |