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)