Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6923)

Unified Diff: chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc

Issue 127403002: [Autofill, Sync] Sync additional Autofill address fields for i18n. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/webdata/autofill_profile_syncable_service.cc ('k') | sync/protocol/autofill_specifics.proto » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
index 93546e84903924bd9fa521cfe5a9dd7652d38701..a9aaa6eafcb732b153b8b9f775610bd10ae85c48 100644
--- a/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc
+++ b/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc
@@ -22,9 +22,12 @@ 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";
@@ -64,8 +67,8 @@ MATCHER_P(CheckSyncChanges, n_sync_changes_list, "") {
DCHECK(passed->IsValid());
if (passed->change_type() != expected->change_type())
return false;
- if (passed->sync_data().GetSpecifics().autofill_profile().guid() !=
- expected->sync_data().GetSpecifics().autofill_profile().guid()) {
+ if (passed->sync_data().GetSpecifics().SerializeAsString() !=
+ expected->sync_data().GetSpecifics().SerializeAsString()) {
return false;
}
}
@@ -127,6 +130,87 @@ class TestSyncChangeProcessor : public syncer::SyncChangeProcessor {
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()
@@ -151,12 +235,16 @@ class AutofillProfileSyncableServiceTest : public testing::Test {
SaveChangesToWebData(DataBundleCheck(expected_bundle)))
.Times(1)
.WillOnce(Return(true));
- ON_CALL(*sync_processor_, ProcessSyncChanges(_, _))
- .WillByDefault(Return(syncer::SyncError()));
- EXPECT_CALL(*sync_processor_,
- ProcessSyncChanges(_, CheckSyncChanges(expected_change_list)))
- .Times(1)
- .WillOnce(Return(syncer::SyncError()));
+ 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(
@@ -374,21 +462,9 @@ TEST_F(AutofillProfileSyncableServiceTest, MergeDataEmptyOrigins) {
profile.guid(), profile.guid(), specifics));
MockAutofillProfileSyncableService::DataBundle expected_bundle;
- 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));
- EXPECT_CALL(*sync_processor_, ProcessSyncChanges(_, _)).Times(0);
-
- // 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()));
-
+ syncer::SyncChangeList expected_change_list;
+ MergeDataAndStartSyncing(
+ profiles_from_web_db, data_list, expected_bundle, expected_change_list);
autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE);
}
@@ -660,4 +736,143 @@ TEST_F(AutofillProfileSyncableServiceTest, MergeProfile) {
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
« no previous file with comments | « chrome/browser/webdata/autofill_profile_syncable_service.cc ('k') | sync/protocol/autofill_specifics.proto » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698