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 "base/basictypes.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_x.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_form_data.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_store_change.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_store_consumer.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/common/password_manager_pref_names.h" 23a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/browser_thread.h" 24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using autofill::PasswordForm; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::ContainsAllPasswordForms; 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::PasswordStoreChange; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using password_manager::PasswordStoreChangeList; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ElementsAreArray; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Pointee; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Property; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::WithArg; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<PasswordForm*> VectorOfForms; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MockPasswordStoreConsumer 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : public password_manager::PasswordStoreConsumer { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(OnGetPasswordStoreResults, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(const std::vector<PasswordForm*>&)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MockPasswordStoreObserver 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : public password_manager::PasswordStore::Observer { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(OnLoginsChanged, 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void(const password_manager::PasswordStoreChangeList& changes)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FailingBackend : public PasswordStoreX::NativeBackend { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Init() OVERRIDE { return true; } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual PasswordStoreChangeList AddLogin(const PasswordForm& form) OVERRIDE { 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PasswordStoreChangeList(); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool UpdateLogin(const PasswordForm& form, 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PasswordStoreChangeList* changes) OVERRIDE { 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLogin(const PasswordForm& form) OVERRIDE { return false; } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual bool RemoveLoginsCreatedBetween( 726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time delete_begin, 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time delete_end, 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) password_manager::PasswordStoreChangeList* changes) OVERRIDE { 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool RemoveLoginsSyncedBetween( 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Time delete_begin, 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Time delete_end, 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) password_manager::PasswordStoreChangeList* changes) OVERRIDE { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetLogins(const PasswordForm& form, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetAutofillableLogins(PasswordFormList* forms) OVERRIDE { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetBlacklistLogins(PasswordFormList* forms) OVERRIDE { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockBackend : public PasswordStoreX::NativeBackend { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Init() OVERRIDE { return true; } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual PasswordStoreChangeList AddLogin(const PasswordForm& form) OVERRIDE { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_.push_back(form); 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PasswordStoreChange change(PasswordStoreChange::ADD, form); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PasswordStoreChangeList(1, change); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool UpdateLogin(const PasswordForm& form, 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PasswordStoreChangeList* changes) OVERRIDE { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (CompareForms(all_forms_[i], form, true)) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_[i] = form; 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) changes->push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form)); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLogin(const PasswordForm& form) OVERRIDE { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CompareForms(all_forms_[i], form, false)) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) erase(i--); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual bool RemoveLoginsCreatedBetween( 1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time delete_begin, 1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Time delete_end, 1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) password_manager::PasswordStoreChangeList* changes) OVERRIDE { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_begin <= all_forms_[i].date_created && 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (delete_end.is_null() || all_forms_[i].date_created < delete_end)) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) erase(i--); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool RemoveLoginsSyncedBetween( 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Time delete_begin, 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Time delete_end, 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) password_manager::PasswordStoreChangeList* changes) OVERRIDE { 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(changes); 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) { 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (delete_begin <= all_forms_[i].date_synced && 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (delete_end.is_null() || all_forms_[i].date_synced < delete_end)) { 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) changes->push_back(password_manager::PasswordStoreChange( 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) password_manager::PasswordStoreChange::REMOVE, all_forms_[i])); 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) erase(i--); 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetLogins(const PasswordForm& form, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (all_forms_[i].signon_realm == form.signon_realm) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetAutofillableLogins(PasswordFormList* forms) OVERRIDE { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!all_forms_[i].blacklisted_by_user) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetBlacklistLogins(PasswordFormList* forms) OVERRIDE { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (all_forms_[i].blacklisted_by_user) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void erase(size_t index) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < all_forms_.size() - 1) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_[index] = all_forms_[all_forms_.size() - 1]; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_.pop_back(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CompareForms(const PasswordForm& a, const PasswordForm& b, bool update) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An update check doesn't care about the submit element. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!update && a.submit_element != b.submit_element) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a.origin == b.origin && 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.password_element == b.password_element && 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.signon_realm == b.signon_realm && 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.username_element == b.username_element && 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.username_value == b.username_value; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PasswordForm> all_forms_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockLoginDatabaseReturn { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnLoginDatabaseQueryDone, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const std::vector<PasswordForm*>&)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LoginDatabaseQueryCallback(password_manager::LoginDatabase* login_db, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autofillable, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockLoginDatabaseReturn* mock_return) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PasswordForm*> forms; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (autofillable) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_db->GetAutofillableLogins(&forms); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_db->GetBlacklistLogins(&forms); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_return->OnLoginDatabaseQueryDone(forms); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate |count| expected logins, either auto-fillable or blacklisted. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitExpectedForms(bool autofillable, size_t count, VectorOfForms* forms) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* domain = autofillable ? "example" : "blacklisted"; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string realm = base::StringPrintf("http://%zu.%s.com", i, domain); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string origin = base::StringPrintf("http://%zu.%s.com/origin", 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i, domain); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string action = base::StringPrintf("http://%zu.%s.com/action", 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i, domain); 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::PasswordFormData data = { 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PasswordForm::SCHEME_HTML, 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch realm.c_str(), 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch origin.c_str(), 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch action.c_str(), 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"submit_element", 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"username_element", 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"password_element", 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch autofillable ? L"username_value" : NULL, 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch autofillable ? L"password_value" : NULL, 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch autofillable, 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch false, 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<double>(i + 1)}; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(CreatePasswordFormFromData(data)); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BackendType { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_BACKEND, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAILING_BACKEND, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORKING_BACKEND 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreXTest : public testing::TestWithParam<BackendType> { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch login_db_.reset(new password_manager::LoginDatabase()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(login_db_->Init(temp_dir_.path().Append("login_test"))); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 258a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreX::NativeBackend* GetBackend() { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetParam()) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FAILING_BACKEND: 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FailingBackend(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WORKING_BACKEND: 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new MockBackend(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<password_manager::LoginDatabase> login_db_; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(STLDeleteElements0) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteContainerPointers(arg0.begin(), arg0.end()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(PasswordStoreXTest, Notifications) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PasswordStoreX> store( 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new PasswordStoreX(base::MessageLoopProxy::current(), 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopProxy::current(), 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) login_db_.release(), 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackend())); 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch store->Init(syncer::SyncableService::StartSyncFlare(), ""); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::PasswordFormData form_data = { 291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PasswordForm::SCHEME_HTML, "http://bar.example.com", 292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "http://bar.example.com/origin", "http://bar.example.com/action", 293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"submit_element", L"username_element", 294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"password_element", L"username_value", 295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"password_value", true, 296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch false, 1}; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data)); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockPasswordStoreObserver observer; 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) store->AddObserver(&observer); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_add_changes[] = { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::ADD, *form), 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer, 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnLoginsChanged(ElementsAreArray(expected_add_changes))); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding a login should trigger a notification. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->AddLogin(*form); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 313a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // The PasswordStore schedules tasks to run on the DB thread. Wait for them 314a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // to complete. 315a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the password. 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) form->password_value = base::ASCIIToUTF16("a different password"); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_update_changes[] = { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::UPDATE, *form), 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer, 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnLoginsChanged(ElementsAreArray(expected_update_changes))); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updating the login with the new password should trigger a notification. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->UpdateLogin(*form); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 331a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for PasswordStore to send execute. 332a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_delete_changes[] = { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::REMOVE, *form), 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer, 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnLoginsChanged(ElementsAreArray(expected_delete_changes))); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleting the login should trigger a notification. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->RemoveLogin(*form); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for PasswordStore to execute. 346a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) store->RemoveObserver(&observer); 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) store->Shutdown(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(PasswordStoreXTest, NativeMigration) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms expected_autofillable; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitExpectedForms(true, 50, &expected_autofillable); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms expected_blacklisted; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitExpectedForms(false, 50, &expected_blacklisted); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the initial size of the login DB file, before we populate it. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will be used later to make sure it gets back to this size. 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath login_db_file = temp_dir_.path().Append("login_test"); 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info db_file_start_info; 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_start_info)); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::LoginDatabase* login_db = login_db_.get(); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Populate the login DB with logins that should be migrated. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (VectorOfForms::iterator it = expected_autofillable.begin(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != expected_autofillable.end(); ++it) { 371a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch login_db->AddLogin(**it); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (VectorOfForms::iterator it = expected_blacklisted.begin(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != expected_blacklisted.end(); ++it) { 375a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch login_db->AddLogin(**it); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the new size of the login DB file. We expect it to be larger. 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info db_file_full_info; 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_full_info)); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(db_file_full_info.size, db_file_start_info.size); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializing the PasswordStore shouldn't trigger a native migration (yet). 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PasswordStoreX> store( 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new PasswordStoreX(base::MessageLoopProxy::current(), 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopProxy::current(), 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) login_db_.release(), 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackend())); 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch store->Init(syncer::SyncableService::StartSyncFlare(), ""); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPasswordStoreConsumer consumer; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The autofillable forms should have been migrated to the native backend. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(consumer, 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnGetPasswordStoreResults( 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_autofillable))) 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->GetAutofillableLogins(&consumer); 400a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The blacklisted forms should have been migrated to the native backend. 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(consumer, 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnGetPasswordStoreResults(ContainsAllPasswordForms(expected_blacklisted))) 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->GetBlacklistLogins(&consumer); 408a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms empty; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockLoginDatabaseReturn ld_return; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetParam() == WORKING_BACKEND) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No autofillable logins should be left in the login DB. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone(ContainsAllPasswordForms(empty))); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The autofillable logins should still be in the login DB. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone( 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_autofillable))) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch LoginDatabaseQueryCallback(login_db, true, &ld_return); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 427a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for the login DB methods to execute. 428a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetParam() == WORKING_BACKEND) { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Likewise, no blacklisted logins should be left in the login DB. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone(ContainsAllPasswordForms(empty))); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The blacklisted logins should still be in the login DB. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_blacklisted))) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch LoginDatabaseQueryCallback(login_db, false, &ld_return); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 444a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for the login DB methods to execute. 445a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetParam() == WORKING_BACKEND) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the migration succeeded, then not only should there be no logins left 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the login DB, but also the file should have been deleted and then 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recreated. We approximate checking for this by checking that the file 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size is equal to the size before we populated it, even though it was 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // larger after populating it. 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info db_file_end_info; 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_end_info)); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(db_file_start_info.size, db_file_end_info.size); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&expected_autofillable); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&expected_blacklisted); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) store->Shutdown(); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(NoBackend, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(NO_BACKEND)); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(FailingBackend, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(FAILING_BACKEND)); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(WorkingBackend, 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(WORKING_BACKEND)); 473