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..1d8a8998bb8e1f71fb3bad5aab849eaa745481d5 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,13 @@ |
#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::_; |
namespace password_manager { |
@@ -75,6 +79,22 @@ 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; |
+} |
+ |
} // anonymous namespace |
class PasswordStoreDefaultTest : public testing::Test { |
@@ -83,12 +103,25 @@ class PasswordStoreDefaultTest : public testing::Test { |
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
} |
- void TearDown() override { ASSERT_TRUE(temp_dir_.Delete()); } |
+ void TearDown() override { |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ ASSERT_TRUE(temp_dir_.Delete()); |
+ } |
base::FilePath test_login_db_file_path() const { |
return temp_dir_.path().Append(FILE_PATH_LITERAL("login_test")); |
} |
+ scoped_refptr<PasswordStoreDefault> CreateInitializedStore() { |
+ scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault( |
+ base::ThreadTaskRunnerHandle::Get(), |
+ base::ThreadTaskRunnerHandle::Get(), |
+ make_scoped_ptr(new LoginDatabase(test_login_db_file_path())))); |
+ store->Init(syncer::SyncableService::StartSyncFlare()); |
+ |
+ return store; |
+ } |
+ |
base::MessageLoopForUI message_loop_; |
base::ScopedTempDir temp_dir_; |
}; |
@@ -138,7 +171,6 @@ TEST_F(PasswordStoreDefaultTest, NonASCIIData) { |
base::MessageLoop::current()->RunUntilIdle(); |
store->Shutdown(); |
- base::MessageLoop::current()->RunUntilIdle(); |
} |
TEST_F(PasswordStoreDefaultTest, Notifications) { |
@@ -191,7 +223,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 +287,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 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->Shutdown(); |
+} |
+ |
+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->Shutdown(); |
+} |
+ |
+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->Shutdown(); |
} |
} // namespace password_manager |