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"
149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/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"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_win.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/os_crypt/ie7_password_win.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_form_data.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_store_consumer.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/password_manager/core/browser/webdata/logins_table.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/password_manager/core/browser/webdata/password_web_data_service_win.h"
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/common/password_manager_pref_names.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database_service.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)
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using autofill::PasswordForm;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::WaitableEvent;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::LoginDatabase;
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::ContainsAllPasswordForms;
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::PasswordFormData;
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::PasswordStore;
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::PasswordStoreConsumer;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::WithArg;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockPasswordStoreConsumer : public PasswordStoreConsumer {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(OnGetPasswordStoreResults,
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)               void(const std::vector<autofill::PasswordForm*>&));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebDataServiceConsumer : public WebDataServiceConsumer {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnWebDataServiceRequestDone,
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               void(PasswordWebDataService::Handle, const WDTypedResult*));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<PasswordForm*> VectorOfForms;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreWinTest : public testing::Test {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordStoreWinTest()
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateIE7PasswordInfo(const std::wstring& url, const base::Time& created,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             IE7PasswordInfo* info) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Copied from chrome/browser/importer/importer_unittest.cc
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The username is "abcdefgh" and the password "abcdefghijkl".
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char data[] = "\x0c\x00\x00\x00\x38\x00\x00\x00\x2c\x00\x00\x00"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x57\x49\x43\x4b\x18\x00\x00\x00\x02\x00\x00\x00"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x67\x00\x72\x00\x01\x00\x00\x00\x00\x00\x00\x00"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x00\x00\x00\x00\x4e\xfa\x67\x76\x22\x94\xc8\x01"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x08\x00\x00\x00\x12\x00\x00\x00\x4e\xfa\x67\x76"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x22\x94\xc8\x01\x0c\x00\x00\x00\x61\x00\x62\x00"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x00\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "\x6c\x00\x00\x00";
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DATA_BLOB input = {0};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DATA_BLOB url_key = {0};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DATA_BLOB output = {0};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input.pbData = data;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input.cbData = sizeof(data);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_key.pbData = reinterpret_cast<unsigned char*>(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const_cast<wchar_t*>(url.data()));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_key.cbData = static_cast<DWORD>((url.size() + 1) *
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        sizeof(std::wstring::value_type));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!CryptProtectData(&input, NULL, &url_key, NULL, NULL,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          CRYPTPROTECT_UI_FORBIDDEN, &output))
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<unsigned char> encrypted_data;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encrypted_data.resize(output.cbData);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&encrypted_data.front(), output.pbData, output.cbData);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LocalFree(output.pbData);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->url_hash = ie7_password::GetUrlHash(url);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->encrypted_data = encrypted_data;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->date_created = created;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(db_thread_.Start());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new TestingProfile());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    login_db_.reset(new LoginDatabase());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(login_db_->Init(temp_dir_.path().Append(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FILE_PATH_LITERAL("login_test"))));
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path = temp_dir_.path().AppendASCII("web_data_test");
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    wdbs_ = new WebDatabaseService(path,
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB));
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Need to add at least one table so the database gets created.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wdbs_->AddTable(scoped_ptr<WebDatabaseTable>(new LoginsTable()));
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    wdbs_->LoadDatabase();
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    wds_ = new PasswordWebDataService(
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        wdbs_,
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        WebDataServiceBase::ProfileErrorCallback());
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wds_->Init();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (store_)
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      store_->Shutdown();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wds_->ShutdownOnUIThread();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wdbs_->ShutdownDatabase();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wds_ = NULL;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wdbs_ = NULL;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WaitableEvent done(false, false);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&base::WaitableEvent::Signal, base::Unretained(&done)));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    done.Wait();
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                           base::MessageLoop::QuitClosure());
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_thread_.Stop();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PasswordStoreWin* CreatePasswordStore() {
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return new PasswordStoreWin(
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::MessageLoopProxy::current(),
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB),
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        login_db_.release(),
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        wds_.get());
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PasswordStore, WDS schedule work on this thread.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<LoginDatabase> login_db_;
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<PasswordWebDataService> wds_;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<WebDatabaseService> wdbs_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PasswordStore> store_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(STLDeleteElements0) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteContainerPointers(arg0.begin(), arg0.end());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(QuitUIMessageLoop) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Quit();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(EmptyWDResult, "") {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<const WDResult<std::vector<PasswordForm*> >*>(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg)->GetValue().empty();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hangs flakily, http://crbug.com/71385.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, DISABLED_ConvertIE7Login) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IE7PasswordInfo password_info;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateIE7PasswordInfo(L"http://example.com/origin",
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    base::Time::FromDoubleT(1),
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &password_info));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the URL hash
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(L"39471418FF5453FEEB3731E382DEB5D53E14FAF9B5",
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            password_info.url_hash);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This IE7 password will be retrieved by the GetLogins call.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wds_->AddIE7Login(password_info);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The WDS schedules tasks to run on the DB thread so we schedule yet another
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // task to notify us that it's safe to carry on with the test.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent done(false, false);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done.Wait();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_ = CreatePasswordStore();
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare(), ""));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(consumer, OnGetPasswordStoreResults(_))
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData 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"",
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The returned form will not have 'action' or '*_element' fields set. This
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // is because credentials imported from IE don't have this information.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData expected_form_data = {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "",
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"",
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"",
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"",
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"abcdefgh",
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"abcdefghijkl",
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> forms;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(CreatePasswordFormFromData(expected_form_data));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The IE7 password should be returned.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(consumer,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnGetPasswordStoreResults(ContainsAllPasswordForms(forms)))
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(QuitUIMessageLoop());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_->GetLogins(*form, PasswordStore::DISALLOW_PROMPT, &consumer);
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&forms);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Crashy.  http://crbug.com/86558
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, DISABLED_OutstandingWDSQueries) {
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_ = CreatePasswordStore();
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare(), ""));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData form_data = {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_->GetLogins(*form, PasswordStore::DISALLOW_PROMPT, &consumer);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release the PSW and the WDS before the query can return.
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_->Shutdown();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_ = NULL;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wds_ = NULL;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hangs flakily, see http://crbug.com/43836.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, DISABLED_MultipleWDSQueriesOnDifferentThreads) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IE7PasswordInfo password_info;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateIE7PasswordInfo(L"http://example.com/origin",
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    base::Time::FromDoubleT(1),
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &password_info));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wds_->AddIE7Login(password_info);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The WDS schedules tasks to run on the DB thread so we schedule yet another
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // task to notify us that it's safe to carry on with the test.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent done(false, false);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WaitableEvent::Signal, base::Unretained(&done)));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done.Wait();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_ = CreatePasswordStore();
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare(), ""));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer password_consumer;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(password_consumer, OnGetPasswordStoreResults(_))
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData 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"",
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData expected_form_data = {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"abcdefgh",
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"abcdefghijkl",
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> forms;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(CreatePasswordFormFromData(expected_form_data));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The IE7 password should be returned.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(password_consumer,
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnGetPasswordStoreResults(ContainsAllPasswordForms(forms)))
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(QuitUIMessageLoop());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_->GetLogins(*form, PasswordStore::DISALLOW_PROMPT, &password_consumer);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWebDataServiceConsumer wds_consumer;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(wds_consumer,
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnWebDataServiceRequestDone(_, _))
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(QuitUIMessageLoop());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wds_->GetIE7Login(password_info, &wds_consumer);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the MessageLoop twice: once for the GetIE7Login that PasswordStoreWin
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // schedules on the DB thread and once for the one we just scheduled on the UI
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&forms);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, EmptyLogins) {
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_ = CreatePasswordStore();
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  store_->Init(syncer::SyncableService::StartSyncFlare(), "");
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormData form_data = {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordForm::SCHEME_HTML,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/",
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/origin",
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://example.com/action",
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"submit_element",
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"username_element",
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"password_element",
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true, false, 1,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(consumer, OnGetPasswordStoreResults(_))
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VectorOfForms expect_none;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect that we get no results;
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(consumer,
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnGetPasswordStoreResults(ContainsAllPasswordForms(expect_none)))
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(DoAll(WithArg<0>(STLDeleteElements0()), QuitUIMessageLoop()));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_->GetLogins(*form, PasswordStore::DISALLOW_PROMPT, &consumer);
39590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, EmptyBlacklistLogins) {
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_ = CreatePasswordStore();
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  store_->Init(syncer::SyncableService::StartSyncFlare(), "");
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_CALL(consumer, OnGetPasswordStoreResults(_))
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VectorOfForms expect_none;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect that we get no results;
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      consumer,
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OnGetPasswordStoreResults(ContainsAllPasswordForms(expect_none)))
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .WillOnce(DoAll(WithArg<0>(STLDeleteElements0()), QuitUIMessageLoop()));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->GetBlacklistLogins(&consumer);
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PasswordStoreWinTest, EmptyAutofillableLogins) {
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_ = CreatePasswordStore();
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  store_->Init(syncer::SyncableService::StartSyncFlare(), "");
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPasswordStoreConsumer consumer;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we quit the MessageLoop even if the test fails.
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_CALL(consumer, OnGetPasswordStoreResults(_))
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillByDefault(QuitUIMessageLoop());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VectorOfForms expect_none;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect that we get no results;
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      consumer,
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OnGetPasswordStoreResults(ContainsAllPasswordForms(expect_none)))
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .WillOnce(DoAll(WithArg<0>(STLDeleteElements0()), QuitUIMessageLoop()));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_->GetAutofillableLogins(&consumer);
43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
439