passwords_helper.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync/test/integration/passwords_helper.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/compiler_specific.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/stringprintf.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/time/time.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/password_manager/password_store_factory.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/password_manager/core/browser/password_form_data.h"
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "components/password_manager/core/browser/password_store.h"
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/password_manager/core/browser/password_store_consumer.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using autofill::PasswordForm;
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using sync_datatype_helper::test;
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const std::string kFakeSignonRealm = "http://fake-signon-realm.google.com/";
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char* kIndexedFakeOrigin = "http://fake-signon-realm.google.com/%d";
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// We use a WaitableEvent to wait when logins are added, removed, or updated
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// instead of running the UI message loop because of a restriction that
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// prevents a DB thread from initiating a quit of the UI message loop.
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PasswordStoreCallback(base::WaitableEvent* wait_event) {
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Wake up passwords_helper::AddLogin.
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  wait_event->Signal();
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PasswordStoreConsumerHelper : public PasswordStoreConsumer {
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  explicit PasswordStoreConsumerHelper(std::vector<PasswordForm>* result)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : PasswordStoreConsumer(),
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        result_(result) {}
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void OnGetPasswordStoreResults(
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const std::vector<PasswordForm*>& result) OVERRIDE {
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    result_->clear();
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (std::vector<PasswordForm*>::const_iterator it = result.begin();
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         it != result.end();
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         ++it) {
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      result_->push_back(**it);
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      delete *it;
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Quit the message loop to wake up passwords_helper::GetLogins.
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::MessageLoopForUI::current()->Quit();
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<PasswordForm>* result_;
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PasswordStoreConsumerHelper);
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace passwords_helper {
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void AddLogin(PasswordStore* store, const PasswordForm& form) {
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(store);
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::WaitableEvent wait_event(true, false);
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  store->AddLogin(form);
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  store->ScheduleTask(base::Bind(&PasswordStoreCallback, &wait_event));
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  wait_event.Wait();
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void UpdateLogin(PasswordStore* store, const PasswordForm& form) {
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(store);
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::WaitableEvent wait_event(true, false);
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  store->UpdateLogin(form);
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  store->ScheduleTask(base::Bind(&PasswordStoreCallback, &wait_event));
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  wait_event.Wait();
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void GetLogins(PasswordStore* store, std::vector<PasswordForm>& matches) {
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(store);
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PasswordForm matcher_form;
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  matcher_form.signon_realm = kFakeSignonRealm;
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PasswordStoreConsumerHelper consumer(&matches);
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  store->GetLogins(matcher_form, PasswordStore::DISALLOW_PROMPT, &consumer);
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::RunMessageLoop();
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RemoveLogin(PasswordStore* store, const PasswordForm& form) {
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(store);
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::WaitableEvent wait_event(true, false);
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  store->RemoveLogin(form);
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  store->ScheduleTask(base::Bind(&PasswordStoreCallback, &wait_event));
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  wait_event.Wait();
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RemoveLogins(PasswordStore* store) {
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<PasswordForm> forms;
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  GetLogins(store, forms);
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (std::vector<PasswordForm>::iterator it = forms.begin();
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       it != forms.end(); ++it) {
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    RemoveLogin(store, *it);
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void SetEncryptionPassphrase(int index,
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                             const std::string& passphrase,
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                             ProfileSyncService::PassphraseType type) {
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProfileSyncServiceFactory::GetForProfile(
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      test()->GetProfile(index))->SetEncryptionPassphrase(passphrase, type);
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool SetDecryptionPassphrase(int index, const std::string& passphrase) {
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return ProfileSyncServiceFactory::GetForProfile(
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      test()->GetProfile(index))->SetDecryptionPassphrase(passphrase);
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PasswordStore* GetPasswordStore(int index) {
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return PasswordStoreFactory::GetForProfile(test()->GetProfile(index),
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                             Profile::IMPLICIT_ACCESS).get();
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PasswordStore* GetVerifierPasswordStore() {
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return PasswordStoreFactory::GetForProfile(test()->verifier(),
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                             Profile::IMPLICIT_ACCESS).get();
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool ProfileContainsSamePasswordFormsAsVerifier(int index) {
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<PasswordForm> verifier_forms;
134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::vector<PasswordForm> forms;
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetLogins(GetVerifierPasswordStore(), verifier_forms);
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetLogins(GetPasswordStore(index), forms);
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool result = ContainsSamePasswordForms(verifier_forms, forms);
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!result) {
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LOG(ERROR) << "Password forms in Verifier Profile:";
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (std::vector<PasswordForm>::iterator it = verifier_forms.begin();
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         it != verifier_forms.end(); ++it) {
142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LOG(ERROR) << *it << std::endl;
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LOG(ERROR) << "Password forms in Profile" << index << ":";
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (std::vector<PasswordForm>::iterator it = forms.begin();
146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)         it != forms.end(); ++it) {
147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LOG(ERROR) << *it << std::endl;
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return result;
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool ProfilesContainSamePasswordForms(int index_a, int index_b) {
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<PasswordForm> forms_a;
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::vector<PasswordForm> forms_b;
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  GetLogins(GetPasswordStore(index_a), forms_a);
157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  GetLogins(GetPasswordStore(index_b), forms_b);
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool result = ContainsSamePasswordForms(forms_a, forms_b);
159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!result) {
160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    LOG(ERROR) << "Password forms in Profile" << index_a << ":";
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (std::vector<PasswordForm>::iterator it = forms_a.begin();
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         it != forms_a.end(); ++it) {
163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LOG(ERROR) << *it << std::endl;
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LOG(ERROR) << "Password forms in Profile" << index_b << ":";
166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    for (std::vector<PasswordForm>::iterator it = forms_b.begin();
167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)         it != forms_b.end(); ++it) {
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LOG(ERROR) << *it << std::endl;
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return result;
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool AllProfilesContainSamePasswordFormsAsVerifier() {
175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (int i = 0; i < test()->num_clients(); ++i) {
176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (!ProfileContainsSamePasswordFormsAsVerifier(i)) {
177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LOG(ERROR) << "Profile " << i << " does not contain the same password"
178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                       " forms as the verifier.";
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return false;
180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return true;
183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool AllProfilesContainSamePasswordForms() {
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (int i = 1; i < test()->num_clients(); ++i) {
1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (!ProfilesContainSamePasswordForms(0, i)) {
188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LOG(ERROR) << "Profile " << i << " does not contain the same password"
189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                       " forms as Profile 0.";
190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return false;
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int GetPasswordCount(int index) {
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<PasswordForm> forms;
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetLogins(GetPasswordStore(index), forms);
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return forms.size();
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int GetVerifierPasswordCount() {
203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::vector<PasswordForm> verifier_forms;
204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  GetLogins(GetVerifierPasswordStore(), verifier_forms);
205d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return verifier_forms.size();
206d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)PasswordForm CreateTestPasswordForm(int index) {
209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  PasswordForm form;
210d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  form.signon_realm = kFakeSignonRealm;
211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  form.origin = GURL(base::StringPrintf(kIndexedFakeOrigin, index));
212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  form.username_value =
213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::ASCIIToUTF16(base::StringPrintf("username%d", index));
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form.password_value =
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::ASCIIToUTF16(base::StringPrintf("password%d", index));
216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  form.date_created = base::Time::Now();
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return form;
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace passwords_helper
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)