| Index: chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc
|
| diff --git a/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc b/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc
|
| deleted file mode 100644
|
| index a9aaa6eafcb732b153b8b9f775610bd10ae85c48..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc
|
| +++ /dev/null
|
| @@ -1,878 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/location.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/webdata/autofill_profile_syncable_service.h"
|
| -#include "components/autofill/core/browser/autofill_profile.h"
|
| -#include "components/autofill/core/browser/webdata/autofill_change.h"
|
| -#include "content/public/test/test_browser_thread.h"
|
| -#include "sync/api/sync_error_factory.h"
|
| -#include "sync/api/sync_error_factory_mock.h"
|
| -#include "sync/protocol/sync.pb.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace autofill {
|
| -
|
| -using ::testing::_;
|
| -using ::testing::DoAll;
|
| -using ::testing::Eq;
|
| -using ::testing::Return;
|
| -using ::testing::Property;
|
| -using base::ASCIIToUTF16;
|
| -using base::UTF8ToUTF16;
|
| -using content::BrowserThread;
|
| -
|
| -namespace {
|
| -
|
| -// Some guids for testing.
|
| -const char kGuid1[] = "EDC609ED-7EEE-4F27-B00C-423242A9C44B";
|
| -const char kGuid2[] = "EDC609ED-7EEE-4F27-B00C-423242A9C44C";
|
| -const char kGuid3[] = "EDC609ED-7EEE-4F27-B00C-423242A9C44D";
|
| -const char kGuid4[] = "EDC609ED-7EEE-4F27-B00C-423242A9C44E";
|
| -const char kHttpOrigin[] = "http://www.example.com/";
|
| -const char kHttpsOrigin[] = "https://www.example.com/";
|
| -const char kSettingsOrigin[] = "Chrome settings";
|
| -
|
| -class MockAutofillProfileSyncableService
|
| - : public AutofillProfileSyncableService {
|
| - public:
|
| - MockAutofillProfileSyncableService() {}
|
| - virtual ~MockAutofillProfileSyncableService() {}
|
| -
|
| - using AutofillProfileSyncableService::DataBundle;
|
| - using AutofillProfileSyncableService::set_sync_processor;
|
| - using AutofillProfileSyncableService::CreateData;
|
| -
|
| - MOCK_METHOD1(LoadAutofillData, bool(std::vector<AutofillProfile*>*));
|
| - MOCK_METHOD1(SaveChangesToWebData,
|
| - bool(const AutofillProfileSyncableService::DataBundle&));
|
| -};
|
| -
|
| -ACTION_P(CopyData, data) {
|
| - arg0->resize(data->size());
|
| - std::copy(data->begin(), data->end(), arg0->begin());
|
| -}
|
| -
|
| -MATCHER_P(CheckSyncChanges, n_sync_changes_list, "") {
|
| - if (arg.size() != n_sync_changes_list.size())
|
| - return false;
|
| - syncer::SyncChangeList::const_iterator passed, expected;
|
| - for (passed = arg.begin(), expected = n_sync_changes_list.begin();
|
| - passed != arg.end() && expected != n_sync_changes_list.end();
|
| - ++passed, ++expected) {
|
| - DCHECK(passed->IsValid());
|
| - if (passed->change_type() != expected->change_type())
|
| - return false;
|
| - if (passed->sync_data().GetSpecifics().SerializeAsString() !=
|
| - expected->sync_data().GetSpecifics().SerializeAsString()) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -MATCHER_P(DataBundleCheck, n_bundle, "") {
|
| - if ((arg.profiles_to_delete.size() != n_bundle.profiles_to_delete.size()) ||
|
| - (arg.profiles_to_update.size() != n_bundle.profiles_to_update.size()) ||
|
| - (arg.profiles_to_add.size() != n_bundle.profiles_to_add.size()))
|
| - return false;
|
| - for (size_t i = 0; i < arg.profiles_to_delete.size(); ++i) {
|
| - if (arg.profiles_to_delete[i] != n_bundle.profiles_to_delete[i])
|
| - return false;
|
| - }
|
| - for (size_t i = 0; i < arg.profiles_to_update.size(); ++i) {
|
| - if (*arg.profiles_to_update[i] != *n_bundle.profiles_to_update[i])
|
| - return false;
|
| - }
|
| - for (size_t i = 0; i < arg.profiles_to_add.size(); ++i) {
|
| - if (*arg.profiles_to_add[i] != *n_bundle.profiles_to_add[i])
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -class MockSyncChangeProcessor : public syncer::SyncChangeProcessor {
|
| - public:
|
| - MockSyncChangeProcessor() {}
|
| - virtual ~MockSyncChangeProcessor() {}
|
| -
|
| - MOCK_METHOD2(ProcessSyncChanges,
|
| - syncer::SyncError(const tracked_objects::Location&,
|
| - const syncer::SyncChangeList&));
|
| - virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type)
|
| - const OVERRIDE { return syncer::SyncDataList(); }
|
| -};
|
| -
|
| -class TestSyncChangeProcessor : public syncer::SyncChangeProcessor {
|
| - public:
|
| - TestSyncChangeProcessor() {}
|
| - virtual ~TestSyncChangeProcessor() {}
|
| -
|
| - virtual syncer::SyncError ProcessSyncChanges(
|
| - const tracked_objects::Location& location,
|
| - const syncer::SyncChangeList& changes) OVERRIDE {
|
| - changes_ = changes;
|
| - return syncer::SyncError();
|
| - }
|
| -
|
| - virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
|
| - OVERRIDE {
|
| - return syncer::SyncDataList();
|
| - }
|
| -
|
| - const syncer::SyncChangeList& changes() { return changes_; }
|
| -
|
| - private:
|
| - syncer::SyncChangeList changes_;
|
| -};
|
| -
|
| -// Returns a profile with all fields set. Contains identical data to the data
|
| -// returned from ConstructCompleteSyncData().
|
| -scoped_ptr<AutofillProfile> ConstructCompleteProfile() {
|
| - scoped_ptr<AutofillProfile> profile(
|
| - new AutofillProfile(kGuid1, kHttpsOrigin));
|
| -
|
| - std::vector<base::string16> names;
|
| - names.push_back(ASCIIToUTF16("John K. Doe"));
|
| - names.push_back(ASCIIToUTF16("Jane Luise Smith"));
|
| - profile->SetRawMultiInfo(NAME_FULL, names);
|
| -
|
| - std::vector<base::string16> emails;
|
| - emails.push_back(ASCIIToUTF16("user@example.com"));
|
| - emails.push_back(ASCIIToUTF16("superuser@example.org"));
|
| - profile->SetRawMultiInfo(EMAIL_ADDRESS, emails);
|
| -
|
| - std::vector<base::string16> phones;
|
| - phones.push_back(ASCIIToUTF16("1.800.555.1234"));
|
| - phones.push_back(ASCIIToUTF16("1.866.650.0000"));
|
| - profile->SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, phones);
|
| -
|
| - profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS,
|
| - ASCIIToUTF16("123 Fake St.\n"
|
| - "Apt. 42"));
|
| - EXPECT_EQ(ASCIIToUTF16("123 Fake St."),
|
| - profile->GetRawInfo(ADDRESS_HOME_LINE1));
|
| - EXPECT_EQ(ASCIIToUTF16("Apt. 42"), profile->GetRawInfo(ADDRESS_HOME_LINE2));
|
| -
|
| - profile->SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Google, Inc."));
|
| - profile->SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Mountain View"));
|
| - profile->SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("California"));
|
| - profile->SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("94043"));
|
| - profile->SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
|
| - profile->SetRawInfo(ADDRESS_HOME_SORTING_CODE, ASCIIToUTF16("CEDEX"));
|
| - profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY,
|
| - ASCIIToUTF16("Santa Clara"));
|
| - return profile.Pass();
|
| -}
|
| -
|
| -// Returns SyncData with all Autofill profile fields set. Contains identical
|
| -// data to the data returned from ConstructCompleteProfile().
|
| -syncer::SyncData ConstructCompleteSyncData() {
|
| - sync_pb::EntitySpecifics entity_specifics;
|
| - sync_pb::AutofillProfileSpecifics* specifics =
|
| - entity_specifics.mutable_autofill_profile();
|
| -
|
| - specifics->set_guid(kGuid1);
|
| - specifics->set_origin(kHttpsOrigin);
|
| -
|
| - specifics->add_name_first("John");
|
| - specifics->add_name_middle("K.");
|
| - specifics->add_name_last("Doe");
|
| -
|
| - specifics->add_name_first("Jane");
|
| - specifics->add_name_middle("Luise");
|
| - specifics->add_name_last("Smith");
|
| -
|
| - specifics->add_email_address("user@example.com");
|
| - specifics->add_email_address("superuser@example.org");
|
| -
|
| - specifics->add_phone_home_whole_number("1.800.555.1234");
|
| - specifics->add_phone_home_whole_number("1.866.650.0000");
|
| -
|
| - specifics->set_address_home_line1("123 Fake St.");
|
| - specifics->set_address_home_line2("Apt. 42");
|
| - specifics->set_address_home_street_address("123 Fake St.\n"
|
| - "Apt. 42");
|
| -
|
| - specifics->set_company_name("Google, Inc.");
|
| - specifics->set_address_home_city("Mountain View");
|
| - specifics->set_address_home_state("California");
|
| - specifics->set_address_home_zip("94043");
|
| - specifics->set_address_home_country("US");
|
| - specifics->set_address_home_sorting_code("CEDEX");
|
| - specifics->set_address_home_dependent_locality("Santa Clara");
|
| -
|
| - return syncer::SyncData::CreateLocalData(kGuid1, kGuid1, entity_specifics);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -class AutofillProfileSyncableServiceTest : public testing::Test {
|
| - public:
|
| - AutofillProfileSyncableServiceTest()
|
| - : ui_thread_(BrowserThread::UI, &message_loop_),
|
| - db_thread_(BrowserThread::DB, &message_loop_) {}
|
| -
|
| - virtual void SetUp() OVERRIDE {
|
| - sync_processor_.reset(new MockSyncChangeProcessor);
|
| - }
|
| -
|
| - // Wrapper around AutofillProfileSyncableService::MergeDataAndStartSyncing()
|
| - // that also verifies expectations.
|
| - void MergeDataAndStartSyncing(
|
| - const std::vector<AutofillProfile*>& profiles_from_web_db,
|
| - const syncer::SyncDataList& data_list,
|
| - const MockAutofillProfileSyncableService::DataBundle& expected_bundle,
|
| - const syncer::SyncChangeList& expected_change_list) {
|
| - EXPECT_CALL(autofill_syncable_service_, LoadAutofillData(_))
|
| - .Times(1)
|
| - .WillOnce(DoAll(CopyData(&profiles_from_web_db), Return(true)));
|
| - EXPECT_CALL(autofill_syncable_service_,
|
| - SaveChangesToWebData(DataBundleCheck(expected_bundle)))
|
| - .Times(1)
|
| - .WillOnce(Return(true));
|
| - if (expected_change_list.empty()) {
|
| - EXPECT_CALL(*sync_processor_, ProcessSyncChanges(_, _)).Times(0);
|
| - } else {
|
| - ON_CALL(*sync_processor_, ProcessSyncChanges(_, _))
|
| - .WillByDefault(Return(syncer::SyncError()));
|
| - EXPECT_CALL(*sync_processor_,
|
| - ProcessSyncChanges(_, CheckSyncChanges(expected_change_list)))
|
| - .Times(1)
|
| - .WillOnce(Return(syncer::SyncError()));
|
| - }
|
| -
|
| - // Takes ownership of sync_processor_.
|
| - autofill_syncable_service_.MergeDataAndStartSyncing(
|
| - syncer::AUTOFILL_PROFILE, data_list,
|
| - sync_processor_.PassAs<syncer::SyncChangeProcessor>(),
|
| - scoped_ptr<syncer::SyncErrorFactory>(
|
| - new syncer::SyncErrorFactoryMock()));
|
| - }
|
| -
|
| - protected:
|
| - base::MessageLoop message_loop_;
|
| - content::TestBrowserThread ui_thread_;
|
| - content::TestBrowserThread db_thread_;
|
| - MockAutofillProfileSyncableService autofill_syncable_service_;
|
| - scoped_ptr<MockSyncChangeProcessor> sync_processor_;
|
| -};
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, MergeDataAndStartSyncing) {
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| - std::string guid_present1 = kGuid1;
|
| - std::string guid_present2 = kGuid2;
|
| - std::string guid_synced1 = kGuid3;
|
| - std::string guid_synced2 = kGuid4;
|
| - std::string origin_present1 = kHttpOrigin;
|
| - std::string origin_present2 = std::string();
|
| - std::string origin_synced1 = kHttpsOrigin;
|
| - std::string origin_synced2 = kSettingsOrigin;
|
| -
|
| - profiles_from_web_db.push_back(
|
| - new AutofillProfile(guid_present1, origin_present1));
|
| - profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, UTF8ToUTF16("John"));
|
| - profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1,
|
| - UTF8ToUTF16("1 1st st"));
|
| - profiles_from_web_db.push_back(
|
| - new AutofillProfile(guid_present2, origin_present2));
|
| - profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, UTF8ToUTF16("Tom"));
|
| - profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1,
|
| - UTF8ToUTF16("2 2nd st"));
|
| -
|
| - syncer::SyncDataList data_list;
|
| - AutofillProfile profile1(guid_synced1, origin_synced1);
|
| - profile1.SetRawInfo(NAME_FIRST, UTF8ToUTF16("Jane"));
|
| - data_list.push_back(autofill_syncable_service_.CreateData(profile1));
|
| - AutofillProfile profile2(guid_synced2, origin_synced2);
|
| - profile2.SetRawInfo(NAME_FIRST, UTF8ToUTF16("Harry"));
|
| - data_list.push_back(autofill_syncable_service_.CreateData(profile2));
|
| - // This one will have the name and origin updated.
|
| - AutofillProfile profile3(guid_present2, origin_synced2);
|
| - profile3.SetRawInfo(NAME_FIRST, UTF8ToUTF16("Tom Doe"));
|
| - data_list.push_back(autofill_syncable_service_.CreateData(profile3));
|
| -
|
| - syncer::SyncChangeList expected_change_list;
|
| - expected_change_list.push_back(
|
| - syncer::SyncChange(FROM_HERE,
|
| - syncer::SyncChange::ACTION_ADD,
|
| - MockAutofillProfileSyncableService::CreateData(
|
| - *profiles_from_web_db.front())));
|
| -
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - expected_bundle.profiles_to_add.push_back(&profile1);
|
| - expected_bundle.profiles_to_add.push_back(&profile2);
|
| - expected_bundle.profiles_to_update.push_back(&profile3);
|
| -
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, MergeIdenticalProfiles) {
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| - std::string guid_present1 = kGuid1;
|
| - std::string guid_present2 = kGuid2;
|
| - std::string guid_synced1 = kGuid3;
|
| - std::string guid_synced2 = kGuid4;
|
| - std::string origin_present1 = kHttpOrigin;
|
| - std::string origin_present2 = kSettingsOrigin;
|
| - std::string origin_synced1 = kHttpsOrigin;
|
| - std::string origin_synced2 = kHttpsOrigin;
|
| -
|
| - profiles_from_web_db.push_back(
|
| - new AutofillProfile(guid_present1, origin_present1));
|
| - profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, UTF8ToUTF16("John"));
|
| - profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1,
|
| - UTF8ToUTF16("1 1st st"));
|
| - profiles_from_web_db.push_back(
|
| - new AutofillProfile(guid_present2, origin_present2));
|
| - profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, UTF8ToUTF16("Tom"));
|
| - profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1,
|
| - UTF8ToUTF16("2 2nd st"));
|
| -
|
| - // The synced profiles are identical to the local ones, except that the guids
|
| - // are different.
|
| - syncer::SyncDataList data_list;
|
| - AutofillProfile profile1(guid_synced1, origin_synced1);
|
| - profile1.SetRawInfo(NAME_FIRST, UTF8ToUTF16("John"));
|
| - profile1.SetRawInfo(ADDRESS_HOME_LINE1, UTF8ToUTF16("1 1st st"));
|
| - data_list.push_back(autofill_syncable_service_.CreateData(profile1));
|
| - AutofillProfile profile2(guid_synced2, origin_synced2);
|
| - profile2.SetRawInfo(NAME_FIRST, UTF8ToUTF16("Tom"));
|
| - profile2.SetRawInfo(ADDRESS_HOME_LINE1, UTF8ToUTF16("2 2nd st"));
|
| - data_list.push_back(autofill_syncable_service_.CreateData(profile2));
|
| -
|
| - AutofillProfile expected_profile(profile2);
|
| - expected_profile.set_origin(kSettingsOrigin);
|
| - syncer::SyncChangeList expected_change_list;
|
| - expected_change_list.push_back(
|
| - syncer::SyncChange(FROM_HERE,
|
| - syncer::SyncChange::ACTION_UPDATE,
|
| - MockAutofillProfileSyncableService::CreateData(
|
| - expected_profile)));
|
| -
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - expected_bundle.profiles_to_delete.push_back(guid_present1);
|
| - expected_bundle.profiles_to_delete.push_back(guid_present2);
|
| - expected_bundle.profiles_to_add.push_back(&profile1);
|
| - expected_bundle.profiles_to_add.push_back(&expected_profile);
|
| -
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, MergeSimilarProfiles) {
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| - std::string guid_present1 = kGuid1;
|
| - std::string guid_present2 = kGuid2;
|
| - std::string guid_synced1 = kGuid3;
|
| - std::string guid_synced2 = kGuid4;
|
| - std::string origin_present1 = kHttpOrigin;
|
| - std::string origin_present2 = kSettingsOrigin;
|
| - std::string origin_synced1 = kHttpsOrigin;
|
| - std::string origin_synced2 = kHttpsOrigin;
|
| -
|
| - profiles_from_web_db.push_back(
|
| - new AutofillProfile(guid_present1, origin_present1));
|
| - profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, UTF8ToUTF16("John"));
|
| - profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1,
|
| - UTF8ToUTF16("1 1st st"));
|
| - profiles_from_web_db.push_back(
|
| - new AutofillProfile(guid_present2, origin_present2));
|
| - profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, UTF8ToUTF16("Tom"));
|
| - profiles_from_web_db.back()->SetRawInfo(ADDRESS_HOME_LINE1,
|
| - UTF8ToUTF16("2 2nd st"));
|
| -
|
| - // The synced profiles are identical to the local ones, except that the guids
|
| - // are different.
|
| - syncer::SyncDataList data_list;
|
| - AutofillProfile profile1(guid_synced1, origin_synced1);
|
| - profile1.SetRawInfo(NAME_FIRST, UTF8ToUTF16("John"));
|
| - profile1.SetRawInfo(ADDRESS_HOME_LINE1, UTF8ToUTF16("1 1st st"));
|
| - profile1.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frobbers, Inc."));
|
| - data_list.push_back(autofill_syncable_service_.CreateData(profile1));
|
| - AutofillProfile profile2(guid_synced2, origin_synced2);
|
| - profile2.SetRawInfo(NAME_FIRST, UTF8ToUTF16("Tom"));
|
| - profile2.SetRawInfo(ADDRESS_HOME_LINE1, UTF8ToUTF16("2 2nd st"));
|
| - profile2.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Fizzbang, LLC."));
|
| - data_list.push_back(autofill_syncable_service_.CreateData(profile2));
|
| -
|
| - // The first profile should have its origin updated.
|
| - // The second profile should remain as-is, because an unverified profile
|
| - // should never overwrite a verified one.
|
| - AutofillProfile expected_profile(profile1);
|
| - expected_profile.set_origin(origin_present1);
|
| - syncer::SyncChangeList expected_change_list;
|
| - expected_change_list.push_back(
|
| - syncer::SyncChange(FROM_HERE,
|
| - syncer::SyncChange::ACTION_ADD,
|
| - MockAutofillProfileSyncableService::CreateData(
|
| - *profiles_from_web_db.back())));
|
| - expected_change_list.push_back(
|
| - syncer::SyncChange(FROM_HERE,
|
| - syncer::SyncChange::ACTION_UPDATE,
|
| - MockAutofillProfileSyncableService::CreateData(
|
| - expected_profile)));
|
| -
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - expected_bundle.profiles_to_delete.push_back(guid_present1);
|
| - expected_bundle.profiles_to_add.push_back(&expected_profile);
|
| - expected_bundle.profiles_to_add.push_back(&profile2);
|
| -
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -// Ensure that no Sync events are generated to fill in missing origins from Sync
|
| -// with explicitly present empty ones. This ensures that the migration to add
|
| -// origins to profiles does not generate lots of needless Sync updates.
|
| -TEST_F(AutofillProfileSyncableServiceTest, MergeDataEmptyOrigins) {
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| -
|
| - // Create a profile with an empty origin.
|
| - AutofillProfile profile(kGuid1, std::string());
|
| - profile.SetRawInfo(NAME_FIRST, UTF8ToUTF16("John"));
|
| - profile.SetRawInfo(ADDRESS_HOME_LINE1, UTF8ToUTF16("1 1st st"));
|
| -
|
| - profiles_from_web_db.push_back(new AutofillProfile(profile));
|
| -
|
| - // Create a Sync profile identical to |profile|, except with no origin set.
|
| - sync_pb::EntitySpecifics specifics;
|
| - sync_pb::AutofillProfileSpecifics* autofill_specifics =
|
| - specifics.mutable_autofill_profile();
|
| - autofill_specifics->set_guid(profile.guid());
|
| - autofill_specifics->add_name_first("John");
|
| - autofill_specifics->add_name_middle(std::string());
|
| - autofill_specifics->add_name_last(std::string());
|
| - autofill_specifics->add_email_address(std::string());
|
| - autofill_specifics->add_phone_home_whole_number(std::string());
|
| - autofill_specifics->set_address_home_line1("1 1st st");
|
| - EXPECT_FALSE(autofill_specifics->has_origin());
|
| -
|
| - syncer::SyncDataList data_list;
|
| - data_list.push_back(
|
| - syncer::SyncData::CreateLocalData(
|
| - profile.guid(), profile.guid(), specifics));
|
| -
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - syncer::SyncChangeList expected_change_list;
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, GetAllSyncData) {
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| - std::string guid_present1 = kGuid1;
|
| - std::string guid_present2 = kGuid2;
|
| -
|
| - profiles_from_web_db.push_back(
|
| - new AutofillProfile(guid_present1, kHttpOrigin));
|
| - profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, UTF8ToUTF16("John"));
|
| - profiles_from_web_db.push_back(
|
| - new AutofillProfile(guid_present2, kHttpsOrigin));
|
| - profiles_from_web_db.back()->SetRawInfo(NAME_FIRST, UTF8ToUTF16("Jane"));
|
| -
|
| - syncer::SyncChangeList expected_change_list;
|
| - expected_change_list.push_back(
|
| - syncer::SyncChange(FROM_HERE,
|
| - syncer::SyncChange::ACTION_ADD,
|
| - MockAutofillProfileSyncableService::CreateData(
|
| - *profiles_from_web_db.front())));
|
| - expected_change_list.push_back(
|
| - syncer::SyncChange(FROM_HERE,
|
| - syncer::SyncChange::ACTION_ADD,
|
| - MockAutofillProfileSyncableService::CreateData(
|
| - *profiles_from_web_db.back())));
|
| -
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - syncer::SyncDataList data_list;
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| -
|
| - syncer::SyncDataList data =
|
| - autofill_syncable_service_.GetAllSyncData(syncer::AUTOFILL_PROFILE);
|
| -
|
| - ASSERT_EQ(2U, data.size());
|
| - EXPECT_EQ(guid_present1, data[0].GetSpecifics().autofill_profile().guid());
|
| - EXPECT_EQ(guid_present2, data[1].GetSpecifics().autofill_profile().guid());
|
| - EXPECT_EQ(kHttpOrigin, data[0].GetSpecifics().autofill_profile().origin());
|
| - EXPECT_EQ(kHttpsOrigin, data[1].GetSpecifics().autofill_profile().origin());
|
| -
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, ProcessSyncChanges) {
|
| - std::vector<AutofillProfile *> profiles_from_web_db;
|
| - std::string guid_present = kGuid1;
|
| - std::string guid_synced = kGuid2;
|
| -
|
| - syncer::SyncChangeList change_list;
|
| - AutofillProfile profile(guid_synced, kHttpOrigin);
|
| - profile.SetRawInfo(NAME_FIRST, UTF8ToUTF16("Jane"));
|
| - change_list.push_back(
|
| - syncer::SyncChange(
|
| - FROM_HERE,
|
| - syncer::SyncChange::ACTION_ADD,
|
| - MockAutofillProfileSyncableService::CreateData(profile)));
|
| - AutofillProfile empty_profile(guid_present, kHttpsOrigin);
|
| - change_list.push_back(
|
| - syncer::SyncChange(
|
| - FROM_HERE,
|
| - syncer::SyncChange::ACTION_DELETE,
|
| - MockAutofillProfileSyncableService::CreateData(empty_profile)));
|
| -
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - expected_bundle.profiles_to_delete.push_back(guid_present);
|
| - expected_bundle.profiles_to_add.push_back(&profile);
|
| -
|
| - EXPECT_CALL(autofill_syncable_service_, SaveChangesToWebData(
|
| - DataBundleCheck(expected_bundle)))
|
| - .Times(1)
|
| - .WillOnce(Return(true));
|
| -
|
| - autofill_syncable_service_.set_sync_processor(sync_processor_.release());
|
| - syncer::SyncError error = autofill_syncable_service_.ProcessSyncChanges(
|
| - FROM_HERE, change_list);
|
| -
|
| - EXPECT_FALSE(error.IsSet());
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, AutofillProfileAdded) {
|
| - // Will be owned by the syncable service. Keep a reference available here for
|
| - // verifying test expectations.
|
| - TestSyncChangeProcessor* sync_change_processor = new TestSyncChangeProcessor;
|
| - autofill_syncable_service_.set_sync_processor(sync_change_processor);
|
| -
|
| - AutofillProfile profile(kGuid1, kHttpsOrigin);
|
| - profile.SetRawInfo(NAME_FIRST, UTF8ToUTF16("Jane"));
|
| - AutofillProfileChange change(AutofillProfileChange::ADD, kGuid1, &profile);
|
| - autofill_syncable_service_.AutofillProfileChanged(change);
|
| -
|
| - ASSERT_EQ(1U, sync_change_processor->changes().size());
|
| - syncer::SyncChange result = sync_change_processor->changes()[0];
|
| - EXPECT_EQ(syncer::SyncChange::ACTION_ADD, result.change_type());
|
| -
|
| - sync_pb::AutofillProfileSpecifics specifics =
|
| - result.sync_data().GetSpecifics().autofill_profile();
|
| - EXPECT_EQ(kGuid1, specifics.guid());
|
| - EXPECT_EQ(kHttpsOrigin, specifics.origin());
|
| - EXPECT_THAT(specifics.name_first(), testing::ElementsAre("Jane"));
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, AutofillProfileDeleted) {
|
| - // Will be owned by the syncable service. Keep a reference available here for
|
| - // verifying test expectations.
|
| - TestSyncChangeProcessor* sync_change_processor = new TestSyncChangeProcessor;
|
| - autofill_syncable_service_.set_sync_processor(sync_change_processor);
|
| -
|
| - AutofillProfileChange change(AutofillProfileChange::REMOVE, kGuid2, NULL);
|
| - autofill_syncable_service_.AutofillProfileChanged(change);
|
| -
|
| - ASSERT_EQ(1U, sync_change_processor->changes().size());
|
| - syncer::SyncChange result = sync_change_processor->changes()[0];
|
| - EXPECT_EQ(syncer::SyncChange::ACTION_DELETE, result.change_type());
|
| - sync_pb::AutofillProfileSpecifics specifics =
|
| - result.sync_data().GetSpecifics().autofill_profile();
|
| - EXPECT_EQ(kGuid2, specifics.guid());
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, UpdateField) {
|
| - AutofillProfile profile(kGuid1, kSettingsOrigin);
|
| - std::string company1 = "A Company";
|
| - std::string company2 = "Another Company";
|
| - profile.SetRawInfo(COMPANY_NAME, UTF8ToUTF16(company1));
|
| - EXPECT_FALSE(AutofillProfileSyncableService::UpdateField(
|
| - COMPANY_NAME, company1, &profile));
|
| - EXPECT_EQ(profile.GetRawInfo(COMPANY_NAME), UTF8ToUTF16(company1));
|
| - EXPECT_TRUE(AutofillProfileSyncableService::UpdateField(
|
| - COMPANY_NAME, company2, &profile));
|
| - EXPECT_EQ(profile.GetRawInfo(COMPANY_NAME), UTF8ToUTF16(company2));
|
| - EXPECT_FALSE(AutofillProfileSyncableService::UpdateField(
|
| - COMPANY_NAME, company2, &profile));
|
| - EXPECT_EQ(profile.GetRawInfo(COMPANY_NAME), UTF8ToUTF16(company2));
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, UpdateMultivaluedField) {
|
| - AutofillProfile profile(kGuid1, kHttpsOrigin);
|
| -
|
| - std::vector<base::string16> values;
|
| - values.push_back(UTF8ToUTF16("1@1.com"));
|
| - values.push_back(UTF8ToUTF16("2@1.com"));
|
| - profile.SetRawMultiInfo(EMAIL_ADDRESS, values);
|
| -
|
| - ::google::protobuf::RepeatedPtrField<std::string> specifics_fields;
|
| - specifics_fields.AddAllocated(new std::string("2@1.com"));
|
| - specifics_fields.AddAllocated(new std::string("3@1.com"));
|
| -
|
| - EXPECT_TRUE(AutofillProfileSyncableService::UpdateMultivaluedField(
|
| - EMAIL_ADDRESS, specifics_fields, &profile));
|
| - profile.GetRawMultiInfo(EMAIL_ADDRESS, &values);
|
| - ASSERT_TRUE(values.size() == 2);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("2@1.com"));
|
| - EXPECT_EQ(values[1], UTF8ToUTF16("3@1.com"));
|
| -
|
| - EXPECT_FALSE(AutofillProfileSyncableService::UpdateMultivaluedField(
|
| - EMAIL_ADDRESS, specifics_fields, &profile));
|
| - profile.GetRawMultiInfo(EMAIL_ADDRESS, &values);
|
| - ASSERT_EQ(values.size(), 2U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("2@1.com"));
|
| - EXPECT_EQ(values[1], UTF8ToUTF16("3@1.com"));
|
| - EXPECT_TRUE(AutofillProfileSyncableService::UpdateMultivaluedField(
|
| - EMAIL_ADDRESS, ::google::protobuf::RepeatedPtrField<std::string>(),
|
| - &profile));
|
| - profile.GetRawMultiInfo(EMAIL_ADDRESS, &values);
|
| - ASSERT_EQ(values.size(), 1U); // Always have at least an empty string.
|
| - EXPECT_EQ(values[0], UTF8ToUTF16(""));
|
| -}
|
| -
|
| -TEST_F(AutofillProfileSyncableServiceTest, MergeProfile) {
|
| - AutofillProfile profile1(kGuid1, kHttpOrigin);
|
| - profile1.SetRawInfo(ADDRESS_HOME_LINE1, UTF8ToUTF16("111 First St."));
|
| -
|
| - std::vector<base::string16> values;
|
| - values.push_back(UTF8ToUTF16("1@1.com"));
|
| - values.push_back(UTF8ToUTF16("2@1.com"));
|
| - profile1.SetRawMultiInfo(EMAIL_ADDRESS, values);
|
| -
|
| - AutofillProfile profile2(kGuid2, kHttpsOrigin);
|
| - profile2.SetRawInfo(ADDRESS_HOME_LINE1, UTF8ToUTF16("111 First St."));
|
| -
|
| - // |values| now is [ "1@1.com", "2@1.com", "3@1.com" ].
|
| - values.push_back(UTF8ToUTF16("3@1.com"));
|
| - profile2.SetRawMultiInfo(EMAIL_ADDRESS, values);
|
| -
|
| - values.clear();
|
| - values.push_back(UTF8ToUTF16("John"));
|
| - profile1.SetRawMultiInfo(NAME_FIRST, values);
|
| - values.push_back(UTF8ToUTF16("Jane"));
|
| - profile2.SetRawMultiInfo(NAME_FIRST, values);
|
| -
|
| - values.clear();
|
| - values.push_back(UTF8ToUTF16("Doe"));
|
| - profile1.SetRawMultiInfo(NAME_LAST, values);
|
| - values.push_back(UTF8ToUTF16("Other"));
|
| - profile2.SetRawMultiInfo(NAME_LAST, values);
|
| -
|
| - values.clear();
|
| - values.push_back(UTF8ToUTF16("650234567"));
|
| - profile2.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, values);
|
| -
|
| - EXPECT_FALSE(AutofillProfileSyncableService::MergeProfile(profile2,
|
| - &profile1,
|
| - "en-US"));
|
| -
|
| - profile1.GetRawMultiInfo(NAME_FIRST, &values);
|
| - ASSERT_EQ(values.size(), 2U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("John"));
|
| - EXPECT_EQ(values[1], UTF8ToUTF16("Jane"));
|
| -
|
| - profile1.GetRawMultiInfo(NAME_LAST, &values);
|
| - ASSERT_EQ(values.size(), 2U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("Doe"));
|
| - EXPECT_EQ(values[1], UTF8ToUTF16("Other"));
|
| -
|
| - profile1.GetRawMultiInfo(EMAIL_ADDRESS, &values);
|
| - ASSERT_EQ(values.size(), 3U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("1@1.com"));
|
| - EXPECT_EQ(values[1], UTF8ToUTF16("2@1.com"));
|
| - EXPECT_EQ(values[2], UTF8ToUTF16("3@1.com"));
|
| -
|
| - profile1.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &values);
|
| - ASSERT_EQ(values.size(), 1U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("650234567"));
|
| -
|
| - EXPECT_EQ(profile2.origin(), profile1.origin());
|
| -
|
| - AutofillProfile profile3(kGuid3, kHttpOrigin);
|
| - profile3.SetRawInfo(ADDRESS_HOME_LINE1, UTF8ToUTF16("111 First St."));
|
| -
|
| - values.clear();
|
| - values.push_back(UTF8ToUTF16("Jane"));
|
| - profile3.SetRawMultiInfo(NAME_FIRST, values);
|
| -
|
| - values.clear();
|
| - values.push_back(UTF8ToUTF16("Doe"));
|
| - profile3.SetRawMultiInfo(NAME_LAST, values);
|
| -
|
| - EXPECT_TRUE(AutofillProfileSyncableService::MergeProfile(profile3,
|
| - &profile1,
|
| - "en-US"));
|
| -
|
| - profile1.GetRawMultiInfo(NAME_FIRST, &values);
|
| - ASSERT_EQ(values.size(), 3U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("John"));
|
| - EXPECT_EQ(values[1], UTF8ToUTF16("Jane"));
|
| - EXPECT_EQ(values[2], UTF8ToUTF16("Jane"));
|
| -
|
| - profile1.GetRawMultiInfo(NAME_LAST, &values);
|
| - ASSERT_EQ(values.size(), 3U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("Doe"));
|
| - EXPECT_EQ(values[1], UTF8ToUTF16("Other"));
|
| - EXPECT_EQ(values[2], UTF8ToUTF16("Doe"));
|
| -
|
| - // Middle name should have three entries as well.
|
| - profile1.GetRawMultiInfo(NAME_MIDDLE, &values);
|
| - ASSERT_EQ(values.size(), 3U);
|
| - EXPECT_TRUE(values[0].empty());
|
| - EXPECT_TRUE(values[1].empty());
|
| - EXPECT_TRUE(values[2].empty());
|
| -
|
| - profile1.GetRawMultiInfo(EMAIL_ADDRESS, &values);
|
| - ASSERT_EQ(values.size(), 3U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("1@1.com"));
|
| - EXPECT_EQ(values[1], UTF8ToUTF16("2@1.com"));
|
| - EXPECT_EQ(values[2], UTF8ToUTF16("3@1.com"));
|
| -
|
| - profile1.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &values);
|
| - ASSERT_EQ(values.size(), 1U);
|
| - EXPECT_EQ(values[0], UTF8ToUTF16("650234567"));
|
| -}
|
| -
|
| -// Ensure that all profile fields are able to be synced up from the client to
|
| -// the server.
|
| -TEST_F(AutofillProfileSyncableServiceTest, SyncAllFieldsToServer) {
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| -
|
| - // Create a profile with all fields set.
|
| - profiles_from_web_db.push_back(ConstructCompleteProfile().release());
|
| -
|
| - // Set up expectations: No changes to the WebDB, and all fields correctly
|
| - // copied to Sync.
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - syncer::SyncChangeList expected_change_list;
|
| - expected_change_list.push_back(
|
| - syncer::SyncChange(FROM_HERE,
|
| - syncer::SyncChange::ACTION_ADD,
|
| - ConstructCompleteSyncData()));
|
| -
|
| - // Verify the expectations.
|
| - syncer::SyncDataList data_list;
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -// Ensure that all profile fields are able to be synced down from the server to
|
| -// the client.
|
| -TEST_F(AutofillProfileSyncableServiceTest, SyncAllFieldsToClient) {
|
| - // Create a profile with all fields set.
|
| - syncer::SyncDataList data_list;
|
| - data_list.push_back(ConstructCompleteSyncData());
|
| -
|
| - // Set up expectations: All fields correctly copied to the WebDB, and no
|
| - // changes propagated to Sync.
|
| - syncer::SyncChangeList expected_change_list;
|
| - scoped_ptr<AutofillProfile> expected_profile = ConstructCompleteProfile();
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - expected_bundle.profiles_to_add.push_back(expected_profile.get());
|
| -
|
| - // Verify the expectations.
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -// Ensure that the street address field takes precedence over the address line 1
|
| -// and line 2 fields, even though these are expected to always be in sync in
|
| -// practice.
|
| -TEST_F(AutofillProfileSyncableServiceTest,
|
| - StreetAddressTakesPrecedenceOverAddressLines) {
|
| - // Create a Sync profile with conflicting address data in the street address
|
| - // field vs. the address line 1 and address line 2 fields.
|
| - sync_pb::EntitySpecifics specifics;
|
| - sync_pb::AutofillProfileSpecifics* autofill_specifics =
|
| - specifics.mutable_autofill_profile();
|
| - autofill_specifics->set_guid(kGuid1);
|
| - autofill_specifics->set_origin(kHttpsOrigin);
|
| - autofill_specifics->add_name_first(std::string());
|
| - autofill_specifics->add_name_middle(std::string());
|
| - autofill_specifics->add_name_last(std::string());
|
| - autofill_specifics->add_email_address(std::string());
|
| - autofill_specifics->add_phone_home_whole_number(std::string());
|
| - autofill_specifics->set_address_home_line1("123 Example St.");
|
| - autofill_specifics->set_address_home_line2("Apt. 42");
|
| - autofill_specifics->set_address_home_street_address("456 El Camino Real\n"
|
| - "Suite #1337");
|
| -
|
| - syncer::SyncDataList data_list;
|
| - data_list.push_back(
|
| - syncer::SyncData::CreateLocalData(kGuid1, kGuid1, specifics));
|
| -
|
| - // Set up expectations: Full street address takes precedence over address
|
| - // lines.
|
| - syncer::SyncChangeList expected_change_list;
|
| - AutofillProfile expected_profile(kGuid1, kHttpsOrigin);
|
| - expected_profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS,
|
| - ASCIIToUTF16("456 El Camino Real\n"
|
| - "Suite #1337"));
|
| - EXPECT_EQ(ASCIIToUTF16("456 El Camino Real"),
|
| - expected_profile.GetRawInfo(ADDRESS_HOME_LINE1));
|
| - EXPECT_EQ(ASCIIToUTF16("Suite #1337"),
|
| - expected_profile.GetRawInfo(ADDRESS_HOME_LINE2));
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - expected_bundle.profiles_to_add.push_back(&expected_profile);
|
| -
|
| - // Verify the expectations.
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -// Ensure that no Sync events are generated to fill in missing street address
|
| -// fields from Sync with explicitly present ones identical to the data stored in
|
| -// the line1 and line2 fields. This ensures that the migration to add the
|
| -// street address field to profiles does not generate lots of needless Sync
|
| -// updates.
|
| -TEST_F(AutofillProfileSyncableServiceTest, MergeDataEmptyStreetAddress) {
|
| - std::vector<AutofillProfile*> profiles_from_web_db;
|
| -
|
| - // Create a profile with the street address set.
|
| - AutofillProfile profile(kGuid1, kHttpsOrigin);
|
| - profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS,
|
| - ASCIIToUTF16("123 Example St.\n"
|
| - "Apt. 42"));
|
| - EXPECT_EQ(ASCIIToUTF16("123 Example St."),
|
| - profile.GetRawInfo(ADDRESS_HOME_LINE1));
|
| - EXPECT_EQ(ASCIIToUTF16("Apt. 42"), profile.GetRawInfo(ADDRESS_HOME_LINE2));
|
| -
|
| - profiles_from_web_db.push_back(new AutofillProfile(profile));
|
| -
|
| - // Create a Sync profile identical to |profile|, except without street address
|
| - // explicitly set.
|
| - sync_pb::EntitySpecifics specifics;
|
| - sync_pb::AutofillProfileSpecifics* autofill_specifics =
|
| - specifics.mutable_autofill_profile();
|
| - autofill_specifics->set_guid(profile.guid());
|
| - autofill_specifics->set_origin(profile.origin());
|
| - autofill_specifics->add_name_first(std::string());
|
| - autofill_specifics->add_name_middle(std::string());
|
| - autofill_specifics->add_name_last(std::string());
|
| - autofill_specifics->add_email_address(std::string());
|
| - autofill_specifics->add_phone_home_whole_number(std::string());
|
| - autofill_specifics->set_address_home_line1("123 Example St.");
|
| - autofill_specifics->set_address_home_line2("Apt. 42");
|
| - EXPECT_FALSE(autofill_specifics->has_address_home_street_address());
|
| -
|
| - syncer::SyncDataList data_list;
|
| - data_list.push_back(
|
| - syncer::SyncData::CreateLocalData(
|
| - profile.guid(), profile.guid(), specifics));
|
| -
|
| - MockAutofillProfileSyncableService::DataBundle expected_bundle;
|
| - syncer::SyncChangeList expected_change_list;
|
| - MergeDataAndStartSyncing(
|
| - profiles_from_web_db, data_list, expected_bundle, expected_change_list);
|
| - autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
|
| -}
|
| -
|
| -} // namespace autofill
|
|
|