Index: components/password_manager/core/browser/password_manager_unittest.cc |
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc |
index 8c367193b74ed78834dcdb97f7908d63d6f48a47..165d3b66af5f8375d870793dc087088ac301c503 100644 |
--- a/components/password_manager/core/browser/password_manager_unittest.cc |
+++ b/components/password_manager/core/browser/password_manager_unittest.cc |
@@ -44,6 +44,8 @@ class MockStoreResultFilter : public CredentialsFilter { |
MOCK_CONST_METHOD1(FilterResultsPtr, |
void(ScopedVector<autofill::PasswordForm>* results)); |
MOCK_CONST_METHOD1(ShouldSave, bool(const autofill::PasswordForm& form)); |
+ MOCK_CONST_METHOD1(ReportFormLoginSuccess, |
+ void(const PasswordFormManager& form_manager)); |
// GMock cannot handle move-only arguments. |
ScopedVector<autofill::PasswordForm> FilterResults( |
@@ -78,7 +80,7 @@ class MockPasswordManagerClient : public StubPasswordManagerClient { |
MOCK_METHOD0(GetPrefs, PrefService*()); |
MOCK_METHOD0(GetDriver, PasswordManagerDriver*()); |
MOCK_CONST_METHOD0(IsUpdatePasswordUIEnabled, bool()); |
- MOCK_CONST_METHOD0(GetStoreResultFilter, const CredentialsFilter*()); |
+ MOCK_CONST_METHOD0(GetStoreResultFilter, const MockStoreResultFilter*()); |
// Workaround for std::unique_ptr<> lacking a copy constructor. |
bool PromptUserToSaveOrUpdatePassword( |
@@ -240,7 +242,7 @@ class PasswordManagerTest : public testing::Test { |
base::MessageLoop message_loop_; |
scoped_refptr<MockPasswordStore> store_; |
- MockPasswordManagerClient client_; |
+ testing::NiceMock<MockPasswordManagerClient> client_; |
MockPasswordManagerDriver driver_; |
std::unique_ptr<PasswordAutofillManager> password_autofill_manager_; |
std::unique_ptr<PasswordManager> manager_; |
@@ -597,6 +599,35 @@ TEST_F(PasswordManagerTest, SyncCredentialsNotSaved) { |
manager()->OnPasswordFormsRendered(&driver_, observed, true); |
} |
+// On a successful login with an updated password, |
+// CredentialsFilter::ReportFormLoginSuccess should be called. |
+TEST_F(PasswordManagerTest, ReportFormLoginSuccessCalled) { |
+ PasswordForm form(MakeSimpleForm()); |
+ |
+ std::vector<PasswordForm> observed; |
+ observed.push_back(form); |
+ EXPECT_CALL(driver_, FillPasswordForm(_)).Times(2); |
+ // Simulate that |form| is already in the store, making this an update. |
+ EXPECT_CALL(*store_, GetLogins(_, _)) |
+ .WillRepeatedly(WithArg<1>(InvokeConsumer(form))); |
+ manager()->OnPasswordFormsParsed(&driver_, observed); |
+ manager()->OnPasswordFormsRendered(&driver_, observed, true); |
+ |
+ // Submit form and finish navigation. |
+ EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(client_, GetPrefs()).WillRepeatedly(Return(nullptr)); |
+ manager()->ProvisionallySavePassword(form); |
+ |
+ // Chrome should recognise the successful login and call |
+ // ReportFormLoginSuccess. |
+ EXPECT_CALL(*client_.GetStoreResultFilter(), ReportFormLoginSuccess(_)); |
+ EXPECT_CALL(*store_, UpdateLogin(_)); |
+ observed.clear(); |
+ manager()->OnPasswordFormsParsed(&driver_, observed); |
+ manager()->OnPasswordFormsRendered(&driver_, observed, true); |
+} |
+ |
// When there is a sync password saved, and the user successfully uses the |
// stored version of it, PasswordManager should not drop that password. |
TEST_F(PasswordManagerTest, SyncCredentialsNotDroppedIfUpToDate) { |