autofill_profile_syncable_service_unittest.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
143d1fd449f1a0ac9d9dafa0b9569bb6b2e976198Anton Korobeynikov// Copyright 2014 The Chromium Authors. All rights reserved. 2e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman// Use of this source code is governed by a BSD-style license that can be 3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// found in the LICENSE file. 4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell 5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner#include "base/location.h" 6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner#include "base/message_loop/message_loop.h" 7e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman#include "base/strings/utf_string_conversions.h" 8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell#include "components/autofill/core/browser/autofill_profile.h" 97e70829632f82de15db187845666aaca6e04b792Chris Lattner#include "components/autofill/core/browser/webdata/autofill_change.h" 107e70829632f82de15db187845666aaca6e04b792Chris Lattner#include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h" 1147e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner#include "sync/api/sync_error_factory.h" 127e70829632f82de15db187845666aaca6e04b792Chris Lattner#include "sync/api/sync_error_factory_mock.h" 137e70829632f82de15db187845666aaca6e04b792Chris Lattner#include "sync/protocol/sync.pb.h" 147e70829632f82de15db187845666aaca6e04b792Chris Lattner#include "testing/gmock/include/gmock/gmock.h" 157e70829632f82de15db187845666aaca6e04b792Chris Lattner#include "testing/gtest/include/gtest/gtest.h" 167e70829632f82de15db187845666aaca6e04b792Chris Lattner 177e70829632f82de15db187845666aaca6e04b792Chris Lattnernamespace autofill { 187e70829632f82de15db187845666aaca6e04b792Chris Lattner 197e70829632f82de15db187845666aaca6e04b792Chris Lattnerusing ::testing::_; 207e70829632f82de15db187845666aaca6e04b792Chris Lattnerusing ::testing::DoAll; 21094aa6ce47f0f0604469e0a24bde131ce6326938Nick Lewyckyusing ::testing::Eq; 22a1cb4737b04a92f57b1b9dcd8a24c68db5035401Chris Lattnerusing ::testing::Return; 237e70829632f82de15db187845666aaca6e04b792Chris Lattnerusing ::testing::Property; 247e70829632f82de15db187845666aaca6e04b792Chris Lattnerusing base::ASCIIToUTF16; 2547e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner 267e70829632f82de15db187845666aaca6e04b792Chris Lattnernamespace { 277e70829632f82de15db187845666aaca6e04b792Chris Lattner 287e70829632f82de15db187845666aaca6e04b792Chris Lattner// Some guids for testing. 297e70829632f82de15db187845666aaca6e04b792Chris Lattnerconst char kGuid1[] = "EDC609ED-7EEE-4F27-B00C-423242A9C44B"; 307e70829632f82de15db187845666aaca6e04b792Chris Lattnerconst char kGuid2[] = "EDC609ED-7EEE-4F27-B00C-423242A9C44C"; 317e70829632f82de15db187845666aaca6e04b792Chris Lattnerconst char kGuid3[] = "EDC609ED-7EEE-4F27-B00C-423242A9C44D"; 327e70829632f82de15db187845666aaca6e04b792Chris Lattnerconst char kGuid4[] = "EDC609ED-7EEE-4F27-B00C-423242A9C44E"; 337e70829632f82de15db187845666aaca6e04b792Chris Lattnerconst char kHttpOrigin[] = "http://www.example.com/"; 347e70829632f82de15db187845666aaca6e04b792Chris Lattnerconst char kHttpsOrigin[] = "https://www.example.com/"; 357e70829632f82de15db187845666aaca6e04b792Chris Lattnerconst char kSettingsOrigin[] = "Chrome settings"; 367e70829632f82de15db187845666aaca6e04b792Chris Lattner 377e70829632f82de15db187845666aaca6e04b792Chris Lattnerclass MockAutofillProfileSyncableService 381ff4ed726bb8526d1e49030245365f8c86a8bb49Anton Korobeynikov : public AutofillProfileSyncableService { 391ff4ed726bb8526d1e49030245365f8c86a8bb49Anton Korobeynikov public: 407e70829632f82de15db187845666aaca6e04b792Chris Lattner MockAutofillProfileSyncableService() {} 4143d1fd449f1a0ac9d9dafa0b9569bb6b2e976198Anton Korobeynikov virtual ~MockAutofillProfileSyncableService() {} 42803f03e217ec25cf71b2b6dea65da2e377527b6bChris Lattner 437e70829632f82de15db187845666aaca6e04b792Chris Lattner using AutofillProfileSyncableService::DataBundle; 44d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke using AutofillProfileSyncableService::set_sync_processor; 45d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke using AutofillProfileSyncableService::CreateData; 467e70829632f82de15db187845666aaca6e04b792Chris Lattner 477e70829632f82de15db187845666aaca6e04b792Chris Lattner MOCK_METHOD1(LoadAutofillData, bool(std::vector<AutofillProfile*>*)); 487e70829632f82de15db187845666aaca6e04b792Chris Lattner MOCK_METHOD1(SaveChangesToWebData, 49fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman bool(const AutofillProfileSyncableService::DataBundle&)); 50fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman}; 51fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 527e70829632f82de15db187845666aaca6e04b792Chris LattnerACTION_P(CopyData, data) { 53fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman arg0->resize(data->size()); 547e70829632f82de15db187845666aaca6e04b792Chris Lattner std::copy(data->begin(), data->end(), arg0->begin()); 557e70829632f82de15db187845666aaca6e04b792Chris Lattner} 567e70829632f82de15db187845666aaca6e04b792Chris Lattner 577e70829632f82de15db187845666aaca6e04b792Chris LattnerMATCHER_P(CheckSyncChanges, n_sync_changes_list, "") { 587e70829632f82de15db187845666aaca6e04b792Chris Lattner if (arg.size() != n_sync_changes_list.size()) 597e70829632f82de15db187845666aaca6e04b792Chris Lattner return false; 607e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChangeList::const_iterator passed, expected; 61fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman for (passed = arg.begin(), expected = n_sync_changes_list.begin(); 627e70829632f82de15db187845666aaca6e04b792Chris Lattner passed != arg.end() && expected != n_sync_changes_list.end(); 63c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif ++passed, ++expected) { 64c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif DCHECK(passed->IsValid()); 65c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif if (passed->change_type() != expected->change_type()) 66fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman return false; 67fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman if (passed->sync_data().GetSpecifics().SerializeAsString() != 68fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman expected->sync_data().GetSpecifics().SerializeAsString()) { 69c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif return false; 70c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif } 71c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif } 72fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman return true; 73fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman} 74c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 75bca81448ac8e19c588c9a4ad16fc70732b76327cChris LattnerMATCHER_P(DataBundleCheck, n_bundle, "") { 76c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif if ((arg.profiles_to_delete.size() != n_bundle.profiles_to_delete.size()) || 77c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif (arg.profiles_to_update.size() != n_bundle.profiles_to_update.size()) || 78bca81448ac8e19c588c9a4ad16fc70732b76327cChris Lattner (arg.profiles_to_add.size() != n_bundle.profiles_to_add.size())) 79c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif return false; 80c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif for (size_t i = 0; i < arg.profiles_to_delete.size(); ++i) { 81c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif if (arg.profiles_to_delete[i] != n_bundle.profiles_to_delete[i]) 82c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif return false; 83c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif } 84c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif for (size_t i = 0; i < arg.profiles_to_update.size(); ++i) { 85c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif if (*arg.profiles_to_update[i] != *n_bundle.profiles_to_update[i]) 86c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif return false; 87c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif } 88c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif for (size_t i = 0; i < arg.profiles_to_add.size(); ++i) { 89c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif if (*arg.profiles_to_add[i] != *n_bundle.profiles_to_add[i]) 90c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif return false; 91c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif } 92c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif return true; 93c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif} 94c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 95c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greifclass MockSyncChangeProcessor : public syncer::SyncChangeProcessor { 96c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif public: 97c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif MockSyncChangeProcessor() {} 98c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif virtual ~MockSyncChangeProcessor() {} 99c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 100c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif MOCK_METHOD2(ProcessSyncChanges, 101c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif syncer::SyncError(const tracked_objects::Location&, 102fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman const syncer::SyncChangeList&)); 103fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) 104b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif const OVERRIDE { return syncer::SyncDataList(); } 105b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif}; 106fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 107fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass TestSyncChangeProcessor : public syncer::SyncChangeProcessor { 108b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif public: 109fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman TestSyncChangeProcessor() {} 110fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman virtual ~TestSyncChangeProcessor() {} 1117e70829632f82de15db187845666aaca6e04b792Chris Lattner 112eb4ab60bed82d15651bf77ae68ad266ec0eeae9dBill Wendling virtual syncer::SyncError ProcessSyncChanges( 113eb4ab60bed82d15651bf77ae68ad266ec0eeae9dBill Wendling const tracked_objects::Location& location, 114b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif const syncer::SyncChangeList& changes) OVERRIDE { 115eb4ab60bed82d15651bf77ae68ad266ec0eeae9dBill Wendling changes_ = changes; 116eb4ab60bed82d15651bf77ae68ad266ec0eeae9dBill Wendling return syncer::SyncError(); 1177e70829632f82de15db187845666aaca6e04b792Chris Lattner } 1187e70829632f82de15db187845666aaca6e04b792Chris Lattner 119b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const 120b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif OVERRIDE { 121b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif return syncer::SyncDataList(); 122b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif } 123b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif 124b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif const syncer::SyncChangeList& changes() { return changes_; } 125b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif 126b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif private: 127b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif syncer::SyncChangeList changes_; 128b141e397d52d9946e93f84c65c6b2e653b026041Gabor Greif}; 129fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman 130fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman// Returns a profile with all fields set. Contains identical data to the data 131fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman// returned from ConstructCompleteSyncData(). 132fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanscoped_ptr<AutofillProfile> ConstructCompleteProfile() { 133fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman scoped_ptr<AutofillProfile> profile( 1347e70829632f82de15db187845666aaca6e04b792Chris Lattner new AutofillProfile(kGuid1, kHttpsOrigin)); 1357e70829632f82de15db187845666aaca6e04b792Chris Lattner 1367e70829632f82de15db187845666aaca6e04b792Chris Lattner std::vector<base::string16> names; 1377e70829632f82de15db187845666aaca6e04b792Chris Lattner names.push_back(ASCIIToUTF16("John K. Doe")); 1387e70829632f82de15db187845666aaca6e04b792Chris Lattner names.push_back(ASCIIToUTF16("Jane Luise Smith")); 1397e70829632f82de15db187845666aaca6e04b792Chris Lattner profile->SetRawMultiInfo(NAME_FULL, names); 1407e70829632f82de15db187845666aaca6e04b792Chris Lattner 1417e70829632f82de15db187845666aaca6e04b792Chris Lattner std::vector<base::string16> emails; 142a1cb4737b04a92f57b1b9dcd8a24c68db5035401Chris Lattner emails.push_back(ASCIIToUTF16("user@example.com")); 1430d219edad2fd5e7b400ecd49ac833a7a3199af60Chris Lattner emails.push_back(ASCIIToUTF16("superuser@example.org")); 144e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman profile->SetRawMultiInfo(EMAIL_ADDRESS, emails); 145ccaa6540fc2866ab36f6ebecf6df101f613f8aa7Ted Kremenek 1467e70829632f82de15db187845666aaca6e04b792Chris Lattner std::vector<base::string16> phones; 1470d219edad2fd5e7b400ecd49ac833a7a3199af60Chris Lattner phones.push_back(ASCIIToUTF16("1.800.555.1234")); 148a1cb4737b04a92f57b1b9dcd8a24c68db5035401Chris Lattner phones.push_back(ASCIIToUTF16("1.866.650.0000")); 1492c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, phones); 1502c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman 151a1cb4737b04a92f57b1b9dcd8a24c68db5035401Chris Lattner profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, 152a1cb4737b04a92f57b1b9dcd8a24c68db5035401Chris Lattner ASCIIToUTF16("123 Fake St.\n" 15332862da7c7107d792d25a885f9bd2d0402ae7126Chris Lattner "Apt. 42")); 1547e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(ASCIIToUTF16("123 Fake St."), 155066075030ad46b3494480a5f79f05443f947aca7Nick Lewycky profile->GetRawInfo(ADDRESS_HOME_LINE1)); 1562c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman EXPECT_EQ(ASCIIToUTF16("Apt. 42"), profile->GetRawInfo(ADDRESS_HOME_LINE2)); 1572c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman 1582c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Google, Inc.")); 1592c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Mountain View")); 1602c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("California")); 1612c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("94043")); 1622c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US")); 1632c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->SetRawInfo(ADDRESS_HOME_SORTING_CODE, ASCIIToUTF16("CEDEX")); 1642c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, 1652c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman ASCIIToUTF16("Santa Clara")); 1662c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman profile->set_language_code("en"); 1672c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman return profile.Pass(); 1682c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman} 1692c8a1522dbe6f14b728e83b9c555bef27233cc91Dan Gohman 1707e70829632f82de15db187845666aaca6e04b792Chris Lattner// Returns SyncData with all Autofill profile fields set. Contains identical 1717e70829632f82de15db187845666aaca6e04b792Chris Lattner// data to the data returned from ConstructCompleteProfile(). 1727e70829632f82de15db187845666aaca6e04b792Chris Lattnersyncer::SyncData ConstructCompleteSyncData() { 17333adbcc87d92c6c3e620870c804f4a2533ecc850Vikram S. Adve sync_pb::EntitySpecifics entity_specifics; 1747e70829632f82de15db187845666aaca6e04b792Chris Lattner sync_pb::AutofillProfileSpecifics* specifics = 1757e70829632f82de15db187845666aaca6e04b792Chris Lattner entity_specifics.mutable_autofill_profile(); 1767e70829632f82de15db187845666aaca6e04b792Chris Lattner 1777e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_guid(kGuid1); 1787e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_origin(kHttpsOrigin); 1797e70829632f82de15db187845666aaca6e04b792Chris Lattner 1807e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_name_first("John"); 1817e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_name_middle("K."); 1827e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_name_last("Doe"); 1837e70829632f82de15db187845666aaca6e04b792Chris Lattner 1847e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_name_first("Jane"); 1857e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_name_middle("Luise"); 1867e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_name_last("Smith"); 1877e70829632f82de15db187845666aaca6e04b792Chris Lattner 1887e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_email_address("user@example.com"); 1897e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_email_address("superuser@example.org"); 1907e70829632f82de15db187845666aaca6e04b792Chris Lattner 1917e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_phone_home_whole_number("1.800.555.1234"); 1927e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->add_phone_home_whole_number("1.866.650.0000"); 1937e70829632f82de15db187845666aaca6e04b792Chris Lattner 1947e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_line1("123 Fake St."); 1957e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_line2("Apt. 42"); 1967e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_street_address("123 Fake St.\n" 1977e70829632f82de15db187845666aaca6e04b792Chris Lattner "Apt. 42"); 1987e70829632f82de15db187845666aaca6e04b792Chris Lattner 1997e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_company_name("Google, Inc."); 200e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman specifics->set_address_home_city("Mountain View"); 2017e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_state("California"); 2027e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_zip("94043"); 2037e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_country("US"); 2047e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_sorting_code("CEDEX"); 2057e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_dependent_locality("Santa Clara"); 2067e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics->set_address_home_language_code("en"); 2077e70829632f82de15db187845666aaca6e04b792Chris Lattner 2087e70829632f82de15db187845666aaca6e04b792Chris Lattner return syncer::SyncData::CreateLocalData(kGuid1, kGuid1, entity_specifics); 2097e70829632f82de15db187845666aaca6e04b792Chris Lattner} 2107e70829632f82de15db187845666aaca6e04b792Chris Lattner 2117e70829632f82de15db187845666aaca6e04b792Chris Lattner} // namespace 2127e70829632f82de15db187845666aaca6e04b792Chris Lattner 2135c5f5a2ec2dd49bd3049fa0a55aca4956fc56ff2Chris Lattnerclass AutofillProfileSyncableServiceTest : public testing::Test { 2147e70829632f82de15db187845666aaca6e04b792Chris Lattner public: 2157e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfileSyncableServiceTest() {} 2167e70829632f82de15db187845666aaca6e04b792Chris Lattner 2177e70829632f82de15db187845666aaca6e04b792Chris Lattner virtual void SetUp() OVERRIDE { 2187e70829632f82de15db187845666aaca6e04b792Chris Lattner sync_processor_.reset(new MockSyncChangeProcessor); 2197e70829632f82de15db187845666aaca6e04b792Chris Lattner } 2207e70829632f82de15db187845666aaca6e04b792Chris Lattner 2217e70829632f82de15db187845666aaca6e04b792Chris Lattner // Wrapper around AutofillProfileSyncableService::MergeDataAndStartSyncing() 2227e70829632f82de15db187845666aaca6e04b792Chris Lattner // that also verifies expectations. 2237e70829632f82de15db187845666aaca6e04b792Chris Lattner void MergeDataAndStartSyncing( 2247e70829632f82de15db187845666aaca6e04b792Chris Lattner const std::vector<AutofillProfile*>& profiles_from_web_db, 2257e70829632f82de15db187845666aaca6e04b792Chris Lattner const syncer::SyncDataList& data_list, 2267e70829632f82de15db187845666aaca6e04b792Chris Lattner const MockAutofillProfileSyncableService::DataBundle& expected_bundle, 2277e70829632f82de15db187845666aaca6e04b792Chris Lattner const syncer::SyncChangeList& expected_change_list) { 2287e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_CALL(autofill_syncable_service_, LoadAutofillData(_)) 2297e70829632f82de15db187845666aaca6e04b792Chris Lattner .Times(1) 2307e70829632f82de15db187845666aaca6e04b792Chris Lattner .WillOnce(DoAll(CopyData(&profiles_from_web_db), Return(true))); 2317e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_CALL(autofill_syncable_service_, 2322cca3008e86aa5448a629c744064daecb531bf94Chris Lattner SaveChangesToWebData(DataBundleCheck(expected_bundle))) 2332cca3008e86aa5448a629c744064daecb531bf94Chris Lattner .Times(1) 2342cca3008e86aa5448a629c744064daecb531bf94Chris Lattner .WillOnce(Return(true)); 2352cca3008e86aa5448a629c744064daecb531bf94Chris Lattner if (expected_change_list.empty()) { 23671be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos EXPECT_CALL(*sync_processor_, ProcessSyncChanges(_, _)).Times(0); 23771be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos } else { 23871be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos ON_CALL(*sync_processor_, ProcessSyncChanges(_, _)) 23971be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos .WillByDefault(Return(syncer::SyncError())); 24071be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos EXPECT_CALL(*sync_processor_, 24171be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos ProcessSyncChanges(_, CheckSyncChanges(expected_change_list))) 24271be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos .Times(1) 24371be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos .WillOnce(Return(syncer::SyncError())); 24471be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos } 24571be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos 24671be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos // Takes ownership of sync_processor_. 24771be6db3efd233ae7eafe3e23ad9d9ac70bf0706Alkis Evlogimenos autofill_syncable_service_.MergeDataAndStartSyncing( 248cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman syncer::AUTOFILL_PROFILE, data_list, 249cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman sync_processor_.PassAs<syncer::SyncChangeProcessor>(), 250cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman scoped_ptr<syncer::SyncErrorFactory>( 251cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman new syncer::SyncErrorFactoryMock())); 252cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman } 253cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman 254cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman protected: 255cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman base::MessageLoop message_loop_; 256cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman MockAutofillProfileSyncableService autofill_syncable_service_; 257cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman scoped_ptr<MockSyncChangeProcessor> sync_processor_; 258cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman}; 259cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman 260cb647519d34184fe41aa7e072076ae70634bc3d7Nate BegemanTEST_F(AutofillProfileSyncableServiceTest, MergeDataAndStartSyncing) { 261cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman std::vector<AutofillProfile*> profiles_from_web_db; 262cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman std::string guid_present1 = kGuid1; 263cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman std::string guid_present2 = kGuid2; 264cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman std::string guid_synced1 = kGuid3; 265cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman std::string guid_synced2 = kGuid4; 266cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman std::string origin_present1 = kHttpOrigin; 267cb647519d34184fe41aa7e072076ae70634bc3d7Nate Begeman std::string origin_present2 = std::string(); 268011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner std::string origin_synced1 = kHttpsOrigin; 269011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner std::string origin_synced2 = kSettingsOrigin; 270011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner 271011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner profiles_from_web_db.push_back( 272011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner new AutofillProfile(guid_present1, origin_present1)); 273011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 274011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1, 275e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman ASCIIToUTF16("1 1st st")); 276011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner profiles_from_web_db.push_back( 277011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner new AutofillProfile(guid_present2, origin_present2)); 278011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, ASCIIToUTF16("Tom")); 279011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1, 280011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner ASCIIToUTF16("2 2nd st")); 281011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner 282e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman syncer::SyncDataList data_list; 283011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner AutofillProfile profile1(guid_synced1, origin_synced1); 284011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner profile1.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jane")); 285011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner data_list.push_back(autofill_syncable_service_.CreateData(profile1)); 286011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner AutofillProfile profile2(guid_synced2, origin_synced2); 287011ce8d2e401855877803fb6d972a6f6c22242a5Chris Lattner profile2.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Harry")); 2887e70829632f82de15db187845666aaca6e04b792Chris Lattner data_list.push_back(autofill_syncable_service_.CreateData(profile2)); 2897e70829632f82de15db187845666aaca6e04b792Chris Lattner // This one will have the name and origin updated. 2907e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile3(guid_present2, origin_synced2); 2916de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner profile3.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Tom Doe")); 2926de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner data_list.push_back(autofill_syncable_service_.CreateData(profile3)); 2936de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner 2946de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner syncer::SyncChangeList expected_change_list; 2956de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner expected_change_list.push_back( 2966de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner syncer::SyncChange(FROM_HERE, 2976de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner syncer::SyncChange::ACTION_ADD, 2986de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner MockAutofillProfileSyncableService::CreateData( 2996de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner *profiles_from_web_db.front()))); 300e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman 301e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman MockAutofillProfileSyncableService::DataBundle expected_bundle; 3026de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner expected_bundle.profiles_to_add.push_back(&profile1); 303e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman expected_bundle.profiles_to_add.push_back(&profile2); 3046de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner expected_bundle.profiles_to_update.push_back(&profile3); 3056de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner 3066de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner MergeDataAndStartSyncing( 3076de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner profiles_from_web_db, data_list, expected_bundle, expected_change_list); 308e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 309e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman} 3106de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner 3117e70829632f82de15db187845666aaca6e04b792Chris LattnerTEST_F(AutofillProfileSyncableServiceTest, MergeIdenticalProfiles) { 3127e70829632f82de15db187845666aaca6e04b792Chris Lattner std::vector<AutofillProfile*> profiles_from_web_db; 3136de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner std::string guid_present1 = kGuid1; 31447e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner std::string guid_present2 = kGuid2; 31547e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner std::string guid_synced1 = kGuid3; 31647e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner std::string guid_synced2 = kGuid4; 31747e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner std::string origin_present1 = kHttpOrigin; 31847e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner std::string origin_present2 = kSettingsOrigin; 319c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif std::string origin_synced1 = kHttpsOrigin; 320c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif std::string origin_synced2 = kHttpsOrigin; 321c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 322e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman profiles_from_web_db.push_back( 323e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman new AutofillProfile(guid_present1, origin_present1)); 3246de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 325e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1, 326c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif ASCIIToUTF16("1 1st st")); 3276de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner profiles_from_web_db.push_back( 3287e70829632f82de15db187845666aaca6e04b792Chris Lattner new AutofillProfile(guid_present2, origin_present2)); 3297e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, ASCIIToUTF16("Tom")); 3307e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1, 3319ff0f0ea39ea71d33887584d10c88dda2038285bDan Gohman ASCIIToUTF16("2 2nd st")); 3329ff0f0ea39ea71d33887584d10c88dda2038285bDan Gohman 3339ff0f0ea39ea71d33887584d10c88dda2038285bDan Gohman // The synced profiles are identical to the local ones, except that the guids 3349ff0f0ea39ea71d33887584d10c88dda2038285bDan Gohman // are different. 3359ff0f0ea39ea71d33887584d10c88dda2038285bDan Gohman syncer::SyncDataList data_list; 3369ff0f0ea39ea71d33887584d10c88dda2038285bDan Gohman AutofillProfile profile1(guid_synced1, origin_synced1); 3377e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 3387e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1 1st st")); 3397e70829632f82de15db187845666aaca6e04b792Chris Lattner data_list.push_back(autofill_syncable_service_.CreateData(profile1)); 3407e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile2(guid_synced2, origin_synced2); 3417e70829632f82de15db187845666aaca6e04b792Chris Lattner profile2.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Tom")); 3427e70829632f82de15db187845666aaca6e04b792Chris Lattner profile2.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("2 2nd st")); 3437e70829632f82de15db187845666aaca6e04b792Chris Lattner data_list.push_back(autofill_syncable_service_.CreateData(profile2)); 3447e70829632f82de15db187845666aaca6e04b792Chris Lattner 3457e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile expected_profile(profile2); 3467e70829632f82de15db187845666aaca6e04b792Chris Lattner expected_profile.set_origin(kSettingsOrigin); 3474a9f9337511441af0624e754ad9b2b1262ee584dAnand Shukla syncer::SyncChangeList expected_change_list; 3484a9f9337511441af0624e754ad9b2b1262ee584dAnand Shukla expected_change_list.push_back( 3497e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange(FROM_HERE, 350c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif syncer::SyncChange::ACTION_UPDATE, 3516de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner MockAutofillProfileSyncableService::CreateData( 3526de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner expected_profile))); 3536de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner 3546de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner MockAutofillProfileSyncableService::DataBundle expected_bundle; 3557e70829632f82de15db187845666aaca6e04b792Chris Lattner expected_bundle.profiles_to_delete.push_back(guid_present1); 3567e70829632f82de15db187845666aaca6e04b792Chris Lattner expected_bundle.profiles_to_delete.push_back(guid_present2); 3572cca3008e86aa5448a629c744064daecb531bf94Chris Lattner expected_bundle.profiles_to_add.push_back(&profile1); 3586de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner expected_bundle.profiles_to_add.push_back(&expected_profile); 359e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman 360e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman MergeDataAndStartSyncing( 3616de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner profiles_from_web_db, data_list, expected_bundle, expected_change_list); 3626de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 363e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman} 3646de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner 3656de84985a434bfd6e55323ad5cd9959d15aa554aChris LattnerTEST_F(AutofillProfileSyncableServiceTest, MergeSimilarProfiles) { 3666de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner std::vector<AutofillProfile*> profiles_from_web_db; 367e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman std::string guid_present1 = kGuid1; 3686de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner std::string guid_present2 = kGuid2; 3696de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner std::string guid_synced1 = kGuid3; 3706de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner std::string guid_synced2 = kGuid4; 371e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman std::string origin_present1 = kHttpOrigin; 3726de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner std::string origin_present2 = kSettingsOrigin; 3736de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner std::string origin_synced1 = kHttpsOrigin; 3747e70829632f82de15db187845666aaca6e04b792Chris Lattner std::string origin_synced2 = kHttpsOrigin; 3752cca3008e86aa5448a629c744064daecb531bf94Chris Lattner 3767e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db.push_back( 3777e70829632f82de15db187845666aaca6e04b792Chris Lattner new AutofillProfile(guid_present1, origin_present1)); 3787e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 3796de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1, 3807e70829632f82de15db187845666aaca6e04b792Chris Lattner ASCIIToUTF16("1 1st st")); 3812cca3008e86aa5448a629c744064daecb531bf94Chris Lattner profiles_from_web_db.push_back( 3822cca3008e86aa5448a629c744064daecb531bf94Chris Lattner new AutofillProfile(guid_present2, origin_present2)); 3837e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, ASCIIToUTF16("Tom")); 3846de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1, 3857e70829632f82de15db187845666aaca6e04b792Chris Lattner ASCIIToUTF16("2 2nd st")); 3867e70829632f82de15db187845666aaca6e04b792Chris Lattner 3877e70829632f82de15db187845666aaca6e04b792Chris Lattner // The synced profiles are identical to the local ones, except that the guids 3887e70829632f82de15db187845666aaca6e04b792Chris Lattner // are different. 3897e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncDataList data_list; 3907e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile1(guid_synced1, origin_synced1); 3917e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 3927e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1 1st st")); 3937e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Frobbers, Inc.")); 3947e70829632f82de15db187845666aaca6e04b792Chris Lattner data_list.push_back(autofill_syncable_service_.CreateData(profile1)); 3957e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile2(guid_synced2, origin_synced2); 3967e70829632f82de15db187845666aaca6e04b792Chris Lattner profile2.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Tom")); 397c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet profile2.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("2 2nd st")); 3987e70829632f82de15db187845666aaca6e04b792Chris Lattner profile2.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Fizzbang, LLC.")); 3997e70829632f82de15db187845666aaca6e04b792Chris Lattner data_list.push_back(autofill_syncable_service_.CreateData(profile2)); 4007e70829632f82de15db187845666aaca6e04b792Chris Lattner 401c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet // The first profile should have its origin updated. 4027e70829632f82de15db187845666aaca6e04b792Chris Lattner // The second profile should remain as-is, because an unverified profile 4037e70829632f82de15db187845666aaca6e04b792Chris Lattner // should never overwrite a verified one. 4047e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile expected_profile(profile1); 405d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman expected_profile.set_origin(origin_present1); 4067e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChangeList expected_change_list; 4077e70829632f82de15db187845666aaca6e04b792Chris Lattner expected_change_list.push_back( 4087e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange(FROM_HERE, 4097e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange::ACTION_ADD, 410a2769a33c94f021a609a462b28ebea069eba6f74Misha Brukman MockAutofillProfileSyncableService::CreateData( 411a2769a33c94f021a609a462b28ebea069eba6f74Misha Brukman *profiles_from_web_db.back()))); 412c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet expected_change_list.push_back( 413c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet syncer::SyncChange(FROM_HERE, 4147e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange::ACTION_UPDATE, 41547e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner MockAutofillProfileSyncableService::CreateData( 416c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet expected_profile))); 4177e70829632f82de15db187845666aaca6e04b792Chris Lattner 4187e70829632f82de15db187845666aaca6e04b792Chris Lattner MockAutofillProfileSyncableService::DataBundle expected_bundle; 419c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet expected_bundle.profiles_to_delete.push_back(guid_present1); 4207e70829632f82de15db187845666aaca6e04b792Chris Lattner expected_bundle.profiles_to_add.push_back(&expected_profile); 421c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet expected_bundle.profiles_to_add.push_back(&profile2); 4227e70829632f82de15db187845666aaca6e04b792Chris Lattner 4237e70829632f82de15db187845666aaca6e04b792Chris Lattner MergeDataAndStartSyncing( 4247e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db, data_list, expected_bundle, expected_change_list); 4253ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 426085a9ebbc705c6e7d3fd8c692ef1c46fdfb885ceMisha Brukman} 4273ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner 4283ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner// Ensure that no Sync events are generated to fill in missing origins from Sync 4293ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner// with explicitly present empty ones. This ensures that the migration to add 4303ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner// origins to profiles does not generate lots of needless Sync updates. 4313ff704fa2b67d6c857142218c5aca3058b6239fcChris LattnerTEST_F(AutofillProfileSyncableServiceTest, MergeDataEmptyOrigins) { 4327e70829632f82de15db187845666aaca6e04b792Chris Lattner std::vector<AutofillProfile*> profiles_from_web_db; 4337e70829632f82de15db187845666aaca6e04b792Chris Lattner 4347e70829632f82de15db187845666aaca6e04b792Chris Lattner // Create a profile with an empty origin. 435c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet AutofillProfile profile(kGuid1, std::string()); 436c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 4377e70829632f82de15db187845666aaca6e04b792Chris Lattner profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1 1st st")); 43847e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner 439c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet profiles_from_web_db.push_back(new AutofillProfile(profile)); 4407e70829632f82de15db187845666aaca6e04b792Chris Lattner 4417e70829632f82de15db187845666aaca6e04b792Chris Lattner // Create a Sync profile identical to |profile|, except with no origin set. 442c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet sync_pb::EntitySpecifics specifics; 4437e70829632f82de15db187845666aaca6e04b792Chris Lattner sync_pb::AutofillProfileSpecifics* autofill_specifics = 4442b5326e7240ac524812016bc3700e12045bf0eb1Steve Naroff specifics.mutable_autofill_profile(); 445e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman autofill_specifics->set_guid(profile.guid()); 4462896652be29de97a6e08b5cccc015096f4ed17b5Chris Lattner autofill_specifics->add_name_first("John"); 4472896652be29de97a6e08b5cccc015096f4ed17b5Chris Lattner autofill_specifics->add_name_middle(std::string()); 4482896652be29de97a6e08b5cccc015096f4ed17b5Chris Lattner autofill_specifics->add_name_last(std::string()); 4492896652be29de97a6e08b5cccc015096f4ed17b5Chris Lattner autofill_specifics->add_email_address(std::string()); 4502896652be29de97a6e08b5cccc015096f4ed17b5Chris Lattner autofill_specifics->add_phone_home_whole_number(std::string()); 451c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet autofill_specifics->set_address_home_line1("1 1st st"); 452c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet EXPECT_FALSE(autofill_specifics->has_origin()); 4537e70829632f82de15db187845666aaca6e04b792Chris Lattner 4547e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncDataList data_list; 4557e70829632f82de15db187845666aaca6e04b792Chris Lattner data_list.push_back( 4567e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncData::CreateLocalData( 4577e70829632f82de15db187845666aaca6e04b792Chris Lattner profile.guid(), profile.guid(), specifics)); 4587e70829632f82de15db187845666aaca6e04b792Chris Lattner 4597e70829632f82de15db187845666aaca6e04b792Chris Lattner MockAutofillProfileSyncableService::DataBundle expected_bundle; 4607e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChangeList expected_change_list; 4617e70829632f82de15db187845666aaca6e04b792Chris Lattner MergeDataAndStartSyncing( 4627e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db, data_list, expected_bundle, expected_change_list); 463c03c46a6af3d53172d48d9e4d36748a40c878cffDouglas Gregor autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 4647e70829632f82de15db187845666aaca6e04b792Chris Lattner} 4657e70829632f82de15db187845666aaca6e04b792Chris Lattner 4667e70829632f82de15db187845666aaca6e04b792Chris LattnerTEST_F(AutofillProfileSyncableServiceTest, GetAllSyncData) { 4677e70829632f82de15db187845666aaca6e04b792Chris Lattner std::vector<AutofillProfile*> profiles_from_web_db; 4687e70829632f82de15db187845666aaca6e04b792Chris Lattner std::string guid_present1 = kGuid1; 4697e70829632f82de15db187845666aaca6e04b792Chris Lattner std::string guid_present2 = kGuid2; 4707e70829632f82de15db187845666aaca6e04b792Chris Lattner 4717e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db.push_back( 4727e70829632f82de15db187845666aaca6e04b792Chris Lattner new AutofillProfile(guid_present1, kHttpOrigin)); 4737e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 47447e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner profiles_from_web_db.push_back( 4757e70829632f82de15db187845666aaca6e04b792Chris Lattner new AutofillProfile(guid_present2, kHttpsOrigin)); 47647e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jane")); 47747e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner 47847e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner syncer::SyncChangeList expected_change_list; 47947e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner expected_change_list.push_back( 48047e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner syncer::SyncChange(FROM_HERE, 48147e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner syncer::SyncChange::ACTION_ADD, 48247e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner MockAutofillProfileSyncableService::CreateData( 4837e70829632f82de15db187845666aaca6e04b792Chris Lattner *profiles_from_web_db.front()))); 48423e1e727bd8c890ebe060e8f756085efb42697dcTorok Edwin expected_change_list.push_back( 48523e1e727bd8c890ebe060e8f756085efb42697dcTorok Edwin syncer::SyncChange(FROM_HERE, 4867e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange::ACTION_ADD, 487c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet MockAutofillProfileSyncableService::CreateData( 4887e70829632f82de15db187845666aaca6e04b792Chris Lattner *profiles_from_web_db.back()))); 4897e70829632f82de15db187845666aaca6e04b792Chris Lattner 490c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet MockAutofillProfileSyncableService::DataBundle expected_bundle; 4917e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncDataList data_list; 4927e70829632f82de15db187845666aaca6e04b792Chris Lattner MergeDataAndStartSyncing( 4937e70829632f82de15db187845666aaca6e04b792Chris Lattner profiles_from_web_db, data_list, expected_bundle, expected_change_list); 49423e1e727bd8c890ebe060e8f756085efb42697dcTorok Edwin 4957e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncDataList data = 4967e70829632f82de15db187845666aaca6e04b792Chris Lattner autofill_syncable_service_.GetAllSyncData(syncer::AUTOFILL_PROFILE); 4977e70829632f82de15db187845666aaca6e04b792Chris Lattner 498c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet ASSERT_EQ(2U, data.size()); 4997e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(guid_present1, data[0].GetSpecifics().autofill_profile().guid()); 5007e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(guid_present2, data[1].GetSpecifics().autofill_profile().guid()); 501c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet EXPECT_EQ(kHttpOrigin, data[0].GetSpecifics().autofill_profile().origin()); 5027e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(kHttpsOrigin, data[1].GetSpecifics().autofill_profile().origin()); 5037e70829632f82de15db187845666aaca6e04b792Chris Lattner 504c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 505c1edbfc2bac278ef050615f403c1bc74ef44cf14Cedric Venet} 5067e70829632f82de15db187845666aaca6e04b792Chris Lattner 50723e1e727bd8c890ebe060e8f756085efb42697dcTorok EdwinTEST_F(AutofillProfileSyncableServiceTest, ProcessSyncChanges) { 50847e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner std::vector<AutofillProfile *> profiles_from_web_db; 509e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman std::string guid_present = kGuid1; 51047e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner std::string guid_synced = kGuid2; 51147e756c11edbaa9a4916687eceaa4ec94c0aae3bChris Lattner 5127e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChangeList change_list; 5137e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile(guid_synced, kHttpOrigin); 5147e70829632f82de15db187845666aaca6e04b792Chris Lattner profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jane")); 5157e70829632f82de15db187845666aaca6e04b792Chris Lattner change_list.push_back( 5167e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange( 5177e70829632f82de15db187845666aaca6e04b792Chris Lattner FROM_HERE, 5187e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange::ACTION_ADD, 5197e70829632f82de15db187845666aaca6e04b792Chris Lattner MockAutofillProfileSyncableService::CreateData(profile))); 5207e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile empty_profile(guid_present, kHttpsOrigin); 5217e70829632f82de15db187845666aaca6e04b792Chris Lattner change_list.push_back( 522e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman syncer::SyncChange( 5236bf7ca5f6f1c26bf8fb579ba456dae7c6e6f7e3aChris Lattner FROM_HERE, 5247e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange::ACTION_DELETE, 5257e70829632f82de15db187845666aaca6e04b792Chris Lattner MockAutofillProfileSyncableService::CreateData(empty_profile))); 5267e70829632f82de15db187845666aaca6e04b792Chris Lattner 5277e70829632f82de15db187845666aaca6e04b792Chris Lattner MockAutofillProfileSyncableService::DataBundle expected_bundle; 5287e70829632f82de15db187845666aaca6e04b792Chris Lattner expected_bundle.profiles_to_delete.push_back(guid_present); 5297e70829632f82de15db187845666aaca6e04b792Chris Lattner expected_bundle.profiles_to_add.push_back(&profile); 5307e70829632f82de15db187845666aaca6e04b792Chris Lattner 5317e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_CALL(autofill_syncable_service_, SaveChangesToWebData( 5326de84985a434bfd6e55323ad5cd9959d15aa554aChris Lattner DataBundleCheck(expected_bundle))) 5337e70829632f82de15db187845666aaca6e04b792Chris Lattner .Times(1) 5347e70829632f82de15db187845666aaca6e04b792Chris Lattner .WillOnce(Return(true)); 5357e70829632f82de15db187845666aaca6e04b792Chris Lattner 5367e70829632f82de15db187845666aaca6e04b792Chris Lattner autofill_syncable_service_.set_sync_processor(sync_processor_.release()); 5377e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncError error = autofill_syncable_service_.ProcessSyncChanges( 5387e70829632f82de15db187845666aaca6e04b792Chris Lattner FROM_HERE, change_list); 5397e70829632f82de15db187845666aaca6e04b792Chris Lattner 5407e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_FALSE(error.IsSet()); 5417e70829632f82de15db187845666aaca6e04b792Chris Lattner} 5427e70829632f82de15db187845666aaca6e04b792Chris Lattner 5437e70829632f82de15db187845666aaca6e04b792Chris LattnerTEST_F(AutofillProfileSyncableServiceTest, AutofillProfileAdded) { 5447e70829632f82de15db187845666aaca6e04b792Chris Lattner // Will be owned by the syncable service. Keep a reference available here for 5457e70829632f82de15db187845666aaca6e04b792Chris Lattner // verifying test expectations. 5467e70829632f82de15db187845666aaca6e04b792Chris Lattner TestSyncChangeProcessor* sync_change_processor = new TestSyncChangeProcessor; 5477e70829632f82de15db187845666aaca6e04b792Chris Lattner autofill_syncable_service_.set_sync_processor(sync_change_processor); 5487e70829632f82de15db187845666aaca6e04b792Chris Lattner 5497e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile(kGuid1, kHttpsOrigin); 5507e70829632f82de15db187845666aaca6e04b792Chris Lattner profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jane")); 5517e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfileChange change(AutofillProfileChange::ADD, kGuid1, &profile); 5527e70829632f82de15db187845666aaca6e04b792Chris Lattner autofill_syncable_service_.AutofillProfileChanged(change); 5537e70829632f82de15db187845666aaca6e04b792Chris Lattner 5547e70829632f82de15db187845666aaca6e04b792Chris Lattner ASSERT_EQ(1U, sync_change_processor->changes().size()); 5557e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange result = sync_change_processor->changes()[0]; 5567e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(syncer::SyncChange::ACTION_ADD, result.change_type()); 5577e70829632f82de15db187845666aaca6e04b792Chris Lattner 5587e70829632f82de15db187845666aaca6e04b792Chris Lattner sync_pb::AutofillProfileSpecifics specifics = 5597e70829632f82de15db187845666aaca6e04b792Chris Lattner result.sync_data().GetSpecifics().autofill_profile(); 5607e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(kGuid1, specifics.guid()); 5617e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(kHttpsOrigin, specifics.origin()); 5627e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_THAT(specifics.name_first(), testing::ElementsAre("Jane")); 5637e70829632f82de15db187845666aaca6e04b792Chris Lattner} 5647e70829632f82de15db187845666aaca6e04b792Chris Lattner 5657e70829632f82de15db187845666aaca6e04b792Chris LattnerTEST_F(AutofillProfileSyncableServiceTest, AutofillProfileDeleted) { 5667e70829632f82de15db187845666aaca6e04b792Chris Lattner // Will be owned by the syncable service. Keep a reference available here for 5677e70829632f82de15db187845666aaca6e04b792Chris Lattner // verifying test expectations. 5687e70829632f82de15db187845666aaca6e04b792Chris Lattner TestSyncChangeProcessor* sync_change_processor = new TestSyncChangeProcessor; 5697e70829632f82de15db187845666aaca6e04b792Chris Lattner autofill_syncable_service_.set_sync_processor(sync_change_processor); 5707e70829632f82de15db187845666aaca6e04b792Chris Lattner 5717e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfileChange change(AutofillProfileChange::REMOVE, kGuid2, NULL); 5727e70829632f82de15db187845666aaca6e04b792Chris Lattner autofill_syncable_service_.AutofillProfileChanged(change); 5737e70829632f82de15db187845666aaca6e04b792Chris Lattner 5747e70829632f82de15db187845666aaca6e04b792Chris Lattner ASSERT_EQ(1U, sync_change_processor->changes().size()); 5757e70829632f82de15db187845666aaca6e04b792Chris Lattner syncer::SyncChange result = sync_change_processor->changes()[0]; 5767e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(syncer::SyncChange::ACTION_DELETE, result.change_type()); 5777e70829632f82de15db187845666aaca6e04b792Chris Lattner sync_pb::AutofillProfileSpecifics specifics = 5787e70829632f82de15db187845666aaca6e04b792Chris Lattner result.sync_data().GetSpecifics().autofill_profile(); 5797e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(kGuid2, specifics.guid()); 5807e70829632f82de15db187845666aaca6e04b792Chris Lattner} 5817e70829632f82de15db187845666aaca6e04b792Chris Lattner 5827e70829632f82de15db187845666aaca6e04b792Chris LattnerTEST_F(AutofillProfileSyncableServiceTest, UpdateField) { 5837e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile(kGuid1, kSettingsOrigin); 5847e70829632f82de15db187845666aaca6e04b792Chris Lattner std::string company1 = "A Company"; 5857e70829632f82de15db187845666aaca6e04b792Chris Lattner std::string company2 = "Another Company"; 5867e70829632f82de15db187845666aaca6e04b792Chris Lattner profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16(company1)); 5877e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_FALSE(AutofillProfileSyncableService::UpdateField( 5887e70829632f82de15db187845666aaca6e04b792Chris Lattner COMPANY_NAME, company1, &profile)); 5897e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(profile.GetRawInfo(COMPANY_NAME), ASCIIToUTF16(company1)); 5907e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_TRUE(AutofillProfileSyncableService::UpdateField( 5917e70829632f82de15db187845666aaca6e04b792Chris Lattner COMPANY_NAME, company2, &profile)); 5927e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(profile.GetRawInfo(COMPANY_NAME), ASCIIToUTF16(company2)); 5937e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_FALSE(AutofillProfileSyncableService::UpdateField( 5947e70829632f82de15db187845666aaca6e04b792Chris Lattner COMPANY_NAME, company2, &profile)); 5957e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(profile.GetRawInfo(COMPANY_NAME), ASCIIToUTF16(company2)); 5967e70829632f82de15db187845666aaca6e04b792Chris Lattner} 5977e70829632f82de15db187845666aaca6e04b792Chris Lattner 5987e70829632f82de15db187845666aaca6e04b792Chris LattnerTEST_F(AutofillProfileSyncableServiceTest, UpdateMultivaluedField) { 5997e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile(kGuid1, kHttpsOrigin); 6007e70829632f82de15db187845666aaca6e04b792Chris Lattner 6017e70829632f82de15db187845666aaca6e04b792Chris Lattner std::vector<base::string16> values; 6027e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("1@1.com")); 6037e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("2@1.com")); 6047e70829632f82de15db187845666aaca6e04b792Chris Lattner profile.SetRawMultiInfo(EMAIL_ADDRESS, values); 6057e70829632f82de15db187845666aaca6e04b792Chris Lattner 6067e70829632f82de15db187845666aaca6e04b792Chris Lattner ::google::protobuf::RepeatedPtrField<std::string> specifics_fields; 6077e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics_fields.AddAllocated(new std::string("2@1.com")); 6087e70829632f82de15db187845666aaca6e04b792Chris Lattner specifics_fields.AddAllocated(new std::string("3@1.com")); 6097e70829632f82de15db187845666aaca6e04b792Chris Lattner 6107e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_TRUE(AutofillProfileSyncableService::UpdateMultivaluedField( 6117e70829632f82de15db187845666aaca6e04b792Chris Lattner EMAIL_ADDRESS, specifics_fields, &profile)); 6127e70829632f82de15db187845666aaca6e04b792Chris Lattner profile.GetRawMultiInfo(EMAIL_ADDRESS, &values); 6137e70829632f82de15db187845666aaca6e04b792Chris Lattner ASSERT_TRUE(values.size() == 2); 6147e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[0], ASCIIToUTF16("2@1.com")); 6157e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[1], ASCIIToUTF16("3@1.com")); 6167e70829632f82de15db187845666aaca6e04b792Chris Lattner 6177e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_FALSE(AutofillProfileSyncableService::UpdateMultivaluedField( 6187e70829632f82de15db187845666aaca6e04b792Chris Lattner EMAIL_ADDRESS, specifics_fields, &profile)); 6197e70829632f82de15db187845666aaca6e04b792Chris Lattner profile.GetRawMultiInfo(EMAIL_ADDRESS, &values); 6207e70829632f82de15db187845666aaca6e04b792Chris Lattner ASSERT_EQ(values.size(), 2U); 6217e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[0], ASCIIToUTF16("2@1.com")); 6227e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[1], ASCIIToUTF16("3@1.com")); 6237e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_TRUE(AutofillProfileSyncableService::UpdateMultivaluedField( 624a1cb4737b04a92f57b1b9dcd8a24c68db5035401Chris Lattner EMAIL_ADDRESS, ::google::protobuf::RepeatedPtrField<std::string>(), 625a1cb4737b04a92f57b1b9dcd8a24c68db5035401Chris Lattner &profile)); 626a1cb4737b04a92f57b1b9dcd8a24c68db5035401Chris Lattner profile.GetRawMultiInfo(EMAIL_ADDRESS, &values); 6277e70829632f82de15db187845666aaca6e04b792Chris Lattner ASSERT_EQ(values.size(), 1U); // Always have at least an empty string. 6287e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[0], ASCIIToUTF16("")); 62940c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner} 6307e70829632f82de15db187845666aaca6e04b792Chris Lattner 6317e70829632f82de15db187845666aaca6e04b792Chris LattnerTEST_F(AutofillProfileSyncableServiceTest, MergeProfile) { 63240c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner AutofillProfile profile1(kGuid1, kHttpOrigin); 633e21a6bae806d13e644a92b3df23e4d5b78bdb75cMisha Brukman profile1.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("111 First St.")); 6347e70829632f82de15db187845666aaca6e04b792Chris Lattner 63540c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner std::vector<base::string16> values; 6367e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("1@1.com")); 6377e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("2@1.com")); 63840c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner profile1.SetRawMultiInfo(EMAIL_ADDRESS, values); 6397e70829632f82de15db187845666aaca6e04b792Chris Lattner 6407e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile2(kGuid2, kHttpsOrigin); 64183b5752747ea14696b0e51904722c38771f22eb7Gabor Greif profile2.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("111 First St.")); 64283b5752747ea14696b0e51904722c38771f22eb7Gabor Greif 64383b5752747ea14696b0e51904722c38771f22eb7Gabor Greif // |values| now is [ "1@1.com", "2@1.com", "3@1.com" ]. 64483b5752747ea14696b0e51904722c38771f22eb7Gabor Greif values.push_back(ASCIIToUTF16("3@1.com")); 6457e70829632f82de15db187845666aaca6e04b792Chris Lattner profile2.SetRawMultiInfo(EMAIL_ADDRESS, values); 6467e70829632f82de15db187845666aaca6e04b792Chris Lattner 6477e70829632f82de15db187845666aaca6e04b792Chris Lattner values.clear(); 6487e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("John")); 6497e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.SetRawMultiInfo(NAME_FIRST, values); 6507e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("Jane")); 6517e70829632f82de15db187845666aaca6e04b792Chris Lattner profile2.SetRawMultiInfo(NAME_FIRST, values); 6527e70829632f82de15db187845666aaca6e04b792Chris Lattner 65340c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner values.clear(); 65440c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner values.push_back(ASCIIToUTF16("Doe")); 6557e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.SetRawMultiInfo(NAME_LAST, values); 6567e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("Other")); 6577e70829632f82de15db187845666aaca6e04b792Chris Lattner profile2.SetRawMultiInfo(NAME_LAST, values); 6587e70829632f82de15db187845666aaca6e04b792Chris Lattner 6597e70829632f82de15db187845666aaca6e04b792Chris Lattner values.clear(); 6607e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("650234567")); 6617e70829632f82de15db187845666aaca6e04b792Chris Lattner profile2.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, values); 6627e70829632f82de15db187845666aaca6e04b792Chris Lattner 6637e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.set_language_code("en"); 6647e70829632f82de15db187845666aaca6e04b792Chris Lattner 6657e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_FALSE(AutofillProfileSyncableService::MergeProfile(profile2, 66640c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner &profile1, 66740c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner "en-US")); 6687e70829632f82de15db187845666aaca6e04b792Chris Lattner 6697e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.GetRawMultiInfo(NAME_FIRST, &values); 67040c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner ASSERT_EQ(values.size(), 2U); 6717e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[0], ASCIIToUTF16("John")); 67240c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner EXPECT_EQ(values[1], ASCIIToUTF16("Jane")); 6737e70829632f82de15db187845666aaca6e04b792Chris Lattner 67440c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner profile1.GetRawMultiInfo(NAME_LAST, &values); 67540c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner ASSERT_EQ(values.size(), 2U); 6767e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[0], ASCIIToUTF16("Doe")); 6777e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[1], ASCIIToUTF16("Other")); 6787e70829632f82de15db187845666aaca6e04b792Chris Lattner 6797e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.GetRawMultiInfo(EMAIL_ADDRESS, &values); 6807e70829632f82de15db187845666aaca6e04b792Chris Lattner ASSERT_EQ(values.size(), 3U); 6817e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[0], ASCIIToUTF16("1@1.com")); 6827e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[1], ASCIIToUTF16("2@1.com")); 6837e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[2], ASCIIToUTF16("3@1.com")); 6847e70829632f82de15db187845666aaca6e04b792Chris Lattner 6857e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &values); 6867e70829632f82de15db187845666aaca6e04b792Chris Lattner ASSERT_EQ(values.size(), 1U); 68740c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner EXPECT_EQ(values[0], ASCIIToUTF16("650234567")); 6887e70829632f82de15db187845666aaca6e04b792Chris Lattner 68940c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner EXPECT_EQ(profile2.origin(), profile1.origin()); 6907e70829632f82de15db187845666aaca6e04b792Chris Lattner 6917e70829632f82de15db187845666aaca6e04b792Chris Lattner AutofillProfile profile3(kGuid3, kHttpOrigin); 69240c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner profile3.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("111 First St.")); 6937e70829632f82de15db187845666aaca6e04b792Chris Lattner 69440c6fb6cac80367c2bec32295d4448e540f2d253Chris Lattner values.clear(); 6957e70829632f82de15db187845666aaca6e04b792Chris Lattner values.push_back(ASCIIToUTF16("Jane")); 6967e70829632f82de15db187845666aaca6e04b792Chris Lattner profile3.SetRawMultiInfo(NAME_FIRST, values); 6977e70829632f82de15db187845666aaca6e04b792Chris Lattner 6987e70829632f82de15db187845666aaca6e04b792Chris Lattner values.clear(); 699d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke values.push_back(ASCIIToUTF16("Doe")); 700d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke profile3.SetRawMultiInfo(NAME_LAST, values); 7017e70829632f82de15db187845666aaca6e04b792Chris Lattner 7027e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_TRUE(AutofillProfileSyncableService::MergeProfile(profile3, 7037e70829632f82de15db187845666aaca6e04b792Chris Lattner &profile1, 704d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke "en-US")); 7057e70829632f82de15db187845666aaca6e04b792Chris Lattner 7067e70829632f82de15db187845666aaca6e04b792Chris Lattner profile1.GetRawMultiInfo(NAME_FIRST, &values); 7077e70829632f82de15db187845666aaca6e04b792Chris Lattner ASSERT_EQ(values.size(), 3U); 7087e70829632f82de15db187845666aaca6e04b792Chris Lattner EXPECT_EQ(values[0], ASCIIToUTF16("John")); 7091ff4ed726bb8526d1e49030245365f8c86a8bb49Anton Korobeynikov EXPECT_EQ(values[1], ASCIIToUTF16("Jane")); 710 EXPECT_EQ(values[2], ASCIIToUTF16("Jane")); 711 712 profile1.GetRawMultiInfo(NAME_LAST, &values); 713 ASSERT_EQ(values.size(), 3U); 714 EXPECT_EQ(values[0], ASCIIToUTF16("Doe")); 715 EXPECT_EQ(values[1], ASCIIToUTF16("Other")); 716 EXPECT_EQ(values[2], ASCIIToUTF16("Doe")); 717 718 // Middle name should have three entries as well. 719 profile1.GetRawMultiInfo(NAME_MIDDLE, &values); 720 ASSERT_EQ(values.size(), 3U); 721 EXPECT_TRUE(values[0].empty()); 722 EXPECT_TRUE(values[1].empty()); 723 EXPECT_TRUE(values[2].empty()); 724 725 profile1.GetRawMultiInfo(EMAIL_ADDRESS, &values); 726 ASSERT_EQ(values.size(), 3U); 727 EXPECT_EQ(values[0], ASCIIToUTF16("1@1.com")); 728 EXPECT_EQ(values[1], ASCIIToUTF16("2@1.com")); 729 EXPECT_EQ(values[2], ASCIIToUTF16("3@1.com")); 730 731 profile1.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &values); 732 ASSERT_EQ(values.size(), 1U); 733 EXPECT_EQ(values[0], ASCIIToUTF16("650234567")); 734} 735 736// Ensure that all profile fields are able to be synced up from the client to 737// the server. 738TEST_F(AutofillProfileSyncableServiceTest, SyncAllFieldsToServer) { 739 std::vector<AutofillProfile*> profiles_from_web_db; 740 741 // Create a profile with all fields set. 742 profiles_from_web_db.push_back(ConstructCompleteProfile().release()); 743 744 // Set up expectations: No changes to the WebDB, and all fields correctly 745 // copied to Sync. 746 MockAutofillProfileSyncableService::DataBundle expected_bundle; 747 syncer::SyncChangeList expected_change_list; 748 expected_change_list.push_back( 749 syncer::SyncChange(FROM_HERE, 750 syncer::SyncChange::ACTION_ADD, 751 ConstructCompleteSyncData())); 752 753 // Verify the expectations. 754 syncer::SyncDataList data_list; 755 MergeDataAndStartSyncing( 756 profiles_from_web_db, data_list, expected_bundle, expected_change_list); 757 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 758} 759 760// Ensure that all profile fields are able to be synced down from the server to 761// the client. 762TEST_F(AutofillProfileSyncableServiceTest, SyncAllFieldsToClient) { 763 // Create a profile with all fields set. 764 syncer::SyncDataList data_list; 765 data_list.push_back(ConstructCompleteSyncData()); 766 767 // Set up expectations: All fields correctly copied to the WebDB, and no 768 // changes propagated to Sync. 769 syncer::SyncChangeList expected_change_list; 770 scoped_ptr<AutofillProfile> expected_profile = ConstructCompleteProfile(); 771 MockAutofillProfileSyncableService::DataBundle expected_bundle; 772 expected_bundle.profiles_to_add.push_back(expected_profile.get()); 773 774 // Verify the expectations. 775 std::vector<AutofillProfile*> profiles_from_web_db; 776 MergeDataAndStartSyncing( 777 profiles_from_web_db, data_list, expected_bundle, expected_change_list); 778 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 779} 780 781// Ensure that the street address field takes precedence over the address line 1 782// and line 2 fields, even though these are expected to always be in sync in 783// practice. 784TEST_F(AutofillProfileSyncableServiceTest, 785 StreetAddressTakesPrecedenceOverAddressLines) { 786 // Create a Sync profile with conflicting address data in the street address 787 // field vs. the address line 1 and address line 2 fields. 788 sync_pb::EntitySpecifics specifics; 789 sync_pb::AutofillProfileSpecifics* autofill_specifics = 790 specifics.mutable_autofill_profile(); 791 autofill_specifics->set_guid(kGuid1); 792 autofill_specifics->set_origin(kHttpsOrigin); 793 autofill_specifics->add_name_first(std::string()); 794 autofill_specifics->add_name_middle(std::string()); 795 autofill_specifics->add_name_last(std::string()); 796 autofill_specifics->add_email_address(std::string()); 797 autofill_specifics->add_phone_home_whole_number(std::string()); 798 autofill_specifics->set_address_home_line1("123 Example St."); 799 autofill_specifics->set_address_home_line2("Apt. 42"); 800 autofill_specifics->set_address_home_street_address("456 El Camino Real\n" 801 "Suite #1337"); 802 803 syncer::SyncDataList data_list; 804 data_list.push_back( 805 syncer::SyncData::CreateLocalData(kGuid1, kGuid1, specifics)); 806 807 // Set up expectations: Full street address takes precedence over address 808 // lines. 809 syncer::SyncChangeList expected_change_list; 810 AutofillProfile expected_profile(kGuid1, kHttpsOrigin); 811 expected_profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, 812 ASCIIToUTF16("456 El Camino Real\n" 813 "Suite #1337")); 814 EXPECT_EQ(ASCIIToUTF16("456 El Camino Real"), 815 expected_profile.GetRawInfo(ADDRESS_HOME_LINE1)); 816 EXPECT_EQ(ASCIIToUTF16("Suite #1337"), 817 expected_profile.GetRawInfo(ADDRESS_HOME_LINE2)); 818 MockAutofillProfileSyncableService::DataBundle expected_bundle; 819 expected_bundle.profiles_to_add.push_back(&expected_profile); 820 821 // Verify the expectations. 822 std::vector<AutofillProfile*> profiles_from_web_db; 823 MergeDataAndStartSyncing( 824 profiles_from_web_db, data_list, expected_bundle, expected_change_list); 825 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 826} 827 828// Ensure that no Sync events are generated to fill in missing street address 829// fields from Sync with explicitly present ones identical to the data stored in 830// the line1 and line2 fields. This ensures that the migration to add the 831// street address field to profiles does not generate lots of needless Sync 832// updates. 833TEST_F(AutofillProfileSyncableServiceTest, MergeDataEmptyStreetAddress) { 834 std::vector<AutofillProfile*> profiles_from_web_db; 835 836 // Create a profile with the street address set. 837 AutofillProfile profile(kGuid1, kHttpsOrigin); 838 profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, 839 ASCIIToUTF16("123 Example St.\n" 840 "Apt. 42")); 841 EXPECT_EQ(ASCIIToUTF16("123 Example St."), 842 profile.GetRawInfo(ADDRESS_HOME_LINE1)); 843 EXPECT_EQ(ASCIIToUTF16("Apt. 42"), profile.GetRawInfo(ADDRESS_HOME_LINE2)); 844 845 profiles_from_web_db.push_back(new AutofillProfile(profile)); 846 847 // Create a Sync profile identical to |profile|, except without street address 848 // explicitly set. 849 sync_pb::EntitySpecifics specifics; 850 sync_pb::AutofillProfileSpecifics* autofill_specifics = 851 specifics.mutable_autofill_profile(); 852 autofill_specifics->set_guid(profile.guid()); 853 autofill_specifics->set_origin(profile.origin()); 854 autofill_specifics->add_name_first(std::string()); 855 autofill_specifics->add_name_middle(std::string()); 856 autofill_specifics->add_name_last(std::string()); 857 autofill_specifics->add_email_address(std::string()); 858 autofill_specifics->add_phone_home_whole_number(std::string()); 859 autofill_specifics->set_address_home_line1("123 Example St."); 860 autofill_specifics->set_address_home_line2("Apt. 42"); 861 EXPECT_FALSE(autofill_specifics->has_address_home_street_address()); 862 863 syncer::SyncDataList data_list; 864 data_list.push_back( 865 syncer::SyncData::CreateLocalData( 866 profile.guid(), profile.guid(), specifics)); 867 868 MockAutofillProfileSyncableService::DataBundle expected_bundle; 869 syncer::SyncChangeList expected_change_list; 870 MergeDataAndStartSyncing( 871 profiles_from_web_db, data_list, expected_bundle, expected_change_list); 872 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 873} 874 875// Sync data without origin should not overwrite existing origin in local 876// autofill profile. 877TEST_F(AutofillProfileSyncableServiceTest, EmptySyncPreservesOrigin) { 878 std::vector<AutofillProfile*> profiles_from_web_db; 879 880 // Local autofill profile has an origin. 881 AutofillProfile profile(kGuid1, kHttpsOrigin); 882 profiles_from_web_db.push_back(new AutofillProfile(profile)); 883 884 // Remote data does not have an origin value. 885 sync_pb::EntitySpecifics specifics; 886 sync_pb::AutofillProfileSpecifics* autofill_specifics = 887 specifics.mutable_autofill_profile(); 888 autofill_specifics->set_guid(profile.guid()); 889 autofill_specifics->add_name_first("John"); 890 autofill_specifics->add_name_middle(std::string()); 891 autofill_specifics->add_name_last(std::string()); 892 autofill_specifics->add_email_address(std::string()); 893 autofill_specifics->add_phone_home_whole_number(std::string()); 894 EXPECT_FALSE(autofill_specifics->has_origin()); 895 896 syncer::SyncDataList data_list; 897 data_list.push_back( 898 syncer::SyncData::CreateLocalData( 899 profile.guid(), profile.guid(), specifics)); 900 901 // Expect the local autofill profile to still have an origin after sync. 902 MockAutofillProfileSyncableService::DataBundle expected_bundle; 903 AutofillProfile expected_profile(profile.guid(), profile.origin()); 904 expected_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 905 expected_bundle.profiles_to_update.push_back(&expected_profile); 906 907 // Expect no sync events to add origin to the remote data. 908 syncer::SyncChangeList expected_empty_change_list; 909 910 MergeDataAndStartSyncing(profiles_from_web_db, data_list, 911 expected_bundle, expected_empty_change_list); 912 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 913} 914 915// Missing language code field should not generate sync events. 916TEST_F(AutofillProfileSyncableServiceTest, NoLanguageCodeNoSync) { 917 std::vector<AutofillProfile*> profiles_from_web_db; 918 919 // Local autofill profile has an empty language code. 920 AutofillProfile profile(kGuid1, kHttpsOrigin); 921 EXPECT_TRUE(profile.language_code().empty()); 922 profiles_from_web_db.push_back(new AutofillProfile(profile)); 923 924 // Remote data does not have a language code value. 925 sync_pb::EntitySpecifics specifics; 926 sync_pb::AutofillProfileSpecifics* autofill_specifics = 927 specifics.mutable_autofill_profile(); 928 autofill_specifics->set_guid(profile.guid()); 929 autofill_specifics->set_origin(profile.origin()); 930 autofill_specifics->add_name_first(std::string()); 931 autofill_specifics->add_name_middle(std::string()); 932 autofill_specifics->add_name_last(std::string()); 933 autofill_specifics->add_email_address(std::string()); 934 autofill_specifics->add_phone_home_whole_number(std::string()); 935 EXPECT_FALSE(autofill_specifics->has_address_home_language_code()); 936 937 syncer::SyncDataList data_list; 938 data_list.push_back( 939 syncer::SyncData::CreateLocalData( 940 profile.guid(), profile.guid(), specifics)); 941 942 // Expect no changes to local and remote data. 943 MockAutofillProfileSyncableService::DataBundle expected_empty_bundle; 944 syncer::SyncChangeList expected_empty_change_list; 945 946 MergeDataAndStartSyncing(profiles_from_web_db, data_list, 947 expected_empty_bundle, expected_empty_change_list); 948 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 949} 950 951// Empty language code should be overwritten by sync. 952TEST_F(AutofillProfileSyncableServiceTest, SyncUpdatesEmptyLanguageCode) { 953 std::vector<AutofillProfile*> profiles_from_web_db; 954 955 // Local autofill profile has an empty language code. 956 AutofillProfile profile(kGuid1, kHttpsOrigin); 957 EXPECT_TRUE(profile.language_code().empty()); 958 profiles_from_web_db.push_back(new AutofillProfile(profile)); 959 960 // Remote data has "en" language code. 961 sync_pb::EntitySpecifics specifics; 962 sync_pb::AutofillProfileSpecifics* autofill_specifics = 963 specifics.mutable_autofill_profile(); 964 autofill_specifics->set_guid(profile.guid()); 965 autofill_specifics->set_origin(profile.origin()); 966 autofill_specifics->add_name_first(std::string()); 967 autofill_specifics->add_name_middle(std::string()); 968 autofill_specifics->add_name_last(std::string()); 969 autofill_specifics->add_email_address(std::string()); 970 autofill_specifics->add_phone_home_whole_number(std::string()); 971 autofill_specifics->set_address_home_language_code("en"); 972 EXPECT_TRUE(autofill_specifics->has_address_home_language_code()); 973 974 syncer::SyncDataList data_list; 975 data_list.push_back( 976 syncer::SyncData::CreateLocalData( 977 profile.guid(), profile.guid(), specifics)); 978 979 // Expect the local autofill profile to have "en" language code after sync. 980 MockAutofillProfileSyncableService::DataBundle expected_bundle; 981 AutofillProfile expected_profile(kGuid1, kHttpsOrigin); 982 expected_profile.set_language_code("en"); 983 expected_bundle.profiles_to_update.push_back(&expected_profile); 984 985 // Expect not changes to remote data. 986 syncer::SyncChangeList expected_empty_change_list; 987 988 MergeDataAndStartSyncing(profiles_from_web_db, data_list, 989 expected_bundle, expected_empty_change_list); 990 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 991} 992 993// Incorrect language code should be overwritten by sync. 994TEST_F(AutofillProfileSyncableServiceTest, SyncUpdatesIncorrectLanguageCode) { 995 std::vector<AutofillProfile*> profiles_from_web_db; 996 997 // Local autofill profile has "de" language code. 998 AutofillProfile profile(kGuid1, kHttpsOrigin); 999 profile.set_language_code("de"); 1000 profiles_from_web_db.push_back(new AutofillProfile(profile)); 1001 1002 // Remote data has "en" language code. 1003 sync_pb::EntitySpecifics specifics; 1004 sync_pb::AutofillProfileSpecifics* autofill_specifics = 1005 specifics.mutable_autofill_profile(); 1006 autofill_specifics->set_guid(profile.guid()); 1007 autofill_specifics->set_origin(profile.origin()); 1008 autofill_specifics->add_name_first(std::string()); 1009 autofill_specifics->add_name_middle(std::string()); 1010 autofill_specifics->add_name_last(std::string()); 1011 autofill_specifics->add_email_address(std::string()); 1012 autofill_specifics->add_phone_home_whole_number(std::string()); 1013 autofill_specifics->set_address_home_language_code("en"); 1014 EXPECT_TRUE(autofill_specifics->has_address_home_language_code()); 1015 1016 syncer::SyncDataList data_list; 1017 data_list.push_back( 1018 syncer::SyncData::CreateLocalData( 1019 profile.guid(), profile.guid(), specifics)); 1020 1021 // Expect the local autofill profile to have "en" language code after sync. 1022 MockAutofillProfileSyncableService::DataBundle expected_bundle; 1023 AutofillProfile expected_profile(kGuid1, kHttpsOrigin); 1024 expected_profile.set_language_code("en"); 1025 expected_bundle.profiles_to_update.push_back(&expected_profile); 1026 1027 // Expect no changes to remote data. 1028 syncer::SyncChangeList expected_empty_change_list; 1029 1030 MergeDataAndStartSyncing(profiles_from_web_db, data_list, 1031 expected_bundle, expected_empty_change_list); 1032 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 1033} 1034 1035// Sync data without language code should not overwrite existing language code 1036// in local autofill profile. 1037TEST_F(AutofillProfileSyncableServiceTest, EmptySyncPreservesLanguageCode) { 1038 std::vector<AutofillProfile*> profiles_from_web_db; 1039 1040 // Local autofill profile has "en" language code. 1041 AutofillProfile profile(kGuid1, kHttpsOrigin); 1042 profile.set_language_code("en"); 1043 profiles_from_web_db.push_back(new AutofillProfile(profile)); 1044 1045 // Remote data does not have a language code value. 1046 sync_pb::EntitySpecifics specifics; 1047 sync_pb::AutofillProfileSpecifics* autofill_specifics = 1048 specifics.mutable_autofill_profile(); 1049 autofill_specifics->set_guid(profile.guid()); 1050 autofill_specifics->set_origin(profile.origin()); 1051 autofill_specifics->add_name_first("John"); 1052 autofill_specifics->add_name_middle(std::string()); 1053 autofill_specifics->add_name_last(std::string()); 1054 autofill_specifics->add_email_address(std::string()); 1055 autofill_specifics->add_phone_home_whole_number(std::string()); 1056 EXPECT_FALSE(autofill_specifics->has_address_home_language_code()); 1057 1058 syncer::SyncDataList data_list; 1059 data_list.push_back( 1060 syncer::SyncData::CreateLocalData( 1061 profile.guid(), profile.guid(), specifics)); 1062 1063 // Expect local autofill profile to still have "en" language code after sync. 1064 MockAutofillProfileSyncableService::DataBundle expected_bundle; 1065 AutofillProfile expected_profile(profile.guid(), profile.origin()); 1066 expected_profile.set_language_code("en"); 1067 expected_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); 1068 expected_bundle.profiles_to_update.push_back(&expected_profile); 1069 1070 // Expect no changes to remote data. 1071 syncer::SyncChangeList expected_empty_change_list; 1072 1073 MergeDataAndStartSyncing(profiles_from_web_db, data_list, 1074 expected_bundle, expected_empty_change_list); 1075 autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); 1076} 1077 1078// Language code in autofill profiles should be synced to the server. 1079TEST_F(AutofillProfileSyncableServiceTest, LanguageCodePropagates) { 1080 TestSyncChangeProcessor* sync_change_processor = new TestSyncChangeProcessor; 1081 autofill_syncable_service_.set_sync_processor(sync_change_processor); 1082 1083 AutofillProfile profile(kGuid1, kHttpsOrigin); 1084 profile.set_language_code("en"); 1085 AutofillProfileChange change(AutofillProfileChange::ADD, kGuid1, &profile); 1086 autofill_syncable_service_.AutofillProfileChanged(change); 1087 1088 ASSERT_EQ(1U, sync_change_processor->changes().size()); 1089 syncer::SyncChange result = sync_change_processor->changes()[0]; 1090 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, result.change_type()); 1091 1092 sync_pb::AutofillProfileSpecifics specifics = 1093 result.sync_data().GetSpecifics().autofill_profile(); 1094 EXPECT_EQ(kGuid1, specifics.guid()); 1095 EXPECT_EQ(kHttpsOrigin, specifics.origin()); 1096 EXPECT_EQ("en", specifics.address_home_language_code()); 1097} 1098 1099} // namespace autofill 1100