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