| Index: components/password_manager/core/browser/password_store_default_unittest.cc
|
| diff --git a/components/password_manager/core/browser/password_store_default_unittest.cc b/components/password_manager/core/browser/password_store_default_unittest.cc
|
| index b9e9c5811b6fae0d30e142fade0b195aa514eb75..b08287d4a70583ade053f74b3b6603c9ac8216e8 100644
|
| --- a/components/password_manager/core/browser/password_store_default_unittest.cc
|
| +++ b/components/password_manager/core/browser/password_store_default_unittest.cc
|
| @@ -18,6 +18,7 @@
|
| #include "components/password_manager/core/browser/password_store_change.h"
|
| #include "components/password_manager/core/browser/password_store_consumer.h"
|
| #include "components/password_manager/core/browser/password_store_default.h"
|
| +#include "components/password_manager/core/browser/password_store_origin_unittest.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "url/origin.h"
|
| @@ -43,11 +44,6 @@ class MockPasswordStoreConsumer : public PasswordStoreConsumer {
|
| }
|
| };
|
|
|
| -class MockPasswordStoreObserver : public PasswordStore::Observer {
|
| - public:
|
| - MOCK_METHOD1(OnLoginsChanged, void(const PasswordStoreChangeList& changes));
|
| -};
|
| -
|
| // A mock LoginDatabase that simulates a failing Init() method.
|
| class BadLoginDatabase : public LoginDatabase {
|
| public:
|
| @@ -79,24 +75,74 @@ PasswordFormData CreateTestPasswordFormData() {
|
| return data;
|
| }
|
|
|
| -PasswordFormData CreateTestPasswordFormDataByOrigin(const char* origin_url) {
|
| - PasswordFormData data = {PasswordForm::SCHEME_HTML,
|
| - origin_url,
|
| - origin_url,
|
| - origin_url,
|
| - L"submit_element",
|
| - L"username_element",
|
| - L"password_element",
|
| - L"username_value",
|
| - L"password_value",
|
| - true,
|
| - false,
|
| - base::Time::Now().ToDoubleT()};
|
| - return data;
|
| +class PasswordStoreDefaultTestDelegate {
|
| + public:
|
| + PasswordStoreDefaultTestDelegate();
|
| + ~PasswordStoreDefaultTestDelegate();
|
| +
|
| + void Initialize(const base::FilePath& temp_dir);
|
| + void InitializeWithDatabase(scoped_ptr<LoginDatabase> database);
|
| +
|
| + void ClosePasswordStore();
|
| +
|
| + PasswordStoreDefault* store() { return store_.get(); }
|
| +
|
| + private:
|
| + scoped_refptr<PasswordStoreDefault> CreateInitializedStore(
|
| + scoped_ptr<LoginDatabase> database);
|
| +
|
| + scoped_refptr<PasswordStoreDefault> store_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PasswordStoreDefaultTestDelegate);
|
| +};
|
| +
|
| +PasswordStoreDefaultTestDelegate::PasswordStoreDefaultTestDelegate(){};
|
| +
|
| +PasswordStoreDefaultTestDelegate::~PasswordStoreDefaultTestDelegate(){};
|
| +
|
| +void PasswordStoreDefaultTestDelegate::Initialize(
|
| + const base::FilePath& temp_dir) {
|
| + InitializeWithDatabase(make_scoped_ptr(new LoginDatabase(temp_dir)));
|
| +};
|
| +
|
| +void PasswordStoreDefaultTestDelegate::InitializeWithDatabase(
|
| + scoped_ptr<LoginDatabase> database) {
|
| + store_ = CreateInitializedStore(database.Pass());
|
| +};
|
| +
|
| +void PasswordStoreDefaultTestDelegate::ClosePasswordStore() {
|
| + VLOG(0) << "ClosePasswordStore: shutting down UI thread for password store "
|
| + "closure.";
|
| + store_->ShutdownOnUIThread();
|
| + VLOG(0) << "ClosePasswordStore: draining message loop for password store "
|
| + "closure.";
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| + store_ = nullptr;
|
| +}
|
| +
|
| +scoped_refptr<PasswordStoreDefault>
|
| +PasswordStoreDefaultTestDelegate::CreateInitializedStore(
|
| + scoped_ptr<LoginDatabase> database) {
|
| + VLOG(0)
|
| + << "PasswordStoreDefaultTestDelegate::CreateInitializedStore: Starting.";
|
| + scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault(
|
| + base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(),
|
| + database.Pass()));
|
| + store->Init(syncer::SyncableService::StartSyncFlare());
|
| +
|
| + return store;
|
| }
|
|
|
| } // anonymous namespace
|
|
|
| +INSTANTIATE_TYPED_TEST_CASE_P(Default,
|
| + PasswordStoreOriginTest,
|
| + PasswordStoreDefaultTestDelegate);
|
| +
|
| +ACTION(STLDeleteElements0) {
|
| + STLDeleteContainerPointers(arg0.begin(), arg0.end());
|
| +}
|
| +
|
| class PasswordStoreDefaultTest : public testing::Test {
|
| protected:
|
| void SetUp() override {
|
| @@ -104,7 +150,7 @@ class PasswordStoreDefaultTest : public testing::Test {
|
| }
|
|
|
| void TearDown() override {
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| + delegate.ClosePasswordStore();
|
| ASSERT_TRUE(temp_dir_.Delete());
|
| }
|
|
|
| @@ -112,31 +158,14 @@ class PasswordStoreDefaultTest : public testing::Test {
|
| return temp_dir_.path().Append(FILE_PATH_LITERAL("login_test"));
|
| }
|
|
|
| - scoped_refptr<PasswordStoreDefault> CreateInitializedStore() {
|
| - return CreateInitializedStore(
|
| - make_scoped_ptr(new LoginDatabase(test_login_db_file_path())));
|
| - }
|
| -
|
| - scoped_refptr<PasswordStoreDefault> CreateInitializedStore(
|
| - scoped_ptr<LoginDatabase> database) {
|
| - scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault(
|
| - base::ThreadTaskRunnerHandle::Get(),
|
| - base::ThreadTaskRunnerHandle::Get(), database.Pass()));
|
| - store->Init(syncer::SyncableService::StartSyncFlare());
|
| -
|
| - return store;
|
| - }
|
| -
|
| base::MessageLoopForUI message_loop_;
|
| base::ScopedTempDir temp_dir_;
|
| + PasswordStoreDefaultTestDelegate delegate;
|
| };
|
|
|
| -ACTION(STLDeleteElements0) {
|
| - STLDeleteContainerPointers(arg0.begin(), arg0.end());
|
| -}
|
| -
|
| TEST_F(PasswordStoreDefaultTest, NonASCIIData) {
|
| - scoped_refptr<PasswordStoreDefault> store = CreateInitializedStore();
|
| + delegate.Initialize(test_login_db_file_path());
|
| + PasswordStoreDefault* store = delegate.store();
|
|
|
| // Some non-ASCII password form data.
|
| static const PasswordFormData form_data[] = {
|
| @@ -171,12 +200,11 @@ TEST_F(PasswordStoreDefaultTest, NonASCIIData) {
|
| store->GetAutofillableLogins(&consumer);
|
|
|
| base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - store->ShutdownOnUIThread();
|
| }
|
|
|
| TEST_F(PasswordStoreDefaultTest, Notifications) {
|
| - scoped_refptr<PasswordStoreDefault> store = CreateInitializedStore();
|
| + delegate.Initialize(test_login_db_file_path());
|
| + PasswordStoreDefault* store = delegate.store();
|
|
|
| scoped_ptr<PasswordForm> form =
|
| CreatePasswordFormFromDataForTesting(CreateTestPasswordFormData());
|
| @@ -221,16 +249,14 @@ TEST_F(PasswordStoreDefaultTest, Notifications) {
|
| base::MessageLoop::current()->RunUntilIdle();
|
|
|
| store->RemoveObserver(&observer);
|
| - store->ShutdownOnUIThread();
|
| }
|
|
|
| // 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.
|
| TEST_F(PasswordStoreDefaultTest, OperationsOnABadDatabaseSilentlyFail) {
|
| - scoped_refptr<PasswordStoreDefault> bad_store =
|
| - CreateInitializedStore(make_scoped_ptr(new BadLoginDatabase));
|
| -
|
| + delegate.InitializeWithDatabase(make_scoped_ptr(new BadLoginDatabase));
|
| + PasswordStoreDefault* bad_store = delegate.store();
|
| base::MessageLoop::current()->RunUntilIdle();
|
| ASSERT_EQ(nullptr, bad_store->login_db());
|
|
|
| @@ -285,85 +311,6 @@ TEST_F(PasswordStoreDefaultTest, OperationsOnABadDatabaseSilentlyFail) {
|
|
|
| // Ensure no notifications and no explosions during shutdown either.
|
| bad_store->RemoveObserver(&mock_observer);
|
| - bad_store->ShutdownOnUIThread();
|
| -}
|
| -
|
| -TEST_F(PasswordStoreDefaultTest,
|
| - RemoveLoginsByOriginAndTimeImpl_FittingOriginAndTime) {
|
| - scoped_refptr<PasswordStoreDefault> store = CreateInitializedStore();
|
| -
|
| - const char origin_url[] = "http://foo.example.com";
|
| - scoped_ptr<autofill::PasswordForm> form =
|
| - CreatePasswordFormFromDataForTesting(
|
| - CreateTestPasswordFormDataByOrigin(origin_url));
|
| - store->AddLogin(*form);
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - MockPasswordStoreObserver observer;
|
| - store->AddObserver(&observer);
|
| - EXPECT_CALL(observer, OnLoginsChanged(ElementsAre(PasswordStoreChange(
|
| - PasswordStoreChange::REMOVE, *form))));
|
| -
|
| - const url::Origin origin((GURL(origin_url)));
|
| - base::RunLoop run_loop;
|
| - store->RemoveLoginsByOriginAndTime(origin, base::Time(), base::Time::Max(),
|
| - run_loop.QuitClosure());
|
| - run_loop.Run();
|
| -
|
| - store->RemoveObserver(&observer);
|
| - store->ShutdownOnUIThread();
|
| -}
|
| -
|
| -TEST_F(PasswordStoreDefaultTest,
|
| - RemoveLoginsByOriginAndTimeImpl_NonMatchingOrigin) {
|
| - scoped_refptr<PasswordStoreDefault> store = CreateInitializedStore();
|
| -
|
| - const char origin_url[] = "http://foo.example.com";
|
| - scoped_ptr<autofill::PasswordForm> form =
|
| - CreatePasswordFormFromDataForTesting(
|
| - CreateTestPasswordFormDataByOrigin(origin_url));
|
| - store->AddLogin(*form);
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - MockPasswordStoreObserver observer;
|
| - store->AddObserver(&observer);
|
| - EXPECT_CALL(observer, OnLoginsChanged(_)).Times(0);
|
| -
|
| - const url::Origin other_origin(GURL("http://bar.example.com"));
|
| - base::RunLoop run_loop;
|
| - store->RemoveLoginsByOriginAndTime(other_origin, base::Time(),
|
| - base::Time::Max(), run_loop.QuitClosure());
|
| - run_loop.Run();
|
| -
|
| - store->RemoveObserver(&observer);
|
| - store->ShutdownOnUIThread();
|
| -}
|
| -
|
| -TEST_F(PasswordStoreDefaultTest,
|
| - RemoveLoginsByOriginAndTimeImpl_NotWithinTimeInterval) {
|
| - scoped_refptr<PasswordStoreDefault> store = CreateInitializedStore();
|
| -
|
| - const char origin_url[] = "http://foo.example.com";
|
| - scoped_ptr<autofill::PasswordForm> form =
|
| - CreatePasswordFormFromDataForTesting(
|
| - CreateTestPasswordFormDataByOrigin(origin_url));
|
| - store->AddLogin(*form);
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - MockPasswordStoreObserver observer;
|
| - store->AddObserver(&observer);
|
| - EXPECT_CALL(observer, OnLoginsChanged(_)).Times(0);
|
| -
|
| - const url::Origin origin((GURL(origin_url)));
|
| - base::Time time_after_creation_date =
|
| - form->date_created + base::TimeDelta::FromDays(1);
|
| - base::RunLoop run_loop;
|
| - store->RemoveLoginsByOriginAndTime(origin, time_after_creation_date,
|
| - base::Time::Max(), run_loop.QuitClosure());
|
| - run_loop.Run();
|
| -
|
| - store->RemoveObserver(&observer);
|
| - store->ShutdownOnUIThread();
|
| }
|
|
|
| } // namespace password_manager
|
|
|