Chromium Code Reviews| 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 6fb28b50c74ea92074b4e8265f75e375a15f5cc3..d6b90e581494e9c386146545730ed7b9e33ca81d 100644 |
| --- a/components/password_manager/core/browser/password_manager_unittest.cc |
| +++ b/components/password_manager/core/browser/password_manager_unittest.cc |
| @@ -11,6 +11,8 @@ |
| #include "base/message_loop/message_loop.h" |
| #include "base/strings/string_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| +#include "components/password_manager/core/browser/log_receiver.h" |
| +#include "components/password_manager/core/browser/log_router.h" |
| #include "components/password_manager/core/browser/mock_password_store.h" |
| #include "components/password_manager/core/browser/password_autofill_manager.h" |
| #include "components/password_manager/core/browser/password_manager_driver.h" |
| @@ -35,6 +37,8 @@ namespace password_manager { |
| namespace { |
| +const char kTestText[] = "abcd1234"; |
| + |
| class MockStoreResultFilter : public CredentialsFilter { |
| public: |
| MOCK_CONST_METHOD1(FilterResultsPtr, |
| @@ -67,6 +71,7 @@ class MockPasswordManagerClient : public StubPasswordManagerClient { |
| MOCK_METHOD0(GetPrefs, PrefService*()); |
| MOCK_METHOD0(GetDriver, PasswordManagerDriver*()); |
| MOCK_CONST_METHOD0(GetStoreResultFilter, const CredentialsFilter*()); |
| + MOCK_CONST_METHOD0(GetLogRouter, LogRouter*()); |
| // Workaround for scoped_ptr<> lacking a copy constructor. |
| bool PromptUserToSaveOrUpdatePassword( |
| @@ -95,6 +100,11 @@ class MockPasswordManagerDriver : public StubPasswordManagerDriver { |
| MOCK_METHOD0(GetPasswordAutofillManager, PasswordAutofillManager*()); |
| }; |
| +class MockLogReceiver : public password_manager::LogReceiver { |
| + public: |
| + MOCK_METHOD1(LogSavePasswordProgress, void(const std::string&)); |
| +}; |
| + |
| // Invokes the password store consumer with a single copy of |form|. |
| ACTION_P(InvokeConsumer, form) { |
| ScopedVector<PasswordForm> result; |
| @@ -121,6 +131,8 @@ class PasswordManagerTest : public testing::Test { |
| .WillRepeatedly(Return(store_.get())); |
| EXPECT_CALL(*store_, GetSiteStatsMock(_)).Times(AnyNumber()); |
| EXPECT_CALL(client_, GetDriver()).WillRepeatedly(Return(&driver_)); |
| + // Prepare the LogRouter before constructing |manager_|. |
| + ON_CALL(client_, GetLogRouter()).WillByDefault(Return(&router_)); |
| manager_.reset(new PasswordManager(&client_)); |
| password_autofill_manager_.reset( |
| @@ -137,6 +149,7 @@ class PasswordManagerTest : public testing::Test { |
| void TearDown() override { |
| store_->Shutdown(); |
| store_ = nullptr; |
| + manager_.reset(); // Destruct before LogRouter. |
| } |
| PasswordForm MakeSimpleForm() { |
| @@ -213,8 +226,10 @@ class PasswordManagerTest : public testing::Test { |
| MockPasswordManagerClient client_; |
| MockPasswordManagerDriver driver_; |
| scoped_ptr<PasswordAutofillManager> password_autofill_manager_; |
| - scoped_ptr<PasswordManager> manager_; |
| PasswordForm submitted_form_; |
| + testing::StrictMock<MockLogReceiver> receiver_; |
| + LogRouter router_; |
| + scoped_ptr<PasswordManager> manager_; |
| }; |
| MATCHER_P(FormMatches, form, "") { |
| @@ -1304,4 +1319,45 @@ TEST_F(PasswordManagerTest, AutofillingOfAffiliatedCredentials) { |
| EXPECT_EQ(android_form.signon_realm, form_data.preferred_realm); |
| } |
| +TEST_F(PasswordManagerTest, LogSavePasswordProgressNoReceiver) { |
| + EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(0); |
|
vasilii
2015/11/12 16:27:34
LogSavePasswordProgress(_)
vabr (Chromium)
2015/11/12 21:55:43
Done.
|
| + // Before attaching the receiver, no text should be passed. |
| + manager()->LogSavePasswordProgress(kTestText); |
| + EXPECT_FALSE(manager()->IsLoggingActive()); |
| +} |
| + |
| +TEST_F(PasswordManagerTest, LogSavePasswordProgressAttachReceiver) { |
| + EXPECT_FALSE(manager()->IsLoggingActive()); |
| + |
| + // After attaching the logger, text should be passed. |
| + router_.RegisterReceiver(&receiver_); |
| + EXPECT_TRUE(manager()->IsLoggingActive()); |
| + EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)); |
| + manager()->LogSavePasswordProgress(kTestText); |
| + router_.UnregisterReceiver(&receiver_); |
| + EXPECT_FALSE(manager()->IsLoggingActive()); |
| +} |
| + |
| +TEST_F(PasswordManagerTest, LogSavePasswordProgressDetachReceiver) { |
| + router_.RegisterReceiver(&receiver_); |
| + EXPECT_TRUE(manager()->IsLoggingActive()); |
| + router_.UnregisterReceiver(&receiver_); |
| + EXPECT_FALSE(manager()->IsLoggingActive()); |
| + |
| + // After detaching the logger, no text should be passed. |
| + EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(0); |
|
vasilii
2015/11/12 16:27:35
LogSavePasswordProgress(_)
vabr (Chromium)
2015/11/12 21:55:43
Done.
|
| + manager()->LogSavePasswordProgress(kTestText); |
| +} |
| + |
| +TEST_F(PasswordManagerTest, LogToAReceiver) { |
|
vasilii
2015/11/12 16:27:34
I don't see any difference with LogSavePasswordPr
vabr (Chromium)
2015/11/12 21:55:43
Good call, removed.
|
| + router_.RegisterReceiver(&receiver_); |
| + EXPECT_TRUE(manager()->IsLoggingActive()); |
| + |
| + EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)); |
| + manager()->LogSavePasswordProgress(kTestText); |
| + |
| + router_.UnregisterReceiver(&receiver_); |
| + EXPECT_FALSE(manager()->IsLoggingActive()); |
| +} |
| + |
| } // namespace password_manager |