password_store_x_unittest.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_x.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_form_data.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_store_change.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_store_consumer.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/common/password_manager_pref_names.h" 24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/browser_thread.h" 25a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using autofill::PasswordForm; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::ContainsAllPasswordForms; 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::PasswordStoreChange; 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) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool AddLogin(const PasswordForm& form) OVERRIDE { return false; } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UpdateLogin(const PasswordForm& form) OVERRIDE { return false; } 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLogin(const PasswordForm& form) OVERRIDE { return false; } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLoginsCreatedBetween( 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& delete_begin, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& delete_end) OVERRIDE { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetLogins(const PasswordForm& form, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetLoginsCreatedBetween(const base::Time& get_begin, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& get_end, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetAutofillableLogins(PasswordFormList* forms) OVERRIDE { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetBlacklistLogins(PasswordFormList* forms) OVERRIDE { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockBackend : public PasswordStoreX::NativeBackend { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Init() OVERRIDE { return true; } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool AddLogin(const PasswordForm& form) OVERRIDE { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_.push_back(form); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UpdateLogin(const PasswordForm& form) OVERRIDE { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CompareForms(all_forms_[i], form, true)) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_[i] = form; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLogin(const PasswordForm& form) OVERRIDE { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CompareForms(all_forms_[i], form, false)) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) erase(i--); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLoginsCreatedBetween( 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& delete_begin, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& delete_end) OVERRIDE { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_begin <= all_forms_[i].date_created && 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (delete_end.is_null() || all_forms_[i].date_created < delete_end)) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) erase(i--); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetLogins(const PasswordForm& form, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (all_forms_[i].signon_realm == form.signon_realm) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetLoginsCreatedBetween(const base::Time& get_begin, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& get_end, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get_begin <= all_forms_[i].date_created && 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (get_end.is_null() || all_forms_[i].date_created < get_end)) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetAutofillableLogins(PasswordFormList* forms) OVERRIDE { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!all_forms_[i].blacklisted_by_user) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetBlacklistLogins(PasswordFormList* forms) OVERRIDE { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (all_forms_[i].blacklisted_by_user) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void erase(size_t index) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < all_forms_.size() - 1) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_[index] = all_forms_[all_forms_.size() - 1]; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_.pop_back(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CompareForms(const PasswordForm& a, const PasswordForm& b, bool update) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An update check doesn't care about the submit element. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!update && a.submit_element != b.submit_element) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a.origin == b.origin && 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.password_element == b.password_element && 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.signon_realm == b.signon_realm && 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.username_element == b.username_element && 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.username_value == b.username_value; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PasswordForm> all_forms_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockLoginDatabaseReturn { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnLoginDatabaseQueryDone, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const std::vector<PasswordForm*>&)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LoginDatabaseQueryCallback(password_manager::LoginDatabase* login_db, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autofillable, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockLoginDatabaseReturn* mock_return) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PasswordForm*> forms; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (autofillable) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_db->GetAutofillableLogins(&forms); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_db->GetBlacklistLogins(&forms); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_return->OnLoginDatabaseQueryDone(forms); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate |count| expected logins, either auto-fillable or blacklisted. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitExpectedForms(bool autofillable, size_t count, VectorOfForms* forms) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* domain = autofillable ? "example" : "blacklisted"; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string realm = base::StringPrintf("http://%zu.%s.com", i, domain); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string origin = base::StringPrintf("http://%zu.%s.com/origin", 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i, domain); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string action = base::StringPrintf("http://%zu.%s.com/action", 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i, domain); 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::PasswordFormData data = { 205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PasswordForm::SCHEME_HTML, 206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch realm.c_str(), 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch origin.c_str(), 208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch action.c_str(), 209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"submit_element", 210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"username_element", 211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"password_element", 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch autofillable ? L"username_value" : NULL, 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch autofillable ? L"password_value" : NULL, 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch autofillable, 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch false, 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<double>(i + 1)}; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(CreatePasswordFormFromData(data)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BackendType { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_BACKEND, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAILING_BACKEND, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORKING_BACKEND 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreXTest : public testing::TestWithParam<BackendType> { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch login_db_.reset(new password_manager::LoginDatabase()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(login_db_->Init(temp_dir_.path().Append("login_test"))); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 239a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreX::NativeBackend* GetBackend() { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetParam()) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FAILING_BACKEND: 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FailingBackend(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WORKING_BACKEND: 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new MockBackend(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 253a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<password_manager::LoginDatabase> login_db_; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(STLDeleteElements0) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteContainerPointers(arg0.begin(), arg0.end()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(PasswordStoreXTest, Notifications) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PasswordStoreX> store( 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new PasswordStoreX(base::MessageLoopProxy::current(), 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopProxy::current(), 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) login_db_.release(), 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackend())); 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) store->Init(syncer::SyncableService::StartSyncFlare()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::PasswordFormData form_data = { 272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PasswordForm::SCHEME_HTML, "http://bar.example.com", 273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "http://bar.example.com/origin", "http://bar.example.com/action", 274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"submit_element", L"username_element", 275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"password_element", L"username_value", 276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch L"password_value", true, 277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch false, 1}; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockPasswordStoreObserver observer; 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) store->AddObserver(&observer); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_add_changes[] = { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::ADD, *form), 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer, 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnLoginsChanged(ElementsAreArray(expected_add_changes))); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding a login should trigger a notification. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->AddLogin(*form); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 294a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // The PasswordStore schedules tasks to run on the DB thread. Wait for them 295a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // to complete. 296a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the password. 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) form->password_value = base::ASCIIToUTF16("a different password"); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_update_changes[] = { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::UPDATE, *form), 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer, 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnLoginsChanged(ElementsAreArray(expected_update_changes))); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updating the login with the new password should trigger a notification. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->UpdateLogin(*form); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for PasswordStore to send execute. 313a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_delete_changes[] = { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::REMOVE, *form), 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer, 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnLoginsChanged(ElementsAreArray(expected_delete_changes))); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleting the login should trigger a notification. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->RemoveLogin(*form); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 326a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for PasswordStore to execute. 327a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) store->RemoveObserver(&observer); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) store->Shutdown(); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(PasswordStoreXTest, NativeMigration) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms expected_autofillable; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitExpectedForms(true, 50, &expected_autofillable); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms expected_blacklisted; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitExpectedForms(false, 50, &expected_blacklisted); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the initial size of the login DB file, before we populate it. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will be used later to make sure it gets back to this size. 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath login_db_file = temp_dir_.path().Append("login_test"); 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info db_file_start_info; 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_start_info)); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::LoginDatabase* login_db = login_db_.get(); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Populate the login DB with logins that should be migrated. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (VectorOfForms::iterator it = expected_autofillable.begin(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != expected_autofillable.end(); ++it) { 352a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch login_db->AddLogin(**it); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (VectorOfForms::iterator it = expected_blacklisted.begin(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != expected_blacklisted.end(); ++it) { 356a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch login_db->AddLogin(**it); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the new size of the login DB file. We expect it to be larger. 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info db_file_full_info; 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_full_info)); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(db_file_full_info.size, db_file_start_info.size); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializing the PasswordStore shouldn't trigger a native migration (yet). 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PasswordStoreX> store( 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new PasswordStoreX(base::MessageLoopProxy::current(), 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopProxy::current(), 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) login_db_.release(), 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackend())); 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) store->Init(syncer::SyncableService::StartSyncFlare()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPasswordStoreConsumer consumer; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The autofillable forms should have been migrated to the native backend. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(consumer, 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnGetPasswordStoreResults( 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_autofillable))) 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->GetAutofillableLogins(&consumer); 381a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The blacklisted forms should have been migrated to the native backend. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(consumer, 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnGetPasswordStoreResults(ContainsAllPasswordForms(expected_blacklisted))) 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->GetBlacklistLogins(&consumer); 389a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms empty; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockLoginDatabaseReturn ld_return; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetParam() == WORKING_BACKEND) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No autofillable logins should be left in the login DB. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone(ContainsAllPasswordForms(empty))); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The autofillable logins should still be in the login DB. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_autofillable))) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 406a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch LoginDatabaseQueryCallback(login_db, true, &ld_return); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 408a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for the login DB methods to execute. 409a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetParam() == WORKING_BACKEND) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Likewise, no blacklisted logins should be left in the login DB. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone(ContainsAllPasswordForms(empty))); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The blacklisted logins should still be in the login DB. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone( 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_blacklisted))) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 423a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch LoginDatabaseQueryCallback(login_db, false, &ld_return); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for the login DB methods to execute. 426a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetParam() == WORKING_BACKEND) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the migration succeeded, then not only should there be no logins left 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the login DB, but also the file should have been deleted and then 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recreated. We approximate checking for this by checking that the file 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size is equal to the size before we populated it, even though it was 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // larger after populating it. 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info db_file_end_info; 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_end_info)); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(db_file_start_info.size, db_file_end_info.size); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&expected_autofillable); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&expected_blacklisted); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) store->Shutdown(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(NoBackend, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(NO_BACKEND)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(FailingBackend, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(FAILING_BACKEND)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(WorkingBackend, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(WORKING_BACKEND)); 454