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 6ee8526f14552c8d8c435b83721d609e8cac5803..84047ac93ef567c41b5051a9ec3054166a9a5cea 100644 |
--- a/chrome/browser/password_manager/password_store_proxy_mac_unittest.cc |
+++ b/chrome/browser/password_manager/password_store_proxy_mac_unittest.cc |
@@ -13,8 +13,6 @@ |
#include "base/scoped_observer.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/test/histogram_tester.h" |
-#include "chrome/browser/password_manager/password_store_mac.h" |
-#include "chrome/browser/password_manager/password_store_mac_internal.h" |
#include "chrome/browser/prefs/browser_prefs.h" |
#include "components/os_crypt/os_crypt_mocker.h" |
#include "components/password_manager/core/browser/login_database.h" |
@@ -24,10 +22,8 @@ |
#include "components/sync_preferences/testing_pref_service_syncable.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
-#include "crypto/mock_apple_keychain.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-#include "url/origin.h" |
namespace { |
@@ -42,12 +38,6 @@ using testing::ElementsAre; |
using testing::IsEmpty; |
using testing::Pointee; |
-// Returns a change list corresponding to |form| being added. |
-PasswordStoreChangeList AddChangeForForm(const PasswordForm& form) { |
- return PasswordStoreChangeList( |
- 1, PasswordStoreChange(PasswordStoreChange::ADD, form)); |
-} |
- |
class MockPasswordStoreConsumer |
: public password_manager::PasswordStoreConsumer { |
public: |
@@ -113,9 +103,6 @@ class PasswordStoreProxyMacTest |
PasswordStoreProxyMacTest(); |
~PasswordStoreProxyMacTest() override; |
- void SetUp() override; |
- void TearDown() override; |
- |
void CreateAndInitPasswordStore( |
std::unique_ptr<password_manager::LoginDatabase> login_db); |
@@ -130,14 +117,10 @@ class PasswordStoreProxyMacTest |
void UpdateForm(const PasswordForm& form); |
void RemoveForm(const PasswordForm& form); |
- // Tests RemoveLoginsCreatedBetween or RemoveLoginsSyncedBetween depending on |
- // |check_created|. |
- void CheckRemoveLoginsBetween(bool check_created); |
- |
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; |
+ MigrationStatus GetTargetStatus() const; |
password_manager::LoginDatabase* login_db() const { |
return store_->login_metadata_db(); |
@@ -163,15 +146,7 @@ PasswordStoreProxyMacTest::PasswordStoreProxyMacTest() { |
OSCryptMocker::SetUpWithSingleton(); |
} |
-PasswordStoreProxyMacTest::~PasswordStoreProxyMacTest() {} |
- |
-void PasswordStoreProxyMacTest::SetUp() { |
- std::unique_ptr<password_manager::LoginDatabase> login_db( |
- new password_manager::LoginDatabase(test_login_db_file_path())); |
- CreateAndInitPasswordStore(std::move(login_db)); |
-} |
- |
-void PasswordStoreProxyMacTest::TearDown() { |
+PasswordStoreProxyMacTest::~PasswordStoreProxyMacTest() { |
ClosePasswordStore(); |
OSCryptMocker::TearDown(); |
} |
@@ -180,8 +155,7 @@ void PasswordStoreProxyMacTest::CreateAndInitPasswordStore( |
std::unique_ptr<password_manager::LoginDatabase> login_db) { |
store_ = new PasswordStoreProxyMac( |
BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), |
- base::MakeUnique<crypto::MockAppleKeychain>(), std::move(login_db), |
- &testing_prefs_); |
+ std::move(login_db), &testing_prefs_); |
ASSERT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); |
} |
@@ -206,15 +180,12 @@ base::FilePath PasswordStoreProxyMacTest::test_login_db_file_path() const { |
return db_dir_.GetPath().Append(FILE_PATH_LITERAL("login.db")); |
} |
-MigrationStatus PasswordStoreProxyMacTest::GetTargetStatus( |
- bool keychain_locked) const { |
+MigrationStatus PasswordStoreProxyMacTest::GetTargetStatus() const { |
if (GetParam() == MigrationStatus::NOT_STARTED || |
GetParam() == MigrationStatus::FAILED_ONCE || |
GetParam() == MigrationStatus::FAILED_TWICE) { |
return MigrationStatus::MIGRATION_STOPPED; |
} |
- if (GetParam() == MigrationStatus::MIGRATED) |
- return MigrationStatus::MIGRATED_DELETED; |
return GetParam(); |
} |
@@ -251,112 +222,41 @@ void PasswordStoreProxyMacTest::RemoveForm(const PasswordForm& form) { |
FinishAsyncProcessing(); |
} |
-void PasswordStoreProxyMacTest::CheckRemoveLoginsBetween(bool check_created) { |
- PasswordForm old_form; |
- old_form.origin = GURL("http://accounts.google.com/LoginAuth"); |
- old_form.signon_realm = "http://accounts.google.com/"; |
- old_form.username_value = base::ASCIIToUTF16("my_username"); |
- old_form.federation_origin = |
- url::Origin(GURL("http://accounts.google.com/federation")); |
- |
- PasswordForm new_form = old_form; |
- new_form.origin = GURL("http://accounts.google2.com/LoginAuth"); |
- new_form.signon_realm = "http://accounts.google2.com/"; |
- |
- base::Time now = base::Time::Now(); |
- base::Time next_day = now + base::TimeDelta::FromDays(1); |
- if (check_created) { |
- old_form.date_created = now; |
- new_form.date_created = next_day; |
- } else { |
- old_form.date_synced = now; |
- new_form.date_synced = next_day; |
- } |
+// ----------- Tests ------------- |
- AddForm(old_form); |
- AddForm(new_form); |
+TEST_P(PasswordStoreProxyMacTest, Sanity) { |
+ base::HistogramTester histogram_tester; |
- MockPasswordStoreObserver mock_observer(store()); |
- password_manager::PasswordStoreChangeList list; |
- list.push_back(password_manager::PasswordStoreChange( |
- password_manager::PasswordStoreChange::REMOVE, old_form)); |
- EXPECT_CALL(mock_observer, OnLoginsChanged(list)); |
- if (check_created) { |
- store()->RemoveLoginsCreatedBetween(base::Time(), next_day, |
- base::Closure()); |
- } else { |
- store()->RemoveLoginsSyncedBetween(base::Time(), next_day); |
- } |
+ CreateAndInitPasswordStore(base::MakeUnique<password_manager::LoginDatabase>( |
+ test_login_db_file_path())); |
FinishAsyncProcessing(); |
-} |
- |
-// ----------- Tests ------------- |
- |
-TEST_P(PasswordStoreProxyMacTest, StartAndStop) { |
- // PasswordStore::ShutdownOnUIThread() immediately follows |
- // PasswordStore::Init(). The message loop isn't running in between. Anyway, |
- // PasswordStore should end up in the right state. |
ClosePasswordStore(); |
int status = testing_prefs_.GetInteger( |
password_manager::prefs::kKeychainMigrationStatus); |
- EXPECT_EQ(static_cast<int>(GetTargetStatus(false)), status); |
-} |
- |
-TEST_P(PasswordStoreProxyMacTest, FormLifeCycle) { |
- PasswordForm password_form; |
- password_form.origin = GURL("http://example.com"); |
- password_form.username_value = base::ASCIIToUTF16("test1@gmail.com"); |
- password_form.password_value = base::ASCIIToUTF16("12345"); |
- password_form.signon_realm = "http://example.com/"; |
- |
- AddForm(password_form); |
- password_form.password_value = base::ASCIIToUTF16("password"); |
- UpdateForm(password_form); |
- RemoveForm(password_form); |
+ EXPECT_EQ(static_cast<int>(GetTargetStatus()), status); |
+ histogram_tester.ExpectUniqueSample( |
+ "PasswordManager.KeychainMigration.Status", status, 1); |
} |
-TEST_P(PasswordStoreProxyMacTest, TestRemoveLoginsCreatedBetween) { |
- CheckRemoveLoginsBetween(true); |
-} |
+TEST_P(PasswordStoreProxyMacTest, StartAndStop) { |
+ base::HistogramTester histogram_tester; |
+ // PasswordStore::ShutdownOnUIThread() immediately follows |
+ // PasswordStore::Init(). The message loop isn't running in between. Anyway, |
+ // PasswordStore should not collapse. |
+ CreateAndInitPasswordStore(base::MakeUnique<password_manager::LoginDatabase>( |
+ test_login_db_file_path())); |
+ ClosePasswordStore(); |
-TEST_P(PasswordStoreProxyMacTest, TestRemoveLoginsSyncedBetween) { |
- CheckRemoveLoginsBetween(false); |
-} |
- |
-TEST_P(PasswordStoreProxyMacTest, FillLogins) { |
- PasswordForm password_form; |
- password_form.origin = GURL("http://example.com"); |
- password_form.signon_realm = "http://example.com/"; |
- password_form.username_value = base::ASCIIToUTF16("test1@gmail.com"); |
- password_form.password_value = base::ASCIIToUTF16("12345"); |
- AddForm(password_form); |
- |
- PasswordForm blacklisted_form; |
- blacklisted_form.origin = GURL("http://example2.com"); |
- blacklisted_form.signon_realm = "http://example2.com/"; |
- blacklisted_form.blacklisted_by_user = true; |
- AddForm(blacklisted_form); |
- |
- MockPasswordStoreConsumer mock_consumer; |
- store()->GetLogins(PasswordStore::FormDigest(password_form), &mock_consumer); |
- mock_consumer.WaitForResult(); |
- EXPECT_THAT(mock_consumer.forms(), ElementsAre(Pointee(password_form))); |
- |
- store()->GetBlacklistLogins(&mock_consumer); |
- mock_consumer.WaitForResult(); |
- EXPECT_THAT(mock_consumer.forms(), ElementsAre(Pointee(blacklisted_form))); |
- |
- store()->GetAutofillableLogins(&mock_consumer); |
- mock_consumer.WaitForResult(); |
- EXPECT_THAT(mock_consumer.forms(), ElementsAre(Pointee(password_form))); |
+ histogram_tester.ExpectUniqueSample( |
+ "PasswordManager.KeychainMigration.Status", |
+ static_cast<int>(GetTargetStatus()), 1); |
} |
TEST_P(PasswordStoreProxyMacTest, OperationsOnABadDatabaseSilentlyFail) { |
// Verify that operations on a PasswordStore with a bad database cause no |
// explosions, but fail without side effect, return no data and trigger no |
// notifications. |
- ClosePasswordStore(); |
CreateAndInitPasswordStore(base::MakeUnique<BadLoginDatabase>()); |
FinishAsyncProcessing(); |
EXPECT_FALSE(login_db()); |
@@ -434,98 +334,4 @@ INSTANTIATE_TEST_CASE_P(, |
MigrationStatus::MIGRATED_PARTIALLY, |
MigrationStatus::MIGRATION_STOPPED)); |
-// Test the migration process. |
-class PasswordStoreProxyMacMigrationTest : public PasswordStoreProxyMacTest { |
- public: |
- void SetUp() override; |
- |
- void TestMigration(bool lock_keychain); |
- |
- protected: |
- std::unique_ptr<password_manager::LoginDatabase> login_db_; |
- std::unique_ptr<crypto::MockAppleKeychain> keychain_; |
- base::HistogramTester histogram_tester_; |
-}; |
- |
-void PasswordStoreProxyMacMigrationTest::SetUp() { |
- login_db_.reset( |
- new password_manager::LoginDatabase(test_login_db_file_path())); |
- keychain_.reset(new crypto::MockAppleKeychain); |
-} |
- |
-void PasswordStoreProxyMacMigrationTest::TestMigration(bool lock_keychain) { |
- PasswordForm form; |
- form.origin = GURL("http://accounts.google.com/LoginAuth"); |
- form.signon_realm = "http://accounts.google.com/"; |
- form.username_value = base::ASCIIToUTF16("my_username"); |
- form.password_value = base::ASCIIToUTF16("12345"); |
- |
- 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)); |
- // Prepare another database instance with the same content which is to be |
- // initialized by PasswordStoreProxyMac. |
- login_db_.reset( |
- new password_manager::LoginDatabase(test_login_db_file_path())); |
- MacKeychainPasswordFormAdapter adapter(keychain_.get()); |
- EXPECT_TRUE(adapter.AddPassword(form)); |
- |
- // Init the store. It may trigger the migration. |
- if (lock_keychain) |
- keychain_->set_locked(true); |
- store_ = new PasswordStoreProxyMac( |
- BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), |
- std::move(keychain_), std::move(login_db_), &testing_prefs_); |
- ASSERT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); |
- FinishAsyncProcessing(); |
- |
- MockPasswordStoreConsumer mock_consumer; |
- store()->GetLogins(PasswordStore::FormDigest(form), &mock_consumer); |
- mock_consumer.WaitForResult(); |
- if (before_migration) |
- EXPECT_THAT(mock_consumer.forms(), IsEmpty()); |
- else |
- EXPECT_THAT(mock_consumer.forms(), ElementsAre(Pointee(form))); |
- |
- int status = testing_prefs_.GetInteger( |
- password_manager::prefs::kKeychainMigrationStatus); |
- 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) { |
- TestMigration(false); |
-} |
- |
-TEST_P(PasswordStoreProxyMacMigrationTest, TestFailedMigration) { |
- TestMigration(true); |
-} |
- |
-INSTANTIATE_TEST_CASE_P(, |
- PasswordStoreProxyMacMigrationTest, |
- testing::Values(MigrationStatus::NOT_STARTED, |
- MigrationStatus::MIGRATED, |
- MigrationStatus::FAILED_ONCE, |
- MigrationStatus::FAILED_TWICE, |
- MigrationStatus::MIGRATED_DELETED, |
- MigrationStatus::MIGRATED_PARTIALLY, |
- MigrationStatus::MIGRATION_STOPPED)); |
- |
} // namespace |