| Index: chrome/browser/password_manager/password_store_x_unittest.cc
|
| diff --git a/chrome/browser/password_manager/password_store_x_unittest.cc b/chrome/browser/password_manager/password_store_x_unittest.cc
|
| index ed6e8fe13267ac928c7d10f11db20c81ff25600f..a8d718df0a65a2ff87ef8a58577fdfcbae6fc7ce 100644
|
| --- a/chrome/browser/password_manager/password_store_x_unittest.cc
|
| +++ b/chrome/browser/password_manager/password_store_x_unittest.cc
|
| @@ -9,11 +9,11 @@
|
| #include "base/files/scoped_temp_dir.h"
|
| #include "base/platform_file.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/stringprintf.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| #include "base/time/time.h"
|
| #include "chrome/browser/chrome_notification_types.h"
|
| #include "chrome/browser/password_manager/password_form_data.h"
|
| @@ -23,15 +23,15 @@
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/test/base/testing_browser_process.h"
|
| #include "chrome/test/base/testing_profile.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/notification_details.h"
|
| #include "content/public/browser/notification_registrar.h"
|
| #include "content/public/browser/notification_source.h"
|
| #include "content/public/test/mock_notification_observer.h"
|
| -#include "content/public/test/test_browser_thread.h"
|
| +#include "content/public/test/test_browser_thread_bundle.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| -using base::WaitableEvent;
|
| using content::BrowserThread;
|
| using testing::_;
|
| using testing::DoAll;
|
| @@ -56,44 +56,25 @@ class MockPasswordStoreConsumer : public PasswordStoreConsumer {
|
|
|
| // This class will add and remove a mock notification observer from
|
| // the DB thread.
|
| -class DBThreadObserverHelper
|
| - : public base::RefCountedThreadSafe<DBThreadObserverHelper,
|
| - BrowserThread::DeleteOnDBThread> {
|
| +class DBThreadObserverHelper {
|
| public:
|
| - DBThreadObserverHelper() : done_event_(true, false) {}
|
| + DBThreadObserverHelper() {}
|
|
|
| - void Init(PasswordStore* password_store) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - BrowserThread::PostTask(
|
| - BrowserThread::DB,
|
| - FROM_HERE,
|
| - base::Bind(&DBThreadObserverHelper::AddObserverTask,
|
| - this, make_scoped_refptr(password_store)));
|
| - done_event_.Wait();
|
| - }
|
| -
|
| - content::MockNotificationObserver& observer() {
|
| - return observer_;
|
| - }
|
| -
|
| - protected:
|
| - friend struct BrowserThread::DeleteOnThread<BrowserThread::DB>;
|
| - friend class base::DeleteHelper<DBThreadObserverHelper>;
|
| -
|
| - virtual ~DBThreadObserverHelper() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| + ~DBThreadObserverHelper() {
|
| registrar_.RemoveAll();
|
| }
|
|
|
| - void AddObserverTask(PasswordStore* password_store) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| + void Init(PasswordStore* password_store) {
|
| registrar_.Add(&observer_,
|
| chrome::NOTIFICATION_LOGINS_CHANGED,
|
| content::Source<PasswordStore>(password_store));
|
| - done_event_.Signal();
|
| }
|
|
|
| - WaitableEvent done_event_;
|
| + content::MockNotificationObserver& observer() {
|
| + return observer_;
|
| + }
|
| +
|
| + private:
|
| content::NotificationRegistrar registrar_;
|
| content::MockNotificationObserver observer_;
|
| };
|
| @@ -269,13 +250,7 @@ enum BackendType {
|
|
|
| class PasswordStoreXTest : public testing::TestWithParam<BackendType> {
|
| protected:
|
| - PasswordStoreXTest()
|
| - : ui_thread_(BrowserThread::UI, &message_loop_),
|
| - db_thread_(BrowserThread::DB) {
|
| - }
|
| -
|
| virtual void SetUp() {
|
| - ASSERT_TRUE(db_thread_.Start());
|
| ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
|
|
| profile_.reset(new TestingProfile());
|
| @@ -285,10 +260,7 @@ class PasswordStoreXTest : public testing::TestWithParam<BackendType> {
|
| }
|
|
|
| virtual void TearDown() {
|
| - base::MessageLoop::current()->PostTask(FROM_HERE,
|
| - base::MessageLoop::QuitClosure());
|
| - base::MessageLoop::current()->Run();
|
| - db_thread_.Stop();
|
| + base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| PasswordStoreX::NativeBackend* GetBackend() {
|
| @@ -302,10 +274,7 @@ class PasswordStoreXTest : public testing::TestWithParam<BackendType> {
|
| }
|
| }
|
|
|
| - base::MessageLoopForUI message_loop_;
|
| - content::TestBrowserThread ui_thread_;
|
| - // PasswordStore, WDS schedule work on this thread.
|
| - content::TestBrowserThread db_thread_;
|
| + content::TestBrowserThreadBundle thread_bundle_;
|
|
|
| scoped_ptr<LoginDatabase> login_db_;
|
| scoped_ptr<TestingProfile> profile_;
|
| @@ -316,11 +285,6 @@ ACTION(STLDeleteElements0) {
|
| STLDeleteContainerPointers(arg0.begin(), arg0.end());
|
| }
|
|
|
| -ACTION(QuitUIMessageLoop) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - base::MessageLoop::current()->Quit();
|
| -}
|
| -
|
| TEST_P(PasswordStoreXTest, Notifications) {
|
| scoped_refptr<PasswordStoreX> store(
|
| new PasswordStoreX(login_db_.release(),
|
| @@ -341,15 +305,15 @@ TEST_P(PasswordStoreXTest, Notifications) {
|
| true, false, 1 };
|
| scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
|
|
|
| - scoped_refptr<DBThreadObserverHelper> helper = new DBThreadObserverHelper;
|
| - helper->Init(store.get());
|
| + DBThreadObserverHelper helper;
|
| + helper.Init(store.get());
|
|
|
| const PasswordStoreChange expected_add_changes[] = {
|
| PasswordStoreChange(PasswordStoreChange::ADD, *form),
|
| };
|
|
|
| EXPECT_CALL(
|
| - helper->observer(),
|
| + helper.observer(),
|
| Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED),
|
| content::Source<PasswordStore>(store.get()),
|
| Property(&content::Details<const PasswordStoreChangeList>::ptr,
|
| @@ -358,12 +322,9 @@ TEST_P(PasswordStoreXTest, Notifications) {
|
| // Adding a login should trigger a notification.
|
| store->AddLogin(*form);
|
|
|
| - // The PasswordStore schedules tasks to run on the DB thread so we schedule
|
| - // yet another task to notify us that it's safe to carry on with the test.
|
| - WaitableEvent done(false, false);
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
|
| - done.Wait();
|
| + // The PasswordStore schedules tasks to run on the DB thread. Wait for them
|
| + // to complete.
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| // Change the password.
|
| form->password_value = WideToUTF16(L"a different password");
|
| @@ -373,7 +334,7 @@ TEST_P(PasswordStoreXTest, Notifications) {
|
| };
|
|
|
| EXPECT_CALL(
|
| - helper->observer(),
|
| + helper.observer(),
|
| Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED),
|
| content::Source<PasswordStore>(store.get()),
|
| Property(&content::Details<const PasswordStoreChangeList>::ptr,
|
| @@ -382,17 +343,15 @@ TEST_P(PasswordStoreXTest, Notifications) {
|
| // Updating the login with the new password should trigger a notification.
|
| store->UpdateLogin(*form);
|
|
|
| - // Wait for PasswordStore to send the notification.
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
|
| - done.Wait();
|
| + // Wait for PasswordStore to send execute.
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| const PasswordStoreChange expected_delete_changes[] = {
|
| PasswordStoreChange(PasswordStoreChange::REMOVE, *form),
|
| };
|
|
|
| EXPECT_CALL(
|
| - helper->observer(),
|
| + helper.observer(),
|
| Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED),
|
| content::Source<PasswordStore>(store.get()),
|
| Property(&content::Details<const PasswordStoreChangeList>::ptr,
|
| @@ -401,10 +360,8 @@ TEST_P(PasswordStoreXTest, Notifications) {
|
| // Deleting the login should trigger a notification.
|
| store->RemoveLogin(*form);
|
|
|
| - // Wait for PasswordStore to send the notification.
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
|
| - done.Wait();
|
| + // Wait for PasswordStore to execute.
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| // Public in PasswordStore, protected in PasswordStoreX.
|
| static_cast<PasswordStore*>(store.get())->ShutdownOnUIThread();
|
| @@ -428,26 +385,13 @@ TEST_P(PasswordStoreXTest, NativeMigration) {
|
| // Populate the login DB with logins that should be migrated.
|
| for (VectorOfForms::iterator it = expected_autofillable.begin();
|
| it != expected_autofillable.end(); ++it) {
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(
|
| - base::IgnoreResult(&LoginDatabase::AddLogin),
|
| - base::Unretained(login_db), **it));
|
| + login_db->AddLogin(**it);
|
| }
|
| for (VectorOfForms::iterator it = expected_blacklisted.begin();
|
| it != expected_blacklisted.end(); ++it) {
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(
|
| - base::IgnoreResult(&LoginDatabase::AddLogin),
|
| - base::Unretained(login_db), **it));
|
| + login_db->AddLogin(**it);
|
| }
|
|
|
| - // Schedule another task on the DB thread to notify us that it's safe to
|
| - // carry on with the test.
|
| - WaitableEvent done(false, false);
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
|
| - done.Wait();
|
| -
|
| // Get the new size of the login DB file. We expect it to be larger.
|
| base::PlatformFileInfo db_file_full_info;
|
| ASSERT_TRUE(file_util::GetFileInfo(login_db_file, &db_file_full_info));
|
| @@ -462,27 +406,23 @@ TEST_P(PasswordStoreXTest, NativeMigration) {
|
|
|
| MockPasswordStoreConsumer consumer;
|
|
|
| - // Make sure we quit the MessageLoop even if the test fails.
|
| - ON_CALL(consumer, OnPasswordStoreRequestDone(_, _))
|
| - .WillByDefault(QuitUIMessageLoop());
|
| -
|
| // The autofillable forms should have been migrated to the native backend.
|
| EXPECT_CALL(consumer,
|
| OnPasswordStoreRequestDone(_,
|
| ContainsAllPasswordForms(expected_autofillable)))
|
| - .WillOnce(DoAll(WithArg<1>(STLDeleteElements0()), QuitUIMessageLoop()));
|
| + .WillOnce(WithArg<1>(STLDeleteElements0()));
|
|
|
| store->GetAutofillableLogins(&consumer);
|
| - base::MessageLoop::current()->Run();
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| // The blacklisted forms should have been migrated to the native backend.
|
| EXPECT_CALL(consumer,
|
| OnPasswordStoreRequestDone(_,
|
| ContainsAllPasswordForms(expected_blacklisted)))
|
| - .WillOnce(DoAll(WithArg<1>(STLDeleteElements0()), QuitUIMessageLoop()));
|
| + .WillOnce(WithArg<1>(STLDeleteElements0()));
|
|
|
| store->GetBlacklistLogins(&consumer);
|
| - base::MessageLoop::current()->Run();
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| VectorOfForms empty;
|
| MockLoginDatabaseReturn ld_return;
|
| @@ -499,14 +439,10 @@ TEST_P(PasswordStoreXTest, NativeMigration) {
|
| .WillOnce(WithArg<0>(STLDeleteElements0()));
|
| }
|
|
|
| - BrowserThread::PostTask(
|
| - BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&LoginDatabaseQueryCallback, login_db, true, &ld_return));
|
| + LoginDatabaseQueryCallback(login_db, true, &ld_return);
|
|
|
| - // Wait for the login DB methods to execute on the DB thread.
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
|
| - done.Wait();
|
| + // Wait for the login DB methods to execute.
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| if (GetParam() == WORKING_BACKEND) {
|
| // Likewise, no blacklisted logins should be left in the login DB.
|
| @@ -520,14 +456,10 @@ TEST_P(PasswordStoreXTest, NativeMigration) {
|
| .WillOnce(WithArg<0>(STLDeleteElements0()));
|
| }
|
|
|
| - BrowserThread::PostTask(
|
| - BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&LoginDatabaseQueryCallback, login_db, false, &ld_return));
|
| + LoginDatabaseQueryCallback(login_db, false, &ld_return);
|
|
|
| - // Wait for the login DB methods to execute on the DB thread.
|
| - BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| - base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
|
| - done.Wait();
|
| + // Wait for the login DB methods to execute.
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| if (GetParam() == WORKING_BACKEND) {
|
| // If the migration succeeded, then not only should there be no logins left
|
|
|