| Index: chrome/browser/password_manager/password_store_proxy_mac_unittest.cc
|
| diff --git a/chrome/browser/password_manager/password_store_proxy_mac_unittest.cc b/chrome/browser/password_manager/password_store_proxy_mac_unittest.cc
|
| index a601bcafc7f99652395bc65ccc5b11276631f152..f42108d3a57f01a312f68104b6b7c109ba969151 100644
|
| --- a/chrome/browser/password_manager/password_store_proxy_mac_unittest.cc
|
| +++ b/chrome/browser/password_manager/password_store_proxy_mac_unittest.cc
|
| @@ -42,11 +42,6 @@ using testing::ElementsAre;
|
| using testing::IsEmpty;
|
| using testing::Pointee;
|
|
|
| -ACTION(QuitUIMessageLoop) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - base::MessageLoop::current()->QuitWhenIdle();
|
| -}
|
| -
|
| // Returns a change list corresponding to |form| being added.
|
| PasswordStoreChangeList AddChangeForForm(const PasswordForm& form) {
|
| return PasswordStoreChangeList(
|
| @@ -56,14 +51,31 @@ PasswordStoreChangeList AddChangeForForm(const PasswordForm& form) {
|
| class MockPasswordStoreConsumer
|
| : public password_manager::PasswordStoreConsumer {
|
| public:
|
| - MOCK_METHOD1(OnGetPasswordStoreResultsConstRef,
|
| - void(const std::vector<std::unique_ptr<PasswordForm>>&));
|
| + MockPasswordStoreConsumer() = default;
|
| +
|
| + void WaitForResult() {
|
| + base::RunLoop run_loop;
|
| + nested_loop_ = &run_loop;
|
| + run_loop.Run();
|
| + nested_loop_ = nullptr;
|
| + }
|
|
|
| - // GMock cannot mock methods with move-only args.
|
| + const std::vector<std::unique_ptr<PasswordForm>>& forms() const {
|
| + return forms_;
|
| + }
|
| +
|
| + private:
|
| void OnGetPasswordStoreResults(
|
| std::vector<std::unique_ptr<PasswordForm>> results) override {
|
| - OnGetPasswordStoreResultsConstRef(results);
|
| + forms_.swap(results);
|
| + if (nested_loop_)
|
| + nested_loop_->Quit();
|
| }
|
| +
|
| + std::vector<std::unique_ptr<PasswordForm>> forms_;
|
| + base::RunLoop* nested_loop_ = nullptr;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MockPasswordStoreConsumer);
|
| };
|
|
|
| class MockPasswordStoreObserver
|
| @@ -78,6 +90,8 @@ class MockPasswordStoreObserver
|
|
|
| private:
|
| ScopedObserver<PasswordStoreProxyMac, MockPasswordStoreObserver> guard_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MockPasswordStoreObserver);
|
| };
|
|
|
| // A mock LoginDatabase that simulates a failing Init() method.
|
| @@ -122,6 +136,9 @@ class PasswordStoreProxyMacTest
|
|
|
| base::FilePath test_login_db_file_path() const;
|
|
|
| + // Returns the expected migration status after the password store was inited.
|
| + MigrationStatus GetTargetStatus(bool keychain_locked) const;
|
| +
|
| password_manager::LoginDatabase* login_db() const {
|
| return store_->login_metadata_db();
|
| }
|
| @@ -163,7 +180,7 @@ void PasswordStoreProxyMacTest::CreateAndInitPasswordStore(
|
| std::unique_ptr<password_manager::LoginDatabase> login_db) {
|
| store_ = new PasswordStoreProxyMac(
|
| BrowserThread::GetTaskRunnerForThread(BrowserThread::UI),
|
| - base::WrapUnique(new crypto::MockAppleKeychain), std::move(login_db),
|
| + base::MakeUnique<crypto::MockAppleKeychain>(), std::move(login_db),
|
| &testing_prefs_);
|
| ASSERT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare()));
|
| }
|
| @@ -182,15 +199,26 @@ void PasswordStoreProxyMacTest::FinishAsyncProcessing() {
|
| MockPasswordStoreConsumer consumer;
|
| store_->GetLogins({PasswordForm::SCHEME_HTML, std::string(), GURL()},
|
| &consumer);
|
| - EXPECT_CALL(consumer, OnGetPasswordStoreResultsConstRef(_))
|
| - .WillOnce(QuitUIMessageLoop());
|
| - base::RunLoop().Run();
|
| + consumer.WaitForResult();
|
| }
|
|
|
| base::FilePath PasswordStoreProxyMacTest::test_login_db_file_path() const {
|
| return db_dir_.path().Append(FILE_PATH_LITERAL("login.db"));
|
| }
|
|
|
| +MigrationStatus PasswordStoreProxyMacTest::GetTargetStatus(
|
| + bool keychain_locked) const {
|
| + if (GetParam() == MigrationStatus::NOT_STARTED ||
|
| + GetParam() == MigrationStatus::FAILED_ONCE ||
|
| + GetParam() == MigrationStatus::FAILED_TWICE) {
|
| + return keychain_locked ? MigrationStatus::MIGRATED_PARTIALLY
|
| + : MigrationStatus::MIGRATED;
|
| + }
|
| + if (GetParam() == MigrationStatus::MIGRATED)
|
| + return MigrationStatus::MIGRATED_DELETED;
|
| + return GetParam();
|
| +}
|
| +
|
| void PasswordStoreProxyMacTest::AddForm(const PasswordForm& form) {
|
| MockPasswordStoreObserver mock_observer(store());
|
|
|
| @@ -273,12 +301,7 @@ TEST_P(PasswordStoreProxyMacTest, StartAndStop) {
|
|
|
| int status = testing_prefs_.GetInteger(
|
| password_manager::prefs::kKeychainMigrationStatus);
|
| - if (GetParam() == MigrationStatus::NOT_STARTED ||
|
| - GetParam() == MigrationStatus::FAILED_ONCE) {
|
| - EXPECT_EQ(static_cast<int>(MigrationStatus::MIGRATED), status);
|
| - } else {
|
| - EXPECT_EQ(static_cast<int>(GetParam()), status);
|
| - }
|
| + EXPECT_EQ(static_cast<int>(GetTargetStatus(false)), status);
|
| }
|
|
|
| TEST_P(PasswordStoreProxyMacTest, FormLifeCycle) {
|
| @@ -318,22 +341,16 @@ TEST_P(PasswordStoreProxyMacTest, FillLogins) {
|
|
|
| MockPasswordStoreConsumer mock_consumer;
|
| store()->GetLogins(PasswordStore::FormDigest(password_form), &mock_consumer);
|
| - EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(
|
| - ElementsAre(Pointee(password_form))))
|
| - .WillOnce(QuitUIMessageLoop());
|
| - base::RunLoop().Run();
|
| + mock_consumer.WaitForResult();
|
| + EXPECT_THAT(mock_consumer.forms(), ElementsAre(Pointee(password_form)));
|
|
|
| store()->GetBlacklistLogins(&mock_consumer);
|
| - EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(
|
| - ElementsAre(Pointee(blacklisted_form))))
|
| - .WillOnce(QuitUIMessageLoop());
|
| - base::RunLoop().Run();
|
| + mock_consumer.WaitForResult();
|
| + EXPECT_THAT(mock_consumer.forms(), ElementsAre(Pointee(blacklisted_form)));
|
|
|
| store()->GetAutofillableLogins(&mock_consumer);
|
| - EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(
|
| - ElementsAre(Pointee(password_form))))
|
| - .WillOnce(QuitUIMessageLoop());
|
| - base::RunLoop().Run();
|
| + mock_consumer.WaitForResult();
|
| + EXPECT_THAT(mock_consumer.forms(), ElementsAre(Pointee(password_form)));
|
| }
|
|
|
| TEST_P(PasswordStoreProxyMacTest, OperationsOnABadDatabaseSilentlyFail) {
|
| @@ -341,7 +358,7 @@ TEST_P(PasswordStoreProxyMacTest, OperationsOnABadDatabaseSilentlyFail) {
|
| // explosions, but fail without side effect, return no data and trigger no
|
| // notifications.
|
| ClosePasswordStore();
|
| - CreateAndInitPasswordStore(base::WrapUnique(new BadLoginDatabase));
|
| + CreateAndInitPasswordStore(base::MakeUnique<BadLoginDatabase>());
|
| FinishAsyncProcessing();
|
| EXPECT_FALSE(login_db());
|
|
|
| @@ -377,18 +394,16 @@ TEST_P(PasswordStoreProxyMacTest, OperationsOnABadDatabaseSilentlyFail) {
|
| // Get all logins; autofillable logins; blacklisted logins.
|
| MockPasswordStoreConsumer mock_consumer;
|
| store()->GetLogins(PasswordStore::FormDigest(*form), &mock_consumer);
|
| - ON_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(_))
|
| - .WillByDefault(QuitUIMessageLoop());
|
| - EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty()));
|
| - base::RunLoop().Run();
|
| + mock_consumer.WaitForResult();
|
| + EXPECT_THAT(mock_consumer.forms(), IsEmpty());
|
|
|
| store()->GetAutofillableLogins(&mock_consumer);
|
| - EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty()));
|
| - base::RunLoop().Run();
|
| + mock_consumer.WaitForResult();
|
| + EXPECT_THAT(mock_consumer.forms(), IsEmpty());
|
|
|
| store()->GetBlacklistLogins(&mock_consumer);
|
| - EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty()));
|
| - base::RunLoop().Run();
|
| + mock_consumer.WaitForResult();
|
| + EXPECT_THAT(mock_consumer.forms(), IsEmpty());
|
|
|
| // Report metrics.
|
| store()->ReportMetrics("Test Username", true);
|
| @@ -415,7 +430,9 @@ INSTANTIATE_TEST_CASE_P(,
|
| testing::Values(MigrationStatus::NOT_STARTED,
|
| MigrationStatus::MIGRATED,
|
| MigrationStatus::FAILED_ONCE,
|
| - MigrationStatus::FAILED_TWICE));
|
| + MigrationStatus::FAILED_TWICE,
|
| + MigrationStatus::MIGRATED_DELETED,
|
| + MigrationStatus::MIGRATED_PARTIALLY));
|
|
|
| // Test the migration process.
|
| class PasswordStoreProxyMacMigrationTest : public PasswordStoreProxyMacTest {
|
| @@ -443,7 +460,10 @@ void PasswordStoreProxyMacMigrationTest::TestMigration(bool lock_keychain) {
|
| form.username_value = base::ASCIIToUTF16("my_username");
|
| form.password_value = base::ASCIIToUTF16("12345");
|
|
|
| - if (GetParam() != MigrationStatus::MIGRATED)
|
| + const bool before_migration = (GetParam() == MigrationStatus::NOT_STARTED ||
|
| + GetParam() == MigrationStatus::FAILED_ONCE ||
|
| + GetParam() == MigrationStatus::FAILED_TWICE);
|
| + if (before_migration)
|
| login_db_->set_clear_password_values(true);
|
| EXPECT_TRUE(login_db_->Init());
|
| EXPECT_EQ(AddChangeForForm(form), login_db_->AddLogin(form));
|
| @@ -463,34 +483,31 @@ void PasswordStoreProxyMacMigrationTest::TestMigration(bool lock_keychain) {
|
| ASSERT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare()));
|
| FinishAsyncProcessing();
|
|
|
| - // Check the password is still there.
|
| - if (lock_keychain && store_->password_store_mac()) {
|
| - static_cast<crypto::MockAppleKeychain*>(
|
| - store_->password_store_mac()->keychain())
|
| - ->set_locked(false);
|
| - }
|
| MockPasswordStoreConsumer mock_consumer;
|
| store()->GetLogins(PasswordStore::FormDigest(form), &mock_consumer);
|
| - EXPECT_CALL(mock_consumer,
|
| - OnGetPasswordStoreResultsConstRef(ElementsAre(Pointee(form))))
|
| - .WillOnce(QuitUIMessageLoop());
|
| - base::RunLoop().Run();
|
| + mock_consumer.WaitForResult();
|
| + if (before_migration && lock_keychain)
|
| + EXPECT_THAT(mock_consumer.forms(), IsEmpty());
|
| + else
|
| + EXPECT_THAT(mock_consumer.forms(), ElementsAre(Pointee(form)));
|
|
|
| int status = testing_prefs_.GetInteger(
|
| password_manager::prefs::kKeychainMigrationStatus);
|
| - if (GetParam() == MigrationStatus::MIGRATED ||
|
| - GetParam() == MigrationStatus::FAILED_TWICE) {
|
| - EXPECT_EQ(static_cast<int>(GetParam()), status);
|
| - } else if (lock_keychain) {
|
| - EXPECT_EQ(static_cast<int>(GetParam() == MigrationStatus::NOT_STARTED
|
| - ? MigrationStatus::FAILED_ONCE
|
| - : MigrationStatus::FAILED_TWICE),
|
| - status);
|
| - } else {
|
| - EXPECT_EQ(static_cast<int>(MigrationStatus::MIGRATED), status);
|
| - }
|
| + EXPECT_EQ(static_cast<int>(GetTargetStatus(lock_keychain)), status);
|
| histogram_tester_.ExpectUniqueSample(
|
| "PasswordManager.KeychainMigration.Status", status, 1);
|
| + static_cast<crypto::MockAppleKeychain*>(store()->keychain())
|
| + ->set_locked(false);
|
| + if (GetTargetStatus(lock_keychain) == MigrationStatus::MIGRATED_DELETED &&
|
| + GetParam() != MigrationStatus::MIGRATED_DELETED && !lock_keychain) {
|
| + EXPECT_THAT(adapter.GetAllPasswordFormPasswords(), IsEmpty());
|
| + } else {
|
| + auto forms = adapter.GetAllPasswordFormPasswords();
|
| + ASSERT_EQ(1u, forms.size());
|
| + form.date_created = forms[0]->date_created;
|
| + EXPECT_THAT(adapter.GetAllPasswordFormPasswords(),
|
| + ElementsAre(Pointee(form)));
|
| + }
|
| }
|
|
|
| TEST_P(PasswordStoreProxyMacMigrationTest, TestSuccessfullMigration) {
|
| @@ -506,6 +523,8 @@ INSTANTIATE_TEST_CASE_P(,
|
| testing::Values(MigrationStatus::NOT_STARTED,
|
| MigrationStatus::MIGRATED,
|
| MigrationStatus::FAILED_ONCE,
|
| - MigrationStatus::FAILED_TWICE));
|
| + MigrationStatus::FAILED_TWICE,
|
| + MigrationStatus::MIGRATED_DELETED,
|
| + MigrationStatus::MIGRATED_PARTIALLY));
|
|
|
| } // namespace
|
|
|