Chromium Code Reviews| 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 8cdf4b93b5a8c96f4c0b9f9757d87f3d8aee657e..66db938927f64548d9fb77a63396599f026b1f7c 100644 |
| --- a/components/password_manager/core/browser/password_store_default_unittest.cc |
| +++ b/components/password_manager/core/browser/password_store_default_unittest.cc |
| @@ -8,6 +8,7 @@ |
| #include "base/files/file_util.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "base/prefs/pref_service.h" |
| +#include "base/run_loop.h" |
| #include "base/stl_util.h" |
| #include "base/strings/string_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| @@ -19,10 +20,14 @@ |
| #include "components/password_manager/core/browser/password_store_default.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| +#include "url/origin.h" |
| using autofill::PasswordForm; |
| +using testing::ElementsAre; |
| using testing::ElementsAreArray; |
| using testing::IsEmpty; |
| +using testing::SizeIs; |
|
vasilii
2015/10/12 17:01:29
unused
Timo Reimann
2015/10/12 22:08:06
Thanks, another leftover.
cpplint doesn't seem to
|
| +using testing::_; |
| namespace password_manager { |
| @@ -75,6 +80,23 @@ PasswordFormData CreateTestPasswordFormData() { |
| return data; |
| } |
| +PasswordFormData CreateTestPasswordFormDataByOrigin( |
| + const std::string& origin_url) { |
|
vasilii
2015/10/12 17:01:30
I'm worried about the lifetime of origin_url. You
Timo Reimann
2015/10/12 22:08:06
It didn't crash on me when I passed in a string li
vasilii
2015/10/13 13:48:20
Because your string was alive during the test.
|
| + PasswordFormData data = {PasswordForm::SCHEME_HTML, |
| + origin_url.c_str(), |
| + origin_url.c_str(), |
| + origin_url.c_str(), |
| + L"submit_element", |
| + L"username_element", |
| + L"password_element", |
| + L"username_value", |
| + L"password_value", |
| + true, |
| + false, |
| + base::Time::Now().ToDoubleT()}; |
| + return data; |
| +} |
| + |
| } // anonymous namespace |
| class PasswordStoreDefaultTest : public testing::Test { |
| @@ -89,6 +111,16 @@ class PasswordStoreDefaultTest : public testing::Test { |
| return temp_dir_.path().Append(FILE_PATH_LITERAL("login_test")); |
| } |
| + scoped_refptr<PasswordStoreDefault> CreateInitializedStore() { |
| + LoginDatabase* database = new LoginDatabase(test_login_db_file_path()); |
| + scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault( |
| + base::ThreadTaskRunnerHandle::Get(), |
| + base::ThreadTaskRunnerHandle::Get(), make_scoped_ptr(database))); |
|
vasilii
2015/10/12 17:01:30
Why not creating the database here?
Timo Reimann
2015/10/12 22:08:06
Personally I found it harder to read due to the de
|
| + store->Init(syncer::SyncableService::StartSyncFlare()); |
| + |
| + return store; |
| + } |
| + |
| base::MessageLoopForUI message_loop_; |
| base::ScopedTempDir temp_dir_; |
| }; |
| @@ -138,7 +170,6 @@ TEST_F(PasswordStoreDefaultTest, NonASCIIData) { |
| base::MessageLoop::current()->RunUntilIdle(); |
| store->Shutdown(); |
| - base::MessageLoop::current()->RunUntilIdle(); |
| } |
| TEST_F(PasswordStoreDefaultTest, Notifications) { |
| @@ -191,7 +222,6 @@ TEST_F(PasswordStoreDefaultTest, Notifications) { |
| store->RemoveObserver(&observer); |
| store->Shutdown(); |
| - base::MessageLoop::current()->RunUntilIdle(); |
| } |
| // Verify that operations on a PasswordStore with a bad database cause no |
| @@ -256,7 +286,84 @@ TEST_F(PasswordStoreDefaultTest, OperationsOnABadDatabaseSilentlyFail) { |
| // Ensure no notifications and no explosions during shutdown either. |
| bad_store->RemoveObserver(&mock_observer); |
| bad_store->Shutdown(); |
| +} |
| + |
| +TEST_F(PasswordStoreDefaultTest, |
| + RemoveLoginsByOriginAndTimeImpl_FittingOriginAndTime) { |
| + scoped_refptr<PasswordStoreDefault> store = CreateInitializedStore(); |
| + |
| + const std::string origin_url = "http://foo.example.com"; |
|
vasilii
2015/10/12 17:01:30
const char[]
Timo Reimann
2015/10/12 22:08:06
Done for all origin_url instances across all new t
|
| + 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::Time(), |
| + base::Time::Max(), run_loop.QuitClosure()); |
| + base::MessageLoop::current()->RunUntilIdle(); |
|
vasilii
2015/10/12 17:01:30
Nope. RunLoop::Run should be called here. That's h
Timo Reimann
2015/10/12 22:08:06
Gotcha. Done again for this and all other new test
|
| + |
| + store->RemoveObserver(&observer); |
| + store->Shutdown(); |
| +} |
| + |
| +TEST_F(PasswordStoreDefaultTest, |
| + RemoveLoginsByOriginAndTimeImpl_NonMatchingOrigin) { |
| + scoped_refptr<PasswordStoreDefault> store = CreateInitializedStore(); |
| + |
| + const std::string 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::Time(), |
| + base::Time::Max(), run_loop.QuitClosure()); |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + |
| + store->RemoveObserver(&observer); |
| + store->Shutdown(); |
| +} |
| + |
| +TEST_F(PasswordStoreDefaultTest, |
| + RemoveLoginsByOriginAndTimeImpl_NotWithinTimeInterval) { |
| + scoped_refptr<PasswordStoreDefault> store = CreateInitializedStore(); |
| + |
| + const std::string 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()); |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + |
| + store->RemoveObserver(&observer); |
| + store->Shutdown(); |
| } |
| } // namespace password_manager |