native_backend_gnome_x_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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 <stdarg.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/native_backend_gnome_x.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using autofill::PasswordForm;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// What follows is a very simple implementation of the subset of the GNOME
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keyring API that we actually use. It gets substituted for the real one by
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockGnomeKeyringLoader, which hooks into the facility normally used to load
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the GNOME Keyring library at runtime to avoid a static dependency on it.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MockKeyringItem {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockKeyringItem() {}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockKeyringItem(const char* keyring,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const std::string& display_name,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const std::string& password)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : keyring(keyring ? keyring : "login"),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_name(display_name),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      password(password) {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ItemAttribute {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ItemAttribute() : type(UINT32), value_uint32(0) {}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit ItemAttribute(uint32_t value)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(UINT32), value_uint32(value) {}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit ItemAttribute(const std::string& value)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(STRING), value_string(value) {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool Equals(const ItemAttribute& x) const {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (type != x.type) return false;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (type == STRING) ? value_string == x.value_string
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              : value_uint32 == x.value_uint32;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum Type { UINT32, STRING } type;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t value_uint32;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string value_string;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, ItemAttribute> attribute_map;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<std::pair<std::string, ItemAttribute> > attribute_query;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Matches(const attribute_query& query) const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The real GNOME Keyring doesn't match empty queries.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (query.empty()) return false;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < query.size(); ++i) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attribute_map::const_iterator match = attributes.find(query[i].first);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (match == attributes.end()) return false;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!match->second.Equals(query[i].second)) return false;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string keyring;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string display_name;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string password;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribute_map attributes;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The list of all keyring items we have stored.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<MockKeyringItem> mock_keyring_items;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool mock_keyring_reject_local_ids = false;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsStringAttribute(const GnomeKeyringPasswordSchema* schema,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& name) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; schema->attributes[i].name; ++i)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == schema->attributes[i].name)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return schema->attributes[i].type == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "Requested type of nonexistent attribute";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gboolean mock_gnome_keyring_is_available() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpointer mock_gnome_keyring_store_password(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GnomeKeyringPasswordSchema* schema,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gchar* keyring,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gchar* display_name,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gchar* password,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GnomeKeyringOperationDoneCallback callback,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpointer data,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GDestroyNotify destroy_data,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_items.push_back(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockKeyringItem(keyring, display_name, password));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockKeyringItem* item = &mock_keyring_items.back();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string keyring_desc =
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyring ? base::StringPrintf("keyring %s", keyring)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              : std::string("default keyring");
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Adding item with origin " << display_name
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << " to " << keyring_desc;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap, destroy_data);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* name;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((name = va_arg(ap, gchar*))) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsStringAttribute(schema, name)) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->attributes[name] =
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          MockKeyringItem::ItemAttribute(va_arg(ap, gchar*));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Adding item attribute " << name
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", value '" << item->attributes[name].value_string << "'";
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item->attributes[name] =
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          MockKeyringItem::ItemAttribute(va_arg(ap, uint32_t));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Adding item attribute " << name
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", value " << item->attributes[name].value_uint32;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As a hack to ease testing migration, make it possible to reject the new
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // format for the app string. This way we can add them easily to migrate.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_reject_local_ids) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockKeyringItem::attribute_map::iterator it =
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        item->attributes.find("application");
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it != item->attributes.end() &&
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        it->second.type == MockKeyringItem::ItemAttribute::STRING &&
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::StringPiece(it->second.value_string).starts_with("chrome-")) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mock_keyring_items.pop_back();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // GnomeKeyringResult, data
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback(GNOME_KEYRING_RESULT_IO_ERROR, data);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GnomeKeyringResult, data
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback(GNOME_KEYRING_RESULT_OK, data);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpointer mock_gnome_keyring_delete_password(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GnomeKeyringPasswordSchema* schema,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GnomeKeyringOperationDoneCallback callback,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpointer data,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GDestroyNotify destroy_data,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockKeyringItem::attribute_query query;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap, destroy_data);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* name;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((name = va_arg(ap, gchar*))) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsStringAttribute(schema, name)) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      query.push_back(make_pair(std::string(name),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          MockKeyringItem::ItemAttribute(va_arg(ap, gchar*))));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Querying with item attribute " << name
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", value '" << query.back().second.value_string << "'";
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      query.push_back(make_pair(std::string(name),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          MockKeyringItem::ItemAttribute(va_arg(ap, uint32_t))));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Querying with item attribute " << name
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", value " << query.back().second.value_uint32;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deleted = false;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = mock_keyring_items.size(); i > 0; --i) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MockKeyringItem* item = &mock_keyring_items[i - 1];
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item->Matches(query)) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Deleting item with origin " <<  item->display_name;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mock_keyring_items.erase(mock_keyring_items.begin() + (i - 1));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deleted = true;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GnomeKeyringResult, data
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback(deleted ? GNOME_KEYRING_RESULT_OK
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   : GNOME_KEYRING_RESULT_NO_MATCH, data);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpointer mock_gnome_keyring_find_itemsv(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GnomeKeyringItemType type,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GnomeKeyringOperationGetListCallback callback,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpointer data,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GDestroyNotify destroy_data,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockKeyringItem::attribute_query query;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap, destroy_data);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* name;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((name = va_arg(ap, gchar*))) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Really a GnomeKeyringAttributeType, but promoted to int through ...
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (va_arg(ap, int) == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      query.push_back(make_pair(std::string(name),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          MockKeyringItem::ItemAttribute(va_arg(ap, gchar*))));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Querying with item attribute " << name
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", value '" << query.back().second.value_string << "'";
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      query.push_back(make_pair(std::string(name),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          MockKeyringItem::ItemAttribute(va_arg(ap, uint32_t))));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Querying with item attribute " << name
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", value " << query.back().second.value_uint32;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find matches and add them to a list of results.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GList* results = NULL;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < mock_keyring_items.size(); ++i) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MockKeyringItem* item = &mock_keyring_items[i];
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (item->Matches(query)) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GnomeKeyringFound* found = new GnomeKeyringFound;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found->keyring = strdup(item->keyring.c_str());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found->item_id = i;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found->attributes = gnome_keyring_attribute_list_new();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (MockKeyringItem::attribute_map::const_iterator it =
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               item->attributes.begin();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           it != item->attributes.end();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ++it) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (it->second.type == MockKeyringItem::ItemAttribute::STRING) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gnome_keyring_attribute_list_append_string(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              found->attributes, it->first.c_str(),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              it->second.value_string.c_str());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gnome_keyring_attribute_list_append_uint32(
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              found->attributes, it->first.c_str(),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              it->second.value_uint32);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found->secret = strdup(item->password.c_str());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      results = g_list_prepend(results, found);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GnomeKeyringResult, GList*, data
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback(results ? GNOME_KEYRING_RESULT_OK
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   : GNOME_KEYRING_RESULT_NO_MATCH, results, data);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now free the list of results.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GList* element = g_list_first(results);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (element) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GnomeKeyringFound* found = static_cast<GnomeKeyringFound*>(element->data);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    free(found->keyring);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gnome_keyring_attribute_list_free(found->attributes);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    free(found->secret);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete found;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    element = g_list_next(element);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_list_free(results);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gchar* mock_gnome_keyring_result_to_message(GnomeKeyringResult res) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "mock keyring simulating failure";
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Inherit to get access to protected fields.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGnomeKeyringLoader : public GnomeKeyringLoader {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool LoadMockGnomeKeyring() {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GNOME_KEYRING_ASSIGN_POINTER(name) \
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gnome_keyring_##name = &mock_gnome_keyring_##name;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_ASSIGN_POINTER)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef GNOME_KEYRING_ASSIGN_POINTER
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    keyring_loaded = true;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reset the state of the mock library.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_keyring_items.clear();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_keyring_reject_local_ids = false;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeBackendGnomeTest : public testing::Test {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendGnomeTest()
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(db_thread_.Start());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockGnomeKeyringLoader::LoadMockGnomeKeyring();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_google_.origin = GURL("http://www.google.com/");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_google_.action = GURL("http://www.google.com/login");
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_google_.username_element = UTF8ToUTF16("user");
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_google_.username_value = UTF8ToUTF16("joeschmoe");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_google_.password_element = UTF8ToUTF16("pass");
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_google_.password_value = UTF8ToUTF16("seekrit");
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_google_.submit_element = UTF8ToUTF16("submit");
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_google_.signon_realm = "Google";
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.origin = GURL("http://www.isc.org/");
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.action = GURL("http://www.isc.org/auth");
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.username_element = UTF8ToUTF16("id");
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.username_value = UTF8ToUTF16("janedoe");
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.password_element = UTF8ToUTF16("passwd");
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.password_value = UTF8ToUTF16("ihazabukkit");
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.submit_element = UTF8ToUTF16("login");
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_isc_.signon_realm = "ISC";
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                           base::MessageLoop::QuitClosure());
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_thread_.Stop();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunBothThreads() {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // First we post a message to the DB thread that will run after all other
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // messages that have been posted to the DB thread (we don't expect more
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to be posted), which posts a message to the UI thread to quit the loop.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That way we can run both loops and be sure that the UI thread loop will
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // quit so we can get on with the rest of the test.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&PostQuitTask, &message_loop_));
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static void PostQuitTask(base::MessageLoop* loop) {
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckUint32Attribute(const MockKeyringItem* item,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& attribute,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            uint32_t value) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockKeyringItem::attribute_map::const_iterator it =
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        item->attributes.find(attribute);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(item->attributes.end(), it);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it != item->attributes.end()) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(MockKeyringItem::ItemAttribute::UINT32, it->second.type);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(value, it->second.value_uint32);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckStringAttribute(const MockKeyringItem* item,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& attribute,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& value) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockKeyringItem::attribute_map::const_iterator it =
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        item->attributes.find(attribute);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(item->attributes.end(), it);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it != item->attributes.end()) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(MockKeyringItem::ItemAttribute::STRING, it->second.type);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(value, it->second.value_string);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckMockKeyringItem(const MockKeyringItem* item,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const PasswordForm& form,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& app_string) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We always add items to the login keyring.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("login", item->keyring);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(form.origin.spec(), item->display_name);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(UTF16ToUTF8(form.password_value), item->password);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(13u, item->attributes.size());
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckStringAttribute(item, "origin_url", form.origin.spec());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckStringAttribute(item, "action_url", form.action.spec());
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckStringAttribute(item, "username_element",
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         UTF16ToUTF8(form.username_element));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckStringAttribute(item, "username_value",
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         UTF16ToUTF8(form.username_value));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckStringAttribute(item, "password_element",
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         UTF16ToUTF8(form.password_element));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckStringAttribute(item, "submit_element",
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         UTF16ToUTF8(form.submit_element));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckStringAttribute(item, "signon_realm", form.signon_realm);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckUint32Attribute(item, "ssl_valid", form.ssl_valid);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckUint32Attribute(item, "preferred", form.preferred);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't check the date created. It varies.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckUint32Attribute(item, "blacklisted_by_user", form.blacklisted_by_user);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckUint32Attribute(item, "scheme", form.scheme);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckStringAttribute(item, "application", app_string);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile_;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Provide some test forms to avoid having to set them up in each test.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordForm form_google_;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordForm form_isc_;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, BasicAddLogin) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend that the migration has already taken place.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendGnome backend(42, profile_.GetPrefs());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  backend.Init();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunBothThreads();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, BasicListLogins) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend that the migration has already taken place.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendGnome backend(42, profile_.GetPrefs());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  backend.Init();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult( &NativeBackendGnome::AddLogin),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> form_list;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(&backend), &form_list));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunBothThreads();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quick check that we got something back.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, form_list.size());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&form_list);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, BasicRemoveLogin) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend that the migration has already taken place.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendGnome backend(42, profile_.GetPrefs());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  backend.Init();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunBothThreads();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin),
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunBothThreads();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, mock_keyring_items.size());
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, RemoveNonexistentLogin) {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend that the migration has already taken place.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendGnome backend(42, profile_.GetPrefs());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  backend.Init();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First add an unrelated login.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunBothThreads();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to remove a login that doesn't exist.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin),
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_isc_));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we can still get the first form back.
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> form_list;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(&backend), &form_list));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunBothThreads();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quick check that we got something back.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, form_list.size());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&form_list);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, AddDuplicateLogin) {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend that the migration has already taken place.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendGnome backend(42, profile_.GetPrefs());
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  backend.Init();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunBothThreads();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, ListLoginsAppends) {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend that the migration has already taken place.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeBackendGnome backend(42, profile_.GetPrefs());
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  backend.Init();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&backend), form_google_));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the same request twice with the same list both times.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PasswordForm*> form_list;
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(&backend), &form_list));
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(&backend), &form_list));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunBothThreads();
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quick check that we got two results back.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, form_list.size());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&form_list);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mdm): add more basic (i.e. non-migration) tests here at some point.
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, DISABLED_MigrateOneLogin) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reject attempts to migrate so we can populate the store.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_reject_local_ids = true;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&backend), form_google_));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we can get the form back even when migration is failing.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> form_list;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(&backend), &form_list));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Quick check that we got something back.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, form_list.size());
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&form_list);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now allow the migration.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_reject_local_ids = false;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This should not trigger migration because there will be no results.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> form_list;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&NativeBackendGnome::GetBlacklistLogins),
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&backend), &form_list));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that we got nothing back.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0u, form_list.size());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&form_list);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the keyring is unmodified.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we haven't set the persistent preference.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId));
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the migration by looking something up.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> form_list;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(&backend), &form_list));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Quick check that we got something back.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, form_list.size());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&form_list);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, mock_keyring_items.size());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 1)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we have set the persistent preference.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, DISABLED_MigrateToMultipleProfiles) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reject attempts to migrate so we can populate the store.
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_reject_local_ids = true;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&backend), form_google_));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now allow the migration.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_reject_local_ids = false;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the migration by looking something up.
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> form_list;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(&backend), &form_list));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Quick check that we got something back.
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, form_list.size());
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&form_list);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, mock_keyring_items.size());
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 1)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we have set the persistent preference.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normally we'd actually have a different profile. But in the test just reset
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the profile's persistent pref; we pass in the local profile id anyway.
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(24, profile_.GetPrefs());
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the migration by looking something up.
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> form_list;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(&backend), &form_list));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Quick check that we got something back.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, form_list.size());
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&form_list);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3u, mock_keyring_items.size());
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 1)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 2)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24");
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, DISABLED_NoMigrationWithPrefSet) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reject attempts to migrate so we can populate the store.
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_reject_local_ids = true;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&backend), form_google_));
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now allow migration, but also pretend that the it has already taken place.
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_reject_local_ids = false;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the migration by adding a new login.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&backend), form_isc_));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Look up all logins; we expect only the one we added.
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> form_list;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(&backend), &form_list));
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Quick check that we got the right thing back.
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, form_list.size());
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (form_list.size() > 0)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(form_isc_.signon_realm, form_list[0]->signon_realm);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&form_list);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, mock_keyring_items.size());
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 1)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[1], form_isc_, "chrome-42");
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NativeBackendGnomeTest, DISABLED_DeleteMigratedPasswordIsIsolated) {
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reject attempts to migrate so we can populate the store.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_reject_local_ids = true;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&backend), form_google_));
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, mock_keyring_items.size());
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now allow the migration.
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_keyring_reject_local_ids = false;
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(42, profile_.GetPrefs());
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the migration by looking something up.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> form_list;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(&backend), &form_list));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Quick check that we got something back.
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, form_list.size());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&form_list);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, mock_keyring_items.size());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 0)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mock_keyring_items.size() > 1)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we have set the persistent preference.
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId));
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normally we'd actually have a different profile. But in the test just reset
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the profile's persistent pref; we pass in the local profile id anyway.
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false);
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeBackendGnome backend(24, profile_.GetPrefs());
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend.Init();
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the migration by looking something up.
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PasswordForm*> form_list;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(&backend), &form_list));
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Quick check that we got something back.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1u, form_list.size());
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteElements(&form_list);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There should be three passwords now.
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3u, mock_keyring_items.size());
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mock_keyring_items.size() > 0)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mock_keyring_items.size() > 1)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mock_keyring_items.size() > 2)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24");
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now delete the password from this second profile.
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin),
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&backend), form_google_));
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunBothThreads();
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The other two copies of the password in different profiles should remain.
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2u, mock_keyring_items.size());
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mock_keyring_items.size() > 0)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mock_keyring_items.size() > 1)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
907