Index: components/password_manager/sync/browser/sync_credentials_filter_unittest.cc |
diff --git a/components/password_manager/sync/browser/sync_credentials_filter_unittest.cc b/components/password_manager/sync/browser/sync_credentials_filter_unittest.cc |
index c4eca6181a65758181a2106d269bf8d11652eaf6..5f26c17d5a58eef0be5d8a977e0e68dffff4c6dd 100644 |
--- a/components/password_manager/sync/browser/sync_credentials_filter_unittest.cc |
+++ b/components/password_manager/sync/browser/sync_credentials_filter_unittest.cc |
@@ -5,20 +5,30 @@ |
#include "components/password_manager/sync/browser/sync_credentials_filter.h" |
#include <stddef.h> |
+ |
+#include <memory> |
#include <utility> |
#include <vector> |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
#include "base/macros.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/memory/scoped_vector.h" |
+#include "base/message_loop/message_loop.h" |
#include "base/test/histogram_tester.h" |
#include "base/test/scoped_feature_list.h" |
#include "base/test/user_action_tester.h" |
#include "components/autofill/core/common/password_form.h" |
+#include "components/password_manager/core/browser/mock_password_store.h" |
+#include "components/password_manager/core/browser/password_manager.h" |
#include "components/password_manager/core/browser/password_manager_test_utils.h" |
+#include "components/password_manager/core/browser/stub_form_saver.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/common/password_manager_features.h" |
#include "components/password_manager/sync/browser/sync_username_test_base.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
using autofill::PasswordForm; |
@@ -27,20 +37,36 @@ namespace password_manager { |
namespace { |
+const char kFilledAndLoginActionName[] = |
+ "PasswordManager_SyncCredentialFilledAndLoginSuccessfull"; |
+ |
class FakePasswordManagerClient : public StubPasswordManagerClient { |
public: |
- ~FakePasswordManagerClient() override {} |
+ FakePasswordManagerClient() |
+ : password_store_(new testing::NiceMock<MockPasswordStore>) {} |
+ |
+ ~FakePasswordManagerClient() override { |
+ password_store_->ShutdownOnUIThread(); |
+ } |
// PasswordManagerClient: |
const GURL& GetLastCommittedEntryURL() const override { |
return last_committed_entry_url_; |
} |
+ MockPasswordStore* GetPasswordStore() const override { |
+ return password_store_.get(); |
+ } |
void set_last_committed_entry_url(const char* url_spec) { |
last_committed_entry_url_ = GURL(url_spec); |
} |
+ private: |
+ base::MessageLoop message_loop_; // For |password_store_|. |
GURL last_committed_entry_url_; |
+ scoped_refptr<testing::NiceMock<MockPasswordStore>> password_store_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakePasswordManagerClient); |
}; |
bool IsFormFiltered(const CredentialsFilter* filter, const PasswordForm& form) { |
@@ -63,8 +89,12 @@ class CredentialsFilterTest : public SyncUsernameTestBase { |
enum { NO_HISTOGRAM, HISTOGRAM_REPORTED } histogram_reported; |
}; |
+ // Flag for creating a PasswordFormManager, deciding its IsNewLogin() value. |
+ enum class LoginState { NEW, EXISTING }; |
+ |
CredentialsFilterTest() |
- : filter_(&client_, |
+ : password_manager_(&client_), |
+ filter_(&client_, |
base::Bind(&SyncUsernameTestBase::sync_service, |
base::Unretained(this)), |
base::Bind(&SyncUsernameTestBase::signin_manager, |
@@ -88,12 +118,37 @@ class CredentialsFilterTest : public SyncUsernameTestBase { |
FakeSignout(); |
} |
+ // Creates a PasswordFormManager for the |pending| form and provisionally |
+ // saves it. Ensures that the created manager's IsNewLogin responds according |
+ // to |login_state|. |
+ std::unique_ptr<PasswordFormManager> CreateFormManager( |
+ LoginState login_state, |
+ const PasswordForm& pending) { |
+ auto form_manager = base::WrapUnique(new PasswordFormManager( |
+ &password_manager_, &client_, driver_.AsWeakPtr(), pending, |
+ base::WrapUnique(new StubFormSaver))); |
+ |
+ form_manager->FetchDataFromPasswordStore(); |
+ ScopedVector<PasswordForm> saved_forms; |
+ if (login_state == LoginState::EXISTING) { |
+ saved_forms.push_back(new PasswordForm(pending)); |
+ } |
+ form_manager->OnGetPasswordStoreResults(std::move(saved_forms)); |
+ |
+ form_manager->ProvisionallySave( |
+ pending, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
+ |
+ return form_manager; |
+ } |
+ |
SyncCredentialsFilter* filter() { return &filter_; } |
FakePasswordManagerClient* client() { return &client_; } |
private: |
FakePasswordManagerClient client_; |
+ PasswordManager password_manager_; |
+ StubPasswordManagerDriver driver_; |
SyncCredentialsFilter filter_; |
}; |
@@ -225,11 +280,59 @@ TEST_F(CredentialsFilterTest, FilterResults_DisallowSync) { |
} |
} |
-TEST_F(CredentialsFilterTest, ReportFormUsed) { |
+TEST_F(CredentialsFilterTest, ReportFormLoginSuccess_ExistingSyncCredentials) { |
+ PasswordForm pending = SimpleGaiaForm("user@gmail.com"); |
+ FakeSigninAs("user@gmail.com"); |
+ SetSyncingPasswords(true); |
+ |
+ base::UserActionTester tester; |
+ auto form_manager = CreateFormManager(LoginState::EXISTING, pending); |
+ filter()->ReportFormLoginSuccess(*form_manager); |
+ EXPECT_EQ(1, tester.GetActionCount(kFilledAndLoginActionName)); |
+} |
+ |
+TEST_F(CredentialsFilterTest, ReportFormLoginSuccess_NewSyncCredentials) { |
+ PasswordForm pending = SimpleGaiaForm("user@gmail.com"); |
+ FakeSigninAs("user@gmail.com"); |
+ SetSyncingPasswords(true); |
+ |
+ base::UserActionTester tester; |
+ auto form_manager = CreateFormManager(LoginState::NEW, pending); |
+ filter()->ReportFormLoginSuccess(*form_manager); |
+ EXPECT_EQ(0, tester.GetActionCount(kFilledAndLoginActionName)); |
+} |
+ |
+TEST_F(CredentialsFilterTest, ReportFormLoginSuccess_GAIANotSyncCredentials) { |
+ PasswordForm pending = SimpleGaiaForm("user@gmail.com"); |
+ FakeSigninAs("other_user@gmail.com"); |
+ SetSyncingPasswords(true); |
+ |
+ base::UserActionTester tester; |
+ auto form_manager = CreateFormManager(LoginState::EXISTING, pending); |
+ filter()->ReportFormLoginSuccess(*form_manager); |
+ EXPECT_EQ(0, tester.GetActionCount(kFilledAndLoginActionName)); |
+} |
+ |
+TEST_F(CredentialsFilterTest, ReportFormLoginSuccess_NotGAIACredentials) { |
+ PasswordForm pending = SimpleNonGaiaForm("user@gmail.com"); |
+ FakeSigninAs("user@gmail.com"); |
+ SetSyncingPasswords(true); |
+ |
+ base::UserActionTester tester; |
+ auto form_manager = CreateFormManager(LoginState::EXISTING, pending); |
+ filter()->ReportFormLoginSuccess(*form_manager); |
+ EXPECT_EQ(0, tester.GetActionCount(kFilledAndLoginActionName)); |
+} |
+ |
+TEST_F(CredentialsFilterTest, ReportFormLoginSuccess_NotSyncing) { |
+ PasswordForm pending = SimpleGaiaForm("user@gmail.com"); |
+ FakeSigninAs("user@gmail.com"); |
+ SetSyncingPasswords(false); |
+ |
base::UserActionTester tester; |
- ASSERT_EQ(0, tester.GetActionCount("PasswordManager_SyncCredentialUsed")); |
- filter()->ReportFormUsed(PasswordForm()); |
- EXPECT_EQ(1, tester.GetActionCount("PasswordManager_SyncCredentialUsed")); |
+ auto form_manager = CreateFormManager(LoginState::EXISTING, pending); |
+ filter()->ReportFormLoginSuccess(*form_manager); |
+ EXPECT_EQ(0, tester.GetActionCount(kFilledAndLoginActionName)); |
} |
TEST_F(CredentialsFilterTest, ShouldSave_NotSyncCredential) { |