password_store_x_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_form_data.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_change.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_consumer.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_x.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/browser_thread.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_notification_observer.h" 31a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using autofill::PasswordForm; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ElementsAreArray; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Pointee; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Property; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::WithArg; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<PasswordForm*> VectorOfForms; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockPasswordStoreConsumer : public PasswordStoreConsumer { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnPasswordStoreRequestDone, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(CancelableRequestProvider::Handle, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<PasswordForm*>&)); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(OnGetPasswordStoreResults, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(const std::vector<PasswordForm*>&)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class will add and remove a mock notification observer from 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the DB thread. 59a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass DBThreadObserverHelper { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 61a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DBThreadObserverHelper() {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch ~DBThreadObserverHelper() { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.RemoveAll(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch void Init(PasswordStore* password_store) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(&observer_, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_LOGINS_CHANGED, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<PasswordStore>(password_store)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::MockNotificationObserver& observer() { 74a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return observer_; 75a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 76a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch private: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::MockNotificationObserver observer_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FailingBackend : public PasswordStoreX::NativeBackend { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Init() OVERRIDE { return true; } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool AddLogin(const PasswordForm& form) OVERRIDE { return false; } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UpdateLogin(const PasswordForm& form) OVERRIDE { return false; } 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLogin(const PasswordForm& form) OVERRIDE { return false; } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLoginsCreatedBetween( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& delete_begin, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& delete_end) OVERRIDE { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetLogins(const PasswordForm& form, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetLoginsCreatedBetween(const base::Time& get_begin, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& get_end, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetAutofillableLogins(PasswordFormList* forms) OVERRIDE { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetBlacklistLogins(PasswordFormList* forms) OVERRIDE { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockBackend : public PasswordStoreX::NativeBackend { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Init() OVERRIDE { return true; } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool AddLogin(const PasswordForm& form) OVERRIDE { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_.push_back(form); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UpdateLogin(const PasswordForm& form) OVERRIDE { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CompareForms(all_forms_[i], form, true)) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_[i] = form; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLogin(const PasswordForm& form) OVERRIDE { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CompareForms(all_forms_[i], form, false)) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) erase(i--); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RemoveLoginsCreatedBetween( 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& delete_begin, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& delete_end) OVERRIDE { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_begin <= all_forms_[i].date_created && 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (delete_end.is_null() || all_forms_[i].date_created < delete_end)) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) erase(i--); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetLogins(const PasswordForm& form, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (all_forms_[i].signon_realm == form.signon_realm) 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) virtual bool GetLoginsCreatedBetween(const base::Time& get_begin, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& get_end, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordFormList* forms) OVERRIDE { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get_begin <= all_forms_[i].date_created && 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (get_end.is_null() || all_forms_[i].date_created < get_end)) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetAutofillableLogins(PasswordFormList* forms) OVERRIDE { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!all_forms_[i].blacklisted_by_user) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetBlacklistLogins(PasswordFormList* forms) OVERRIDE { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_forms_.size(); ++i) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (all_forms_[i].blacklisted_by_user) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(new PasswordForm(all_forms_[i])); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void erase(size_t index) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < all_forms_.size() - 1) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_[index] = all_forms_[all_forms_.size() - 1]; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_forms_.pop_back(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CompareForms(const PasswordForm& a, const PasswordForm& b, bool update) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An update check doesn't care about the submit element. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!update && a.submit_element != b.submit_element) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a.origin == b.origin && 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.password_element == b.password_element && 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.signon_realm == b.signon_realm && 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.username_element == b.username_element && 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.username_value == b.username_value; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PasswordForm> all_forms_; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockLoginDatabaseReturn { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnLoginDatabaseQueryDone, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const std::vector<PasswordForm*>&)); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginDatabaseQueryCallback(LoginDatabase* login_db, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autofillable, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockLoginDatabaseReturn* mock_return) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PasswordForm*> forms; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (autofillable) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_db->GetAutofillableLogins(&forms); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_db->GetBlacklistLogins(&forms); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_return->OnLoginDatabaseQueryDone(forms); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate |count| expected logins, either auto-fillable or blacklisted. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitExpectedForms(bool autofillable, size_t count, VectorOfForms* forms) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* domain = autofillable ? "example" : "blacklisted"; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string realm = base::StringPrintf("http://%zu.%s.com", i, domain); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string origin = base::StringPrintf("http://%zu.%s.com/origin", 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i, domain); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string action = base::StringPrintf("http://%zu.%s.com/action", 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i, domain); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordFormData data = { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordForm::SCHEME_HTML, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) realm.c_str(), 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin.c_str(), 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action.c_str(), 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"submit_element", 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"username_element", 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"password_element", 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofillable ? L"username_value" : NULL, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofillable ? L"password_value" : NULL, 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autofillable, false, static_cast<double>(i + 1) }; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms->push_back(CreatePasswordFormFromData(data)); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BackendType { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_BACKEND, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAILING_BACKEND, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WORKING_BACKEND 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreXTest : public testing::TestWithParam<BackendType> { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(new TestingProfile()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_db_.reset(new LoginDatabase()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(login_db_->Init(temp_dir_.path().Append("login_test"))); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 263a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreX::NativeBackend* GetBackend() { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetParam()) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FAILING_BACKEND: 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FailingBackend(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WORKING_BACKEND: 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new MockBackend(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 277a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoginDatabase> login_db_; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(STLDeleteElements0) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteContainerPointers(arg0.begin(), arg0.end()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(PasswordStoreXTest, Notifications) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PasswordStoreX> store( 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PasswordStoreX(login_db_.release(), 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.get(), 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackend())); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->Init(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordFormData form_data = 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PasswordForm::SCHEME_HTML, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://bar.example.com", 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://bar.example.com/origin", 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://bar.example.com/action", 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"submit_element", 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"username_element", 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"password_element", 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"username_value", 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"password_value", 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, false, 1 }; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 308a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DBThreadObserverHelper helper; 309a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch helper.Init(store.get()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_add_changes[] = { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::ADD, *form), 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 316a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch helper.observer(), 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED), 318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::Source<PasswordStore>(store.get()), 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Property(&content::Details<const PasswordStoreChangeList>::ptr, 320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Pointee(ElementsAreArray(expected_add_changes))))); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding a login should trigger a notification. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->AddLogin(*form); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // The PasswordStore schedules tasks to run on the DB thread. Wait for them 326a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // to complete. 327a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the password. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form->password_value = WideToUTF16(L"a different password"); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_update_changes[] = { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::UPDATE, *form), 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 337a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch helper.observer(), 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED), 339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::Source<PasswordStore>(store.get()), 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Property(&content::Details<const PasswordStoreChangeList>::ptr, 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Pointee(ElementsAreArray(expected_update_changes))))); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updating the login with the new password should trigger a notification. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->UpdateLogin(*form); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 346a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for PasswordStore to send execute. 347a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordStoreChange expected_delete_changes[] = { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreChange(PasswordStoreChange::REMOVE, *form), 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL( 354a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch helper.observer(), 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED), 356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::Source<PasswordStore>(store.get()), 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Property(&content::Details<const PasswordStoreChangeList>::ptr, 358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Pointee(ElementsAreArray(expected_delete_changes))))); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleting the login should trigger a notification. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->RemoveLogin(*form); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 363a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for PasswordStore to execute. 364a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Public in PasswordStore, protected in PasswordStoreX. 367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<PasswordStore*>(store.get())->ShutdownOnUIThread(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(PasswordStoreXTest, NativeMigration) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms expected_autofillable; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitExpectedForms(true, 50, &expected_autofillable); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms expected_blacklisted; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitExpectedForms(false, 50, &expected_blacklisted); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the initial size of the login DB file, before we populate it. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will be used later to make sure it gets back to this size. 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath login_db_file = temp_dir_.path().Append("login_test"); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileInfo db_file_start_info; 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_start_info)); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginDatabase* login_db = login_db_.get(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Populate the login DB with logins that should be migrated. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (VectorOfForms::iterator it = expected_autofillable.begin(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != expected_autofillable.end(); ++it) { 388a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch login_db->AddLogin(**it); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (VectorOfForms::iterator it = expected_blacklisted.begin(); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != expected_blacklisted.end(); ++it) { 392a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch login_db->AddLogin(**it); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the new size of the login DB file. We expect it to be larger. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileInfo db_file_full_info; 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_full_info)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(db_file_full_info.size, db_file_start_info.size); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializing the PasswordStore shouldn't trigger a native migration (yet). 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PasswordStoreX> store( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PasswordStoreX(login_db_.release(), 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.get(), 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackend())); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->Init(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPasswordStoreConsumer consumer; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The autofillable forms should have been migrated to the native backend. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(consumer, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPasswordStoreRequestDone(_, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_autofillable))) 413a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch .WillOnce(WithArg<1>(STLDeleteElements0())); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->GetAutofillableLogins(&consumer); 416a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The blacklisted forms should have been migrated to the native backend. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(consumer, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPasswordStoreRequestDone(_, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_blacklisted))) 422a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch .WillOnce(WithArg<1>(STLDeleteElements0())); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) store->GetBlacklistLogins(&consumer); 425a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VectorOfForms empty; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockLoginDatabaseReturn ld_return; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetParam() == WORKING_BACKEND) { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No autofillable 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 autofillable logins should still be in the login DB. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_autofillable))) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch LoginDatabaseQueryCallback(login_db, true, &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) // Likewise, no blacklisted logins should be left in the login DB. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone(ContainsAllPasswordForms(empty))); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The blacklisted logins should still be in the login DB. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(ld_return, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginDatabaseQueryDone( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainsAllPasswordForms(expected_blacklisted))) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(WithArg<0>(STLDeleteElements0())); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 459a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch LoginDatabaseQueryCallback(login_db, false, &ld_return); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 461a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Wait for the login DB methods to execute. 462a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetParam() == WORKING_BACKEND) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the migration succeeded, then not only should there be no logins left 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the login DB, but also the file should have been deleted and then 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recreated. We approximate checking for this by checking that the file 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size is equal to the size before we populated it, even though it was 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // larger after populating it. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileInfo db_file_end_info; 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::GetFileInfo(login_db_file, &db_file_end_info)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(db_file_start_info.size, db_file_end_info.size); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&expected_autofillable); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&expected_blacklisted); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Public in PasswordStore, protected in PasswordStoreX. 479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<PasswordStore*>(store.get())->ShutdownOnUIThread(); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(NoBackend, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(NO_BACKEND)); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(FailingBackend, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(FAILING_BACKEND)); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(WorkingBackend, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreXTest, 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(WORKING_BACKEND)); 491