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