password_store_win_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <wincrypt.h>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_form_data.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_consumer.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_win.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/webdata/logins_table.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database_service.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/encryptor/ie7_password.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::WaitableEvent;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::WithArg;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PasswordForm;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockPasswordStoreConsumer : public PasswordStoreConsumer {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnPasswordStoreRequestDone,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(CancelableRequestProvider::Handle,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::vector<content::PasswordForm*>&));
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(OnGetPasswordStoreResults,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               void(const std::vector<content::PasswordForm*>&));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebDataServiceConsumer : public WebDataServiceConsumer {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnWebDataServiceRequestDone,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(WebDataService::Handle, const WDTypedResult*));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<PasswordForm*> VectorOfForms;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreWinTest : public testing::Test {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordStoreWinTest()
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateIE7PasswordInfo(const std::wstring& url, const base::Time& created,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             IE7PasswordInfo* info) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Copied from chrome/browser/importer/importer_unittest.cc
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The username is "abcdefgh" and the password "abcdefghijkl".
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char data[] = "\x0c\x00\x00\x00\x38\x00\x00\x00\x2c\x00\x00\x00"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x57\x49\x43\x4b\x18\x00\x00\x00\x02\x00\x00\x00"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x67\x00\x72\x00\x01\x00\x00\x00\x00\x00\x00\x00"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x00\x00\x00\x00\x4e\xfa\x67\x76\x22\x94\xc8\x01"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x08\x00\x00\x00\x12\x00\x00\x00\x4e\xfa\x67\x76"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x22\x94\xc8\x01\x0c\x00\x00\x00\x61\x00\x62\x00"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x00\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x6c\x00\x00\x00";
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DATA_BLOB input = {0};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DATA_BLOB url_key = {0};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DATA_BLOB output = {0};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input.pbData = data;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input.cbData = sizeof(data);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_key.pbData = reinterpret_cast<unsigned char*>(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const_cast<wchar_t*>(url.data()));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_key.cbData = static_cast<DWORD>((url.size() + 1) *
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        sizeof(std::wstring::value_type));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!CryptProtectData(&input, NULL, &url_key, NULL, NULL,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          CRYPTPROTECT_UI_FORBIDDEN, &output))
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<unsigned char> encrypted_data;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encrypted_data.resize(output.cbData);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&encrypted_data.front(), output.pbData, output.cbData);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocalFree(output.pbData);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->url_hash = ie7_password::GetUrlHash(url);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->encrypted_data = encrypted_data;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->date_created = created;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(db_thread_.Start());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new TestingProfile());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    login_db_.reset(new LoginDatabase());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(login_db_->Init(temp_dir_.path().Append(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FILE_PATH_LITERAL("login_test"))));
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path = temp_dir_.path().AppendASCII("web_data_test");
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wdbs_ = new WebDatabaseService(path);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Need to add at least one table so the database gets created.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wdbs_->AddTable(scoped_ptr<WebDatabaseTable>(new LoginsTable()));
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    wdbs_->LoadDatabase();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wds_ = new WebDataService(wdbs_,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              WebDataServiceBase::ProfileErrorCallback());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wds_->Init();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (store_.get())
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      store_->ShutdownOnUIThread();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wds_->ShutdownOnUIThread();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wdbs_->ShutdownDatabase();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wds_ = NULL;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wdbs_ = NULL;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WaitableEvent done(false, false);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&base::WaitableEvent::Signal, base::Unretained(&done)));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    done.Wait();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoop::current()->Run();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_thread_.Stop();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoopForUI message_loop_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PasswordStore, WDS schedule work on this thread.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LoginDatabase> login_db_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<WebDataService> wds_;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<WebDatabaseService> wdbs_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PasswordStore> store_;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(STLDeleteElements0) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteContainerPointers(arg0.begin(), arg0.end());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(QuitUIMessageLoop) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Quit();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(EmptyWDResult, "") {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<const WDResult<std::vector<PasswordForm*> >*>(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg)->GetValue().empty();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hangs flakily, http://crbug.com/71385.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, DISABLED_ConvertIE7Login) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IE7PasswordInfo password_info;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateIE7PasswordInfo(L"http://example.com/origin",
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    base::Time::FromDoubleT(1),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &password_info));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the URL hash
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(L"39471418FF5453FEEB3731E382DEB5D53E14FAF9B5",
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            password_info.url_hash);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This IE7 password will be retrieved by the GetLogins call.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wds_->AddIE7Login(password_info);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The WDS schedules tasks to run on the DB thread so we schedule yet another
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // task to notify us that it's safe to carry on with the test.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent done(false, false);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done.Wait();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_ = new PasswordStoreWin(login_db_.release(), profile_.get(),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                wds_.get());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(store_->Init());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(consumer, OnGetPasswordStoreResults(_))
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData form_data = {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData expected_form_data = {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"abcdefgh",
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"abcdefghijkl",
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> forms;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(CreatePasswordFormFromData(expected_form_data));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The IE7 password should be returned.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(consumer,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnGetPasswordStoreResults(ContainsAllPasswordForms(forms)))
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(QuitUIMessageLoop());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->GetLogins(*form, &consumer);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&forms);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Crashy.  http://crbug.com/86558
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, DISABLED_OutstandingWDSQueries) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_ = new PasswordStoreWin(login_db_.release(), profile_.get(),
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                wds_.get());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(store_->Init());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData form_data = {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->GetLogins(*form, &consumer);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release the PSW and the WDS before the query can return.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->ShutdownOnUIThread();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_ = NULL;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wds_ = NULL;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hangs flakily, see http://crbug.com/43836.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, DISABLED_MultipleWDSQueriesOnDifferentThreads) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IE7PasswordInfo password_info;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateIE7PasswordInfo(L"http://example.com/origin",
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    base::Time::FromDoubleT(1),
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &password_info));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wds_->AddIE7Login(password_info);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The WDS schedules tasks to run on the DB thread so we schedule yet another
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // task to notify us that it's safe to carry on with the test.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent done(false, false);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done.Wait();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_ = new PasswordStoreWin(login_db_.release(), profile_.get(),
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                wds_.get());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(store_->Init());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer password_consumer;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(password_consumer, OnGetPasswordStoreResults(_))
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData form_data = {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData expected_form_data = {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"abcdefgh",
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"abcdefghijkl",
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> forms;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(CreatePasswordFormFromData(expected_form_data));
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The IE7 password should be returned.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(password_consumer,
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnGetPasswordStoreResults(ContainsAllPasswordForms(forms)))
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(QuitUIMessageLoop());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->GetLogins(*form, &password_consumer);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWebDataServiceConsumer wds_consumer;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(wds_consumer,
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnWebDataServiceRequestDone(_, _))
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(QuitUIMessageLoop());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wds_->GetIE7Login(password_info, &wds_consumer);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the MessageLoop twice: once for the GetIE7Login that PasswordStoreWin
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // schedules on the DB thread and once for the one we just scheduled on the UI
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&forms);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, EmptyLogins) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_ = new PasswordStoreWin(login_db_.release(), profile_.get(),
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                wds_.get());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->Init();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData form_data = {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(consumer, OnGetPasswordStoreResults(_))
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VectorOfForms expect_none;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect that we get no results;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(consumer,
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnGetPasswordStoreResults(ContainsAllPasswordForms(expect_none)))
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(DoAll(WithArg<0>(STLDeleteElements0()), QuitUIMessageLoop()));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->GetLogins(*form, &consumer);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, EmptyBlacklistLogins) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_ = new PasswordStoreWin(login_db_.release(), profile_.get(),
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                wds_.get());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->Init();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ON_CALL(consumer, OnPasswordStoreRequestDone(_, _))
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VectorOfForms expect_none;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect that we get no results;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      consumer,
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnPasswordStoreRequestDone(_, ContainsAllPasswordForms(expect_none)))
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(WithArg<1>(STLDeleteElements0()), QuitUIMessageLoop()));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->GetBlacklistLogins(&consumer);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, EmptyAutofillableLogins) {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_ = new PasswordStoreWin(login_db_.release(), profile_.get(),
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                wds_.get());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->Init();
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ON_CALL(consumer, OnPasswordStoreRequestDone(_, _))
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VectorOfForms expect_none;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect that we get no results;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      consumer,
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnPasswordStoreRequestDone(_, ContainsAllPasswordForms(expect_none)))
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(WithArg<1>(STLDeleteElements0()), QuitUIMessageLoop()));
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->GetAutofillableLogins(&consumer);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
428