Index: components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc |
diff --git a/components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc b/components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc |
index 11a6a2fd25c94f3b51eaeb80d0ba1ac7032ec193..df1dfe8d965b53a9eaa83fcd417223dfbab41026 100644 |
--- a/components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc |
+++ b/components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc |
@@ -27,49 +27,55 @@ |
using content::BrowserContext; |
using content::WebContents; |
+using testing::_; |
+ |
namespace { |
// Chosen by fair dice roll. Guaranteed to be random. |
const int kRequestId = 4; |
-class TestPasswordManagerClient |
+class MockPasswordManagerClient |
: public password_manager::StubPasswordManagerClient { |
public: |
- TestPasswordManagerClient(password_manager::PasswordStore* store) |
- : did_prompt_user_to_save_(false), |
- did_prompt_user_to_choose_(false), |
- did_prompt_auto_signin_(false), |
- is_off_the_record_(false), |
- store_(store) { |
+ MOCK_CONST_METHOD0(IsOffTheRecord, bool()); |
+ MOCK_METHOD1(NotifyUserAutoSigninPtr, |
+ bool(const std::vector<autofill::PasswordForm*>& local_forms)); |
+ MOCK_METHOD2(PromptUserToSavePasswordPtr, |
+ void(password_manager::PasswordFormManager*, |
+ password_manager::CredentialSourceType type)); |
+ MOCK_METHOD4(PromptUserToChooseCredentialsPtr, |
+ bool(const std::vector<autofill::PasswordForm*>& local_forms, |
+ const std::vector<autofill::PasswordForm*>& federated_forms, |
+ const GURL& origin, |
+ base::Callback<void( |
+ const password_manager::CredentialInfo&)> callback)); |
+ MockPasswordManagerClient(password_manager::PasswordStore* store) |
vabr (Chromium)
2015/03/30 07:56:43
optional nit: Separate the constructor from the MO
melandory
2015/03/30 08:40:23
Done.
|
+ : did_prompt_auto_signin_(false), store_(store) { |
prefs_.registry()->RegisterBooleanPref( |
password_manager::prefs::kPasswordManagerAutoSignin, true); |
} |
- ~TestPasswordManagerClient() override {} |
- |
- password_manager::PasswordStore* GetPasswordStore() const override { |
- return store_; |
- } |
- |
- PrefService* GetPrefs() override { return &prefs_; } |
+ ~MockPasswordManagerClient() override {} |
bool PromptUserToSavePassword( |
scoped_ptr<password_manager::PasswordFormManager> manager, |
password_manager::CredentialSourceType type) override { |
- did_prompt_user_to_save_ = true; |
- EXPECT_EQ(password_manager::CredentialSourceType::CREDENTIAL_SOURCE_API, |
- type); |
manager_.swap(manager); |
+ PromptUserToSavePasswordPtr(manager.release(), type); |
vabr (Chromium)
2015/03/30 07:56:43
This looks fishy, why do you pass on the previousl
melandory
2015/03/30 08:40:23
Done.
|
return true; |
} |
+ password_manager::PasswordStore* GetPasswordStore() const override { |
+ return store_; |
+ } |
+ |
+ PrefService* GetPrefs() override { return &prefs_; } |
+ |
bool PromptUserToChooseCredentials( |
ScopedVector<autofill::PasswordForm> local_forms, |
ScopedVector<autofill::PasswordForm> federated_forms, |
const GURL& origin, |
- base::Callback<void(const password_manager::CredentialInfo&)> callback) |
- override { |
+ base::Callback<void(const password_manager::CredentialInfo&)> callback) { |
EXPECT_FALSE(local_forms.empty() && federated_forms.empty()); |
- did_prompt_user_to_choose_ = true; |
password_manager::CredentialInfo info( |
local_forms.empty() ? *federated_forms[0] : *local_forms[0], |
local_forms.empty() |
@@ -77,29 +83,21 @@ class TestPasswordManagerClient |
: password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL); |
base::MessageLoop::current()->PostTask(FROM_HERE, |
base::Bind(callback, info)); |
+ PromptUserToChooseCredentialsPtr(local_forms.get(), federated_forms.get(), |
+ origin, callback); |
return true; |
} |
void NotifyUserAutoSignin( |
ScopedVector<autofill::PasswordForm> local_forms) override { |
EXPECT_FALSE(local_forms.empty()); |
- did_prompt_auto_signin_ = true; |
+ NotifyUserAutoSigninPtr(local_forms.get()); |
} |
- bool IsOffTheRecord() const 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_; } |
- bool did_prompt_auto_signin() const { return did_prompt_auto_signin_; } |
- |
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); |
@@ -107,14 +105,11 @@ class TestPasswordManagerClient |
private: |
TestingPrefServiceSimple prefs_; |
- bool did_prompt_user_to_save_; |
- bool did_prompt_user_to_choose_; |
bool did_prompt_auto_signin_; |
- bool is_off_the_record_; |
password_manager::PasswordStore* store_; |
scoped_ptr<password_manager::PasswordFormManager> manager_; |
- DISALLOW_COPY_AND_ASSIGN(TestPasswordManagerClient); |
+ DISALLOW_COPY_AND_ASSIGN(MockPasswordManagerClient); |
}; |
class TestCredentialManagerDispatcher |
@@ -163,9 +158,10 @@ class CredentialManagerDispatcherTest |
void SetUp() override { |
content::RenderViewHostTestHarness::SetUp(); |
store_ = new TestPasswordStore; |
- client_.reset(new TestPasswordManagerClient(store_.get())); |
+ client_.reset(new MockPasswordManagerClient(store_.get())); |
dispatcher_.reset(new TestCredentialManagerDispatcher( |
web_contents(), client_.get(), &stub_driver_)); |
+ ON_CALL(*client_, IsOffTheRecord()).WillByDefault(testing::Return(false)); |
NavigateAndCommit(GURL("https://example.com/test.html")); |
@@ -209,7 +205,7 @@ class CredentialManagerDispatcherTest |
autofill::PasswordForm form2_; |
autofill::PasswordForm cross_origin_form_; |
scoped_refptr<TestPasswordStore> store_; |
- scoped_ptr<TestPasswordManagerClient> client_; |
+ scoped_ptr<MockPasswordManagerClient> client_; |
StubPasswordManagerDriver stub_driver_; |
scoped_ptr<CredentialManagerDispatcher> dispatcher_; |
}; |
@@ -229,6 +225,12 @@ TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifyFailedSignIn) { |
TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifySignedIn) { |
CredentialInfo info(form_, |
password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL); |
+ EXPECT_CALL( |
+ *client_, |
+ PromptUserToSavePasswordPtr( |
+ _, password_manager::CredentialSourceType::CREDENTIAL_SOURCE_API)) |
vabr (Chromium)
2015/03/30 07:56:43
Isn't this leaking the manager? (Also on other pla
|
+ .Times(testing::Exactly(1)); |
+ |
dispatcher()->OnNotifySignedIn(kRequestId, info); |
const uint32 kMsgID = CredentialManagerMsg_AcknowledgeSignedIn::ID; |
@@ -241,7 +243,6 @@ TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifySignedIn) { |
// 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 = |
@@ -256,7 +257,13 @@ TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifySignedIn) { |
TEST_F(CredentialManagerDispatcherTest, CredentialManagerIncognitoSignedIn) { |
CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_LOCAL); |
- client_->set_off_the_record(true); |
+ EXPECT_CALL(*client_, IsOffTheRecord()).WillRepeatedly(testing::Return(true)); |
+ EXPECT_CALL( |
+ *client_, |
+ PromptUserToSavePasswordPtr( |
+ _, password_manager::CredentialSourceType::CREDENTIAL_SOURCE_API)) |
+ .Times(testing::Exactly(0)); |
+ |
dispatcher()->OnNotifySignedIn(kRequestId, info); |
const uint32 kMsgID = CredentialManagerMsg_AcknowledgeSignedIn::ID; |
@@ -267,7 +274,6 @@ TEST_F(CredentialManagerDispatcherTest, CredentialManagerIncognitoSignedIn) { |
RunAllPendingTasks(); |
- EXPECT_FALSE(client_->did_prompt_user_to_save()); |
EXPECT_FALSE(client_->pending_manager()); |
} |
@@ -303,6 +309,15 @@ TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifySignedOut) { |
TEST_F(CredentialManagerDispatcherTest, |
CredentialManagerOnRequestCredentialWithEmptyPasswordStore) { |
std::vector<GURL> federations; |
+ EXPECT_CALL( |
+ *client_, |
+ PromptUserToSavePasswordPtr( |
+ _, password_manager::CredentialSourceType::CREDENTIAL_SOURCE_API)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, false, federations); |
RunAllPendingTasks(); |
@@ -315,8 +330,6 @@ TEST_F(CredentialManagerDispatcherTest, |
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()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
} |
TEST_F(CredentialManagerDispatcherTest, |
@@ -324,6 +337,16 @@ TEST_F(CredentialManagerDispatcherTest, |
store_->AddLogin(cross_origin_form_); |
std::vector<GURL> federations; |
+ EXPECT_CALL( |
+ *client_, |
+ PromptUserToSavePasswordPtr( |
+ testing::_, |
+ password_manager::CredentialSourceType::CREDENTIAL_SOURCE_API)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, false, federations); |
RunAllPendingTasks(); |
@@ -336,8 +359,6 @@ TEST_F(CredentialManagerDispatcherTest, |
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()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
} |
TEST_F(CredentialManagerDispatcherTest, |
@@ -346,6 +367,10 @@ TEST_F(CredentialManagerDispatcherTest, |
store_->AddLogin(form_); |
std::vector<GURL> federations; |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(1)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, false, federations); |
RunAllPendingTasks(); |
@@ -354,14 +379,16 @@ TEST_F(CredentialManagerDispatcherTest, |
const IPC::Message* message = |
process()->sink().GetFirstMessageMatching(kMsgID); |
EXPECT_TRUE(message); |
- EXPECT_TRUE(client_->did_prompt_user_to_choose()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
} |
TEST_F( |
CredentialManagerDispatcherTest, |
CredentialManagerOnRequestCredentialWithZeroClickOnlyEmptyPasswordStore) { |
std::vector<GURL> federations; |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, true, federations); |
RunAllPendingTasks(); |
@@ -370,8 +397,6 @@ TEST_F( |
const IPC::Message* message = |
process()->sink().GetFirstMessageMatching(kMsgID); |
EXPECT_TRUE(message); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
CredentialManagerMsg_SendCredential::Param send_param; |
CredentialManagerMsg_SendCredential::Read(message, &send_param); |
EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(send_param).type); |
@@ -382,6 +407,10 @@ TEST_F(CredentialManagerDispatcherTest, |
store_->AddLogin(form_); |
std::vector<GURL> federations; |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(1)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, true, federations); |
RunAllPendingTasks(); |
@@ -390,8 +419,6 @@ TEST_F(CredentialManagerDispatcherTest, |
const IPC::Message* message = |
process()->sink().GetFirstMessageMatching(kMsgID); |
EXPECT_TRUE(message); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- EXPECT_TRUE(client_->did_prompt_auto_signin()); |
CredentialManagerMsg_SendCredential::Param send_param; |
CredentialManagerMsg_SendCredential::Read(message, &send_param); |
EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_LOCAL, get<1>(send_param).type); |
@@ -403,6 +430,10 @@ TEST_F(CredentialManagerDispatcherTest, |
store_->AddLogin(form2_); |
std::vector<GURL> federations; |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, true, federations); |
RunAllPendingTasks(); |
@@ -411,8 +442,6 @@ TEST_F(CredentialManagerDispatcherTest, |
const IPC::Message* message = |
process()->sink().GetFirstMessageMatching(kMsgID); |
EXPECT_TRUE(message); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
CredentialManagerMsg_SendCredential::Param send_param; |
CredentialManagerMsg_SendCredential::Read(message, &send_param); |
@@ -427,6 +456,10 @@ TEST_F(CredentialManagerDispatcherTest, |
store_->AddLogin(form2_); |
std::vector<GURL> federations; |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(1)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, true, federations); |
RunAllPendingTasks(); |
@@ -435,8 +468,6 @@ TEST_F(CredentialManagerDispatcherTest, |
const IPC::Message* message = |
process()->sink().GetFirstMessageMatching(kMsgID); |
EXPECT_TRUE(message); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- EXPECT_TRUE(client_->did_prompt_auto_signin()); |
CredentialManagerMsg_SendCredential::Param send_param; |
CredentialManagerMsg_SendCredential::Read(message, &send_param); |
@@ -455,6 +486,10 @@ TEST_F(CredentialManagerDispatcherTest, |
store_->AddLogin(form_); |
std::vector<GURL> federations; |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, true, federations); |
RunAllPendingTasks(); |
@@ -463,8 +498,6 @@ TEST_F(CredentialManagerDispatcherTest, |
const IPC::Message* message = |
process()->sink().GetFirstMessageMatching(kMsgID); |
EXPECT_TRUE(message); |
- EXPECT_FALSE(client_->did_prompt_user_to_choose()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
CredentialManagerMsg_SendCredential::Param send_param; |
CredentialManagerMsg_SendCredential::Read(message, &send_param); |
@@ -479,6 +512,10 @@ TEST_F(CredentialManagerDispatcherTest, |
store_->AddLogin(form_); |
std::vector<GURL> federations; |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, false, federations); |
dispatcher()->OnRequestCredential(kRequestId, false, federations); |
@@ -487,12 +524,17 @@ TEST_F(CredentialManagerDispatcherTest, |
const IPC::Message* message = |
process()->sink().GetFirstMessageMatching(kMsgID); |
EXPECT_TRUE(message); |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
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()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(1)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
process()->sink().ClearMessages(); |
@@ -507,8 +549,6 @@ TEST_F(CredentialManagerDispatcherTest, |
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()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
} |
TEST_F(CredentialManagerDispatcherTest, ResetSkipZeroClickAfterPrompt) { |
@@ -535,16 +575,18 @@ TEST_F(CredentialManagerDispatcherTest, ResetSkipZeroClickAfterPrompt) { |
// Trigger a request which should return the credential found in |form_|, and |
// wait for it to process. |
std::vector<GURL> federations; |
- dispatcher()->OnRequestCredential(kRequestId, false, federations); |
- RunAllPendingTasks(); |
- |
// Check that the form in the database has been updated. `OnRequestCredential` |
// generates a call to prompt the user to choose a credential. |
- // TestPasswordManagerClient mocks a user choice, and when users choose a |
+ // MockPasswordManagerClient mocks a user choice, and when users choose a |
// credential (and have the global zero-click flag enabled), we make sure that |
// they'll be logged in again next time. |
- EXPECT_TRUE(client_->did_prompt_user_to_choose()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(1)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
+ dispatcher()->OnRequestCredential(kRequestId, false, federations); |
+ RunAllPendingTasks(); |
+ |
passwords = store_->stored_passwords(); |
EXPECT_EQ(2U, passwords.size()); |
EXPECT_EQ(1U, passwords[form_.signon_realm].size()); |
@@ -554,10 +596,14 @@ TEST_F(CredentialManagerDispatcherTest, ResetSkipZeroClickAfterPrompt) { |
} |
TEST_F(CredentialManagerDispatcherTest, IncognitoZeroClickRequestCredential) { |
- client_->set_off_the_record(true); |
+ EXPECT_CALL(*client_, IsOffTheRecord()).WillRepeatedly(testing::Return(true)); |
store_->AddLogin(form_); |
std::vector<GURL> federations; |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) |
+ .Times(testing::Exactly(0)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); |
+ |
dispatcher()->OnRequestCredential(kRequestId, true, federations); |
RunAllPendingTasks(); |
@@ -569,8 +615,6 @@ TEST_F(CredentialManagerDispatcherTest, IncognitoZeroClickRequestCredential) { |
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()); |
- EXPECT_FALSE(client_->did_prompt_auto_signin()); |
} |
} // namespace password_manager |