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