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