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