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 <algorithm>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/native_backend_kwallet_x.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/autofill/core/common/password_form.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/common/password_manager_pref_names.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_bus.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_object_proxy.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.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;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UTF8ToUTF16;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using password_manager::PasswordStoreChange;
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using password_manager::PasswordStoreChangeList;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class implements a very simple version of KWallet in memory.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We only provide the parts we actually use; the real version has more.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestKWallet {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::basic_string<uint8_t> Blob;  // std::string is binary-safe.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestKWallet() : reject_local_folders_(false) {}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_reject_local_folders(bool value) { reject_local_folders_ = value; }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: The method names here are the same as the corresponding DBus
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // methods, and therefore have names that don't match our style guide.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for presence of a given password folder.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hasFolder(const std::string& folder) const {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_.find(folder) != data_.end();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for presence of a given password in a given password folder.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hasEntry(const std::string& folder, const std::string& key) const {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Data::const_iterator it = data_.find(folder);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return it != data_.end() && it->second.find(key) != it->second.end();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a list of password keys in a given password folder.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool entryList(const std::string& folder,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 std::vector<std::string>* entries) const {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Data::const_iterator it = data_.find(folder);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it == data_.end()) return false;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (Folder::const_iterator fit = it->second.begin();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         fit != it->second.end(); ++fit)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entries->push_back(fit->first);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read the password data for a given password in a given password folder.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool readEntry(const std::string& folder, const std::string& key,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 Blob* value) const {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Data::const_iterator it = data_.find(folder);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it == data_.end()) return false;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Folder::const_iterator fit = it->second.find(key);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fit == it->second.end()) return false;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *value = fit->second;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the given password folder.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool createFolder(const std::string& folder) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reject_local_folders_ && folder.find('(') != std::string::npos)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_.insert(make_pair(folder, Folder())).second;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the given password from the given password folder.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool removeEntry(const std::string& folder, const std::string& key) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Data::iterator it = data_.find(folder);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it == data_.end()) return false;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return it->second.erase(key) > 0;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write the given password data to the given password folder.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool writeEntry(const std::string& folder, const std::string& key,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const Blob& value) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Data::iterator it = data_.find(folder);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it == data_.end()) return false;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    it->second[key] = value;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, Blob> Folder;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, Folder> Data;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Data data_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Local" folders are folders containing local profile IDs in their names. We
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can reject attempts to create them in order to make it easier to create
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // legacy shared passwords in these tests, for testing the migration code.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool reject_local_folders_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No need to disallow copy and assign. This class is safe to copy and assign.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Obscure magic: we need to declare storage for this constant because we use it
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in ways that require its address in this test, but not in the actual code.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int NativeBackendKWallet::kInvalidKWalletHandle;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass NativeBackendKWallet to promote some members to public for testing.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeBackendKWalletStub : public NativeBackendKWallet {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  explicit NativeBackendKWalletStub(LocalProfileId id)
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      :  NativeBackendKWallet(id) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using NativeBackendKWallet::InitWithBus;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using NativeBackendKWallet::kInvalidKWalletHandle;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using NativeBackendKWallet::DeserializeValue;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provide some test forms to avoid having to set them up in each test.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeBackendKWalletTestBase : public testing::Test {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendKWalletTestBase() {
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    old_form_google_.origin = GURL("http://www.google.com/");
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    old_form_google_.action = GURL("http://www.google.com/login");
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    old_form_google_.username_element = UTF8ToUTF16("user");
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    old_form_google_.username_value = UTF8ToUTF16("joeschmoe");
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    old_form_google_.password_element = UTF8ToUTF16("pass");
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    old_form_google_.password_value = UTF8ToUTF16("seekrit");
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    old_form_google_.submit_element = UTF8ToUTF16("submit");
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    old_form_google_.signon_realm = "Google";
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    form_google_ = old_form_google_;
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    form_google_.times_used = 3;
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    form_google_.type = PasswordForm::TYPE_GENERATED;
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    form_google_.form_data.name = UTF8ToUTF16("form_name");
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    form_google_.form_data.user_submitted = true;
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    form_google_.date_synced = base::Time::Now();
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    form_google_.display_name = UTF8ToUTF16("Joe Schmoe");
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    form_google_.avatar_url = GURL("http://www.google.com/avatar");
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    form_google_.federation_url = GURL("http://www.google.com/federation_url");
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    form_google_.is_zero_click = true;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.origin = GURL("http://www.isc.org/");
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.action = GURL("http://www.isc.org/auth");
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.username_element = UTF8ToUTF16("id");
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.username_value = UTF8ToUTF16("janedoe");
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.password_element = UTF8ToUTF16("passwd");
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.password_value = UTF8ToUTF16("ihazabukkit");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.submit_element = UTF8ToUTF16("login");
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.signon_realm = "ISC";
171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    form_isc_.date_synced = base::Time::Now();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static void CheckPasswordForm(const PasswordForm& expected,
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                const PasswordForm& actual);
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static void CheckPasswordChanges(const PasswordStoreChangeList& expected,
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   const PasswordStoreChangeList& actual);
178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static void CheckPasswordChangesWithResult(
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const PasswordStoreChangeList* expected,
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const PasswordStoreChangeList* actual,
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bool result);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PasswordForm old_form_google_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordForm form_google_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordForm form_isc_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeBackendKWalletTestBase::CheckPasswordForm(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PasswordForm& expected, const PasswordForm& actual) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.origin, actual.origin);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.password_value, actual.password_value);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.action, actual.action);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.username_element, actual.username_element);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.username_value, actual.username_value);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.password_element, actual.password_element);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.submit_element, actual.submit_element);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.signon_realm, actual.signon_realm);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.ssl_valid, actual.ssl_valid);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.preferred, actual.preferred);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't check the date created. It varies.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.blacklisted_by_user, actual.blacklisted_by_user);
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(expected.type, actual.type);
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(expected.times_used, actual.times_used);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected.scheme, actual.scheme);
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(expected.date_synced, actual.date_synced);
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(expected.display_name, actual.display_name);
20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(expected.avatar_url, actual.avatar_url);
20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(expected.federation_url, actual.federation_url);
21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(expected.is_zero_click, actual.is_zero_click);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NativeBackendKWalletTestBase::CheckPasswordChanges(
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const PasswordStoreChangeList& expected,
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const PasswordStoreChangeList& actual) {
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(expected.size(), actual.size());
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < expected.size(); ++i) {
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(expected[i].type(), actual[i].type());
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CheckPasswordForm(expected[i].form(), actual[i].form());
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void NativeBackendKWalletTestBase::CheckPasswordChangesWithResult(
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const PasswordStoreChangeList* expected,
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const PasswordStoreChangeList* actual,
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    bool result) {
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(result);
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CheckPasswordChanges(*expected, *actual);
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeBackendKWalletTest : public NativeBackendKWalletTestBase {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendKWalletTest()
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB), klauncher_ret_(0),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        klauncher_contacted_(false), kwallet_runnable_(true),
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kwallet_running_(true), kwallet_enabled_(true) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let the DB thread run to completion of all current tasks.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunDBThread() {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WaitableEvent event(false, false);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Bind(ThreadDone, &event));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.Wait();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Some of the tests may post messages to the UI thread, but we don't need
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to run those until after the DB thread is finished. So run it here.
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ThreadDone(base::WaitableEvent* event) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event->Signal();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Utilities to help verify sets of expectations.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              std::pair<std::string,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        std::vector<const PasswordForm*> > > ExpectationArray;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckPasswordForms(const std::string& folder,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const ExpectationArray& sorted_expected);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  enum RemoveBetweenMethod {
2676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    CREATED,
2686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    SYNCED,
2696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  };
2706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Tests RemoveLoginsCreatedBetween or RemoveLoginsSyncedBetween.
2726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void TestRemoveLoginsBetween(RemoveBetweenMethod date_to_test);
2736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockBus> mock_session_bus_;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockObjectProxy> mock_klauncher_proxy_;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockObjectProxy> mock_kwallet_proxy_;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int klauncher_ret_;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string klauncher_error_;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool klauncher_contacted_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool kwallet_runnable_;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool kwallet_running_;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool kwallet_enabled_;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestKWallet wallet_;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Response* KLauncherMethodCall(
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call, testing::Unused);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Response* KWalletMethodCall(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call, testing::Unused);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeBackendKWalletTest::SetUp() {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(db_thread_.Start());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Bus::Options options;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.bus_type = dbus::Bus::SESSION;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_session_bus_ = new dbus::MockBus(options);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_klauncher_proxy_ =
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new dbus::MockObjectProxy(mock_session_bus_.get(),
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "org.kde.klauncher",
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                dbus::ObjectPath("/KLauncher"));
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*mock_klauncher_proxy_.get(), MockCallMethodAndBlock(_, _))
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .WillRepeatedly(
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)           Invoke(this, &NativeBackendKWalletTest::KLauncherMethodCall));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_kwallet_proxy_ =
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new dbus::MockObjectProxy(mock_session_bus_.get(),
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "org.kde.kwalletd",
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                dbus::ObjectPath("/modules/kwalletd"));
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*mock_kwallet_proxy_.get(), MockCallMethodAndBlock(_, _))
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .WillRepeatedly(
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)           Invoke(this, &NativeBackendKWalletTest::KWalletMethodCall));
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      *mock_session_bus_.get(),
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetObjectProxy("org.kde.klauncher", dbus::ObjectPath("/KLauncher")))
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(mock_klauncher_proxy_.get()));
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      *mock_session_bus_.get(),
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetObjectProxy("org.kde.kwalletd", dbus::ObjectPath("/modules/kwalletd")))
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(mock_kwallet_proxy_.get()));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*mock_session_bus_.get(), ShutdownAndBlock()).WillOnce(Return())
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .WillRepeatedly(Return());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeBackendKWalletTest::TearDown() {
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(FROM_HERE,
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                         base::MessageLoop::QuitClosure());
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_thread_.Stop();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void NativeBackendKWalletTest::TestRemoveLoginsBetween(
3446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    RemoveBetweenMethod date_to_test) {
3456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  NativeBackendKWalletStub backend(42);
3466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
3476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  form_google_.date_synced = base::Time();
3496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  form_isc_.date_synced = base::Time();
3506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  form_google_.date_created = base::Time();
3516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  form_isc_.date_created = base::Time();
3526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::Time now = base::Time::Now();
3536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::Time next_day = now + base::TimeDelta::FromDays(1);
3546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (date_to_test == CREATED) {
3556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // crbug/374132. Remove the next line once it's fixed.
3566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    next_day = base::Time::FromTimeT(next_day.ToTimeT());
3576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    form_google_.date_created = now;
3586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    form_isc_.date_created = next_day;
3596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  } else {
3606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    form_google_.date_synced = now;
3616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    form_isc_.date_synced = next_day;
3626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
3636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BrowserThread::PostTask(
3656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      BrowserThread::DB,
3666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      FROM_HERE,
3676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
3686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 base::Unretained(&backend),
3696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 form_google_));
3706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BrowserThread::PostTask(
3716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      BrowserThread::DB,
3726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      FROM_HERE,
3736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
3746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 base::Unretained(&backend),
3756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 form_isc_));
3766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PasswordStoreChangeList expected_changes;
3786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  expected_changes.push_back(
3796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      PasswordStoreChange(PasswordStoreChange::REMOVE, form_google_));
3806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PasswordStoreChangeList changes;
3816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  bool (NativeBackendKWallet::*method)(
3826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Time, base::Time, password_manager::PasswordStoreChangeList*) =
3836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      date_to_test == CREATED
3846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          ? &NativeBackendKWalletStub::RemoveLoginsCreatedBetween
3856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          : &NativeBackendKWalletStub::RemoveLoginsSyncedBetween;
3866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BrowserThread::PostTaskAndReplyWithResult(
3876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      BrowserThread::DB,
3886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      FROM_HERE,
3896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(
3906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          method, base::Unretained(&backend), base::Time(), next_day, &changes),
3916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(&NativeBackendKWalletTest::CheckPasswordChangesWithResult,
3926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 &expected_changes,
3936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 &changes));
3946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RunDBThread();
3956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
3976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  forms.push_back(&form_isc_);
3986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ExpectationArray expected;
3996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_isc_.signon_realm), forms));
4006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
4016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Remove form_isc_.
4036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  expected_changes.clear();
4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  expected_changes.push_back(
4056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      PasswordStoreChange(PasswordStoreChange::REMOVE, form_isc_));
4066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BrowserThread::PostTaskAndReplyWithResult(
4076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      BrowserThread::DB,
4086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      FROM_HERE,
4096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(
4106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          method, base::Unretained(&backend), next_day, base::Time(), &changes),
4116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(&NativeBackendKWalletTest::CheckPasswordChangesWithResult,
4126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 &expected_changes,
4136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 &changes));
4146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RunDBThread();
4156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", ExpectationArray());
4176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)dbus::Response* NativeBackendKWalletTest::KLauncherMethodCall(
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall* method_call, testing::Unused) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("org.kde.KLauncher", method_call->GetInterface());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("start_service_by_desktop_name", method_call->GetMember());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  klauncher_contacted_ = true;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageReader reader(method_call);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string service_name;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> urls;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> envs;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string startup_id;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool blind = false;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(reader.PopString(&service_name));
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(reader.PopArrayOfStrings(&urls));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(reader.PopArrayOfStrings(&envs));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(reader.PopString(&startup_id));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(reader.PopBool(&blind));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("kwalletd", service_name);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(urls.empty());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(envs.empty());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(startup_id.empty());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(blind);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (kwallet_runnable_)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kwallet_running_ = true;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dbus::MessageWriter writer(response.get());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendInt32(klauncher_ret_);
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  writer.AppendString(std::string());  // dbus_name
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendString(klauncher_error_);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendInt32(1234);  // pid
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return response.release();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)dbus::Response* NativeBackendKWalletTest::KWalletMethodCall(
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall* method_call, testing::Unused) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!kwallet_running_)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("org.kde.KWallet", method_call->GetInterface());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<dbus::Response> response;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (method_call->GetMember() == "isEnabled") {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response = dbus::Response::CreateEmpty();
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MessageWriter writer(response.get());
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendBool(kwallet_enabled_);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (method_call->GetMember() == "networkWallet") {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response = dbus::Response::CreateEmpty();
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MessageWriter writer(response.get());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString("test_wallet");  // Should match |open| below.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (method_call->GetMember() == "open") {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wallet_name;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64_t wallet_id;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string app_name;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&wallet_name));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopInt64(&wallet_id));
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&app_name));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("test_wallet", wallet_name);  // Should match |networkWallet|.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response = dbus::Response::CreateEmpty();
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MessageWriter writer(response.get());
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendInt32(1);  // Can be anything but kInvalidKWalletHandle.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (method_call->GetMember() == "hasFolder" ||
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             method_call->GetMember() == "createFolder") {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle = NativeBackendKWalletStub::kInvalidKWalletHandle;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string folder_name;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string app_name;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopInt32(&handle));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&folder_name));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&app_name));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(NativeBackendKWalletStub::kInvalidKWalletHandle, handle);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response = dbus::Response::CreateEmpty();
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MessageWriter writer(response.get());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (method_call->GetMember() == "hasFolder")
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writer.AppendBool(wallet_.hasFolder(folder_name));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writer.AppendBool(wallet_.createFolder(folder_name));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (method_call->GetMember() == "hasEntry" ||
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             method_call->GetMember() == "removeEntry") {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle = NativeBackendKWalletStub::kInvalidKWalletHandle;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string folder_name;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string app_name;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopInt32(&handle));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&folder_name));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&key));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&app_name));
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(NativeBackendKWalletStub::kInvalidKWalletHandle, handle);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response = dbus::Response::CreateEmpty();
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MessageWriter writer(response.get());
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (method_call->GetMember() == "hasEntry")
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writer.AppendBool(wallet_.hasEntry(folder_name, key));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writer.AppendInt32(wallet_.removeEntry(folder_name, key) ? 0 : 1);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (method_call->GetMember() == "entryList") {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle = NativeBackendKWalletStub::kInvalidKWalletHandle;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string folder_name;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string app_name;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopInt32(&handle));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&folder_name));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&app_name));
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(NativeBackendKWalletStub::kInvalidKWalletHandle, handle);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> entries;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wallet_.entryList(folder_name, &entries)) {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response = dbus::Response::CreateEmpty();
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dbus::MessageWriter writer(response.get());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writer.AppendArrayOfStrings(entries);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (method_call->GetMember() == "readEntry") {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle = NativeBackendKWalletStub::kInvalidKWalletHandle;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string folder_name;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string app_name;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopInt32(&handle));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&folder_name));
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&key));
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&app_name));
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(NativeBackendKWalletStub::kInvalidKWalletHandle, handle);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestKWallet::Blob value;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wallet_.readEntry(folder_name, key, &value)) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response = dbus::Response::CreateEmpty();
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dbus::MessageWriter writer(response.get());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writer.AppendArrayOfBytes(value.data(), value.size());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (method_call->GetMember() == "writeEntry") {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(method_call);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handle = NativeBackendKWalletStub::kInvalidKWalletHandle;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string folder_name;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key;
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const uint8_t* bytes = NULL;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t length = 0;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string app_name;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopInt32(&handle));
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&folder_name));
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&key));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopArrayOfBytes(&bytes, &length));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reader.PopString(&app_name));
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(NativeBackendKWalletStub::kInvalidKWalletHandle, handle);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response = dbus::Response::CreateEmpty();
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MessageWriter writer(response.get());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendInt32(
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wallet_.writeEntry(folder_name, key,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           TestKWallet::Blob(bytes, length)) ? 0 : 1);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(response.get() == NULL);
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return response.release();
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeBackendKWalletTest::CheckPasswordForms(
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& folder, const ExpectationArray& sorted_expected) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wallet_.hasFolder(folder));
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> entries;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wallet_.entryList(folder, &entries));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sorted_expected.size(), entries.size());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::sort(entries.begin(), entries.end());
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < entries.size() && i < sorted_expected.size(); ++i) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(sorted_expected[i].first, entries[i]);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestKWallet::Blob value;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(wallet_.readEntry(folder, entries[i], &value));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Pickle pickle(reinterpret_cast<const char*>(value.data()), value.size());
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> forms;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendKWalletStub::DeserializeValue(entries[i], pickle, &forms);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<const PasswordForm*>& expect = sorted_expected[i].second;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expect.size(), forms.size());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t j = 0; j < forms.size() && j < expect.size(); ++j)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CheckPasswordForm(*expect[j], *forms[j]);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&forms);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, NotEnabled) {
598effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub kwallet(42);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kwallet_enabled_ = false;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(kwallet.InitWithBus(mock_session_bus_));
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(klauncher_contacted_);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, NotRunnable) {
605effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub kwallet(42);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kwallet_runnable_ = false;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kwallet_running_ = false;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(kwallet.InitWithBus(mock_session_bus_));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(klauncher_contacted_);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, NotRunningOrEnabled) {
613effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub kwallet(42);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kwallet_running_ = false;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kwallet_enabled_ = false;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(kwallet.InitWithBus(mock_session_bus_));
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(klauncher_contacted_);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, NotRunning) {
621effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub kwallet(42);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kwallet_running_ = false;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(kwallet.InitWithBus(mock_session_bus_));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(klauncher_contacted_);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, BasicStartup) {
628effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub kwallet(42);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(kwallet.InitWithBus(mock_session_bus_));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(klauncher_contacted_);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, BasicAddLogin) {
634effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub backend(42);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDBThread();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(&form_google_);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectationArray expected;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_google_.signon_realm), forms));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, BasicUpdateLogin) {
654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NativeBackendKWalletStub backend(42);
655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserThread::PostTask(
658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunDBThread();
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PasswordForm new_form_google(form_google_);
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_form_google.times_used = 10;
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_form_google.action = GURL("http://www.google.com/different/login");
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Update login
669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PasswordStoreChangeList changes;
670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserThread::PostTask(
671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::UpdateLogin),
673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&backend),
674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 new_form_google,
675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&changes)));
676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunDBThread();
677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, changes.size());
679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(PasswordStoreChange::UPDATE, changes.front().type());
680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(new_form_google, changes.front().form());
681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  forms.push_back(&new_form_google);
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExpectationArray expected;
685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_google_.signon_realm), forms));
686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, BasicListLogins) {
690effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub backend(42);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> form_list;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::IgnoreResult(&NativeBackendKWalletStub::GetAutofillableLogins),
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(&backend), &form_list));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDBThread();
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quick check that we got something back.
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, form_list.size());
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&form_list);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(&form_google_);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectationArray expected;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_google_.signon_realm), forms));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, BasicRemoveLogin) {
721effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub backend(42);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDBThread();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(&form_google_);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectationArray expected;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_google_.signon_realm), forms));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::RemoveLogin),
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDBThread();
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.clear();
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, UpdateNonexistentLogin) {
751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NativeBackendKWalletStub backend(42);
752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // First add an unrelated login.
755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserThread::PostTask(
756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunDBThread();
761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  forms.push_back(&form_google_);
764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExpectationArray expected;
765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_google_.signon_realm), forms));
766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Attempt to update a login that doesn't exist.
769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PasswordStoreChangeList changes;
770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserThread::PostTask(
771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::UpdateLogin),
773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&backend),
774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 form_isc_,
775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&changes)));
776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunDBThread();
778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(PasswordStoreChangeList(), changes);
780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, RemoveNonexistentLogin) {
784effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub backend(42);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First add an unrelated login.
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDBThread();
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(&form_google_);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectationArray expected;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_google_.signon_realm), forms));
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to remove a login that doesn't exist.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::RemoveLogin),
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_isc_));
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we can still get the first form back.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> form_list;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::IgnoreResult(&NativeBackendKWalletStub::GetAutofillableLogins),
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(&backend), &form_list));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDBThread();
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quick check that we got something back.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, form_list.size());
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&form_list);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, AddDuplicateLogin) {
827effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub backend(42);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
830cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PasswordStoreChangeList changes;
831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD,
832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        form_google_));
833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserThread::PostTaskAndReplyWithResult(
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
835cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&NativeBackendKWalletStub::AddLogin,
836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&backend), form_google_),
837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&NativeBackendKWalletTest::CheckPasswordChanges,
838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 changes));
839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  changes.clear();
841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  changes.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE,
842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        form_google_));
843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  form_google_.times_used++;
844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD,
845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        form_google_));
846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserThread::PostTaskAndReplyWithResult(
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&NativeBackendKWalletStub::AddLogin,
850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(&backend), form_google_),
851cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&NativeBackendKWalletTest::CheckPasswordChanges,
852cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 changes));
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDBThread();
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(&form_google_);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectationArray expected;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_google_.signon_realm), forms));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, ListLoginsAppends) {
866effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NativeBackendKWalletStub backend(42);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the same request twice with the same list both times.
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> form_list;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::IgnoreResult(&NativeBackendKWalletStub::GetAutofillableLogins),
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(&backend), &form_list));
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::IgnoreResult(&NativeBackendKWalletStub::GetAutofillableLogins),
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(&backend), &form_list));
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDBThread();
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quick check that we got two results back.
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, form_list.size());
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&form_list);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const PasswordForm*> forms;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(&form_google_);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectationArray expected;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.push_back(make_pair(std::string(form_google_.signon_realm), forms));
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPasswordForms("Chrome Form Data (42)", expected);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, RemoveLoginsCreatedBetween) {
9036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestRemoveLoginsBetween(CREATED);
9046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
905f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
9066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(NativeBackendKWalletTest, RemoveLoginsSyncedBetween) {
9076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestRemoveLoginsBetween(SYNCED);
908f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
909f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
910effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// TODO(mdm): add more basic tests here at some point.
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (For example tests for storing >1 password per realm pickle.)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeBackendKWalletPickleTest : public NativeBackendKWalletTestBase {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
91503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void CreateVersion3Pickle(const PasswordForm& form, Pickle* pickle);
916f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void CreateVersion2Pickle(const PasswordForm& form, Pickle* pickle);
917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void CreateVersion1Pickle(const PasswordForm& form, Pickle* pickle);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateVersion0Pickle(bool size_32,
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const PasswordForm& form,
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            Pickle* pickle);
92103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void CheckVersion3Pickle();
922f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void CheckVersion2Pickle();
923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void CheckVersion1Pickle();
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckVersion0Pickle(bool size_32, PasswordForm::Scheme scheme);
925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
926a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void CreatePickle(bool size_32, const PasswordForm& form, Pickle* pickle);
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void NativeBackendKWalletPickleTest::CreateVersion3Pickle(
93103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const PasswordForm& form, Pickle* pickle) {
93203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteInt(3);
93303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CreatePickle(false, form, pickle);
93403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteInt(form.type);
93503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteInt(form.times_used);
93603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  autofill::SerializeFormData(form.form_data, pickle);
93703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteInt64(form.date_synced.ToInternalValue());
93803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
93903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
940f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void NativeBackendKWalletPickleTest::CreateVersion2Pickle(
941f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const PasswordForm& form, Pickle* pickle) {
942f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pickle->WriteInt(2);
943f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CreatePickle(false, form, pickle);
944f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pickle->WriteInt(form.type);
945f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pickle->WriteInt(form.times_used);
946f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  autofill::SerializeFormData(form.form_data, pickle);
947f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
948f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
949a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NativeBackendKWalletPickleTest::CreateVersion1Pickle(
950a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const PasswordForm& form, Pickle* pickle) {
951a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  pickle->WriteInt(1);
952a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CreatePickle(false, form, pickle);
953a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeBackendKWalletPickleTest::CreateVersion0Pickle(
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool size_32, const PasswordForm& form, Pickle* pickle) {
957a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  pickle->WriteInt(0);
958a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CreatePickle(size_32, form, pickle);
959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
961a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NativeBackendKWalletPickleTest::CreatePickle(
962a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool size_32, const PasswordForm& form, Pickle* pickle) {
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size_32)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pickle->WriteUInt32(1);  // Size of form list. 32 bits.
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pickle->WriteUInt64(1);  // Size of form list. 64 bits.
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteInt(form.scheme);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteString(form.origin.spec());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteString(form.action.spec());
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteString16(form.username_element);
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteString16(form.username_value);
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteString16(form.password_element);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteString16(form.password_value);
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteString16(form.submit_element);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteBool(form.ssl_valid);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteBool(form.preferred);
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteBool(form.blacklisted_by_user);
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle->WriteInt64(form.date_created.ToTimeT());
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void NativeBackendKWalletPickleTest::CheckVersion3Pickle() {
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pickle pickle;
983f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PasswordForm form = form_google_;
98403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Remove the fields which were not present in version #3.
98503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  form.display_name.clear();
98603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  form.avatar_url = GURL();
98703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  form.federation_url = GURL();
98803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  form.is_zero_click = false;
98903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CreateVersion3Pickle(form, &pickle);
99003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
99103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ScopedVector<PasswordForm> form_list;
99203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  NativeBackendKWalletStub::DeserializeValue(form.signon_realm,
99303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                             pickle, &form_list.get());
99403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
99503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(1u, form_list.size());
99603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (form_list.size() > 0)
99703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    CheckPasswordForm(form, *form_list[0]);
99803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
99903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
100003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void NativeBackendKWalletPickleTest::CheckVersion2Pickle() {
100103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Pickle pickle;
100203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PasswordForm form = old_form_google_;
100303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  form.times_used = form_google_.times_used;
100403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  form.type = form_google_.type;
100503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  form.form_data = form_google_.form_data;
1006f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CreateVersion2Pickle(form, &pickle);
1007f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
100803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ScopedVector<PasswordForm> form_list;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendKWalletStub::DeserializeValue(form.signon_realm,
101003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                             pickle, &form_list.get());
1011f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, form_list.size());
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (form_list.size() > 0)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckPasswordForm(form, *form_list[0]);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Make sure that we can still read version 1 pickles.
1018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NativeBackendKWalletPickleTest::CheckVersion1Pickle() {
1019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Pickle pickle;
1020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PasswordForm form = form_google_;
1021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CreateVersion1Pickle(form, &pickle);
1022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::vector<PasswordForm*> form_list;
1024a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NativeBackendKWalletStub::DeserializeValue(form.signon_realm,
1025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             pickle, &form_list);
1026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1027a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This will match |old_form_google_| because not all the fields present in
1028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // |form_google_| will be deserialized.
1029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, form_list.size());
1030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (form_list.size() > 0)
1031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CheckPasswordForm(old_form_google_, *form_list[0]);
1032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  STLDeleteElements(&form_list);
1033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1035f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void NativeBackendKWalletPickleTest::CheckVersion0Pickle(
1036f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    bool size_32, PasswordForm::Scheme scheme) {
1037f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Pickle pickle;
1038f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PasswordForm form = old_form_google_;
1039f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  form.scheme = scheme;
1040f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CreateVersion0Pickle(size_32, form, &pickle);
1041f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<PasswordForm*> form_list;
1042f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NativeBackendKWalletStub::DeserializeValue(form.signon_realm,
1043f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                             pickle, &form_list);
1044f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, form_list.size());
1045f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (form_list.size() > 0)
1046f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    CheckPasswordForm(form, *form_list[0]);
1047f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  STLDeleteElements(&form_list);
1048f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1049f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We try both SCHEME_HTML and SCHEME_BASIC since the scheme is stored right
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after the size in the pickle, so it's what gets read as part of the count
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when reading 32-bit pickles on 64-bit systems. SCHEME_HTML is 0 (so we'll
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// detect errors later) while SCHEME_BASIC is 1 (so we'll detect it then). We
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// try both 32-bit and 64-bit pickles since only one will be the "other" size
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for whatever architecture we're running on, but we want to make sure we can
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// read all combinations in any event.
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletPickleTest, ReadsOld32BitHTMLPickles) {
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckVersion0Pickle(true, PasswordForm::SCHEME_HTML);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletPickleTest, ReadsOld32BitHTTPPickles) {
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckVersion0Pickle(true, PasswordForm::SCHEME_BASIC);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletPickleTest, ReadsOld64BitHTMLPickles) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckVersion0Pickle(false, PasswordForm::SCHEME_HTML);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendKWalletPickleTest, ReadsOld64BitHTTPPickles) {
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckVersion0Pickle(false, PasswordForm::SCHEME_BASIC);
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(NativeBackendKWalletPickleTest, CheckVersion1Pickle) {
1075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CheckVersion1Pickle();
1076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1077f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1078f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(NativeBackendKWalletPickleTest, CheckVersion2Pickle) {
1079f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CheckVersion2Pickle();
1080f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
108103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
108203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(NativeBackendKWalletPickleTest, CheckVersion3Pickle) {
108303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CheckVersion3Pickle();
108403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
1085