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