Index: components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc |
diff --git a/components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc b/components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc |
index c816f1e5c22fcaf74d80dfde8bd7ed8f6cb30241..ddf6982c1c3cf6a8e8971511907957ea01852dcb 100644 |
--- a/components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc |
+++ b/components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc |
@@ -163,6 +163,7 @@ scoped_ptr<AutofillProfile> ConstructCompleteProfile() { |
profile->SetRawInfo(ADDRESS_HOME_SORTING_CODE, ASCIIToUTF16("CEDEX")); |
profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
ASCIIToUTF16("Santa Clara")); |
+ profile->set_language_code("en"); |
return profile.Pass(); |
} |
@@ -202,6 +203,7 @@ syncer::SyncData ConstructCompleteSyncData() { |
specifics->set_address_home_country("US"); |
specifics->set_address_home_sorting_code("CEDEX"); |
specifics->set_address_home_dependent_locality("Santa Clara"); |
+ specifics->set_address_home_language_code("en"); |
return syncer::SyncData::CreateLocalData(kGuid1, kGuid1, entity_specifics); |
} |
@@ -658,6 +660,8 @@ TEST_F(AutofillProfileSyncableServiceTest, MergeProfile) { |
values.push_back(ASCIIToUTF16("650234567")); |
profile2.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, values); |
+ profile1.set_language_code("en"); |
+ |
EXPECT_FALSE(AutofillProfileSyncableService::MergeProfile(profile2, |
&profile1, |
"en-US")); |
@@ -868,4 +872,228 @@ TEST_F(AutofillProfileSyncableServiceTest, MergeDataEmptyStreetAddress) { |
autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); |
} |
+// Sync data without origin should not overwrite existing origin in local |
+// autofill profile. |
+TEST_F(AutofillProfileSyncableServiceTest, EmptySyncPreservesOrigin) { |
+ std::vector<AutofillProfile*> profiles_from_web_db; |
+ |
+ // Local autofill profile has an origin. |
+ AutofillProfile profile(kGuid1, kHttpsOrigin); |
+ profiles_from_web_db.push_back(new AutofillProfile(profile)); |
+ |
+ // Remote data does not have an origin value. |
+ 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()); |
+ EXPECT_FALSE(autofill_specifics->has_origin()); |
+ |
+ syncer::SyncDataList data_list; |
+ data_list.push_back( |
+ syncer::SyncData::CreateLocalData( |
+ profile.guid(), profile.guid(), specifics)); |
+ |
+ // Expect the local autofill profile to still have an origin after sync. |
+ MockAutofillProfileSyncableService::DataBundle expected_bundle; |
+ AutofillProfile expected_profile(profile.guid(), profile.origin()); |
+ expected_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); |
+ expected_bundle.profiles_to_update.push_back(&expected_profile); |
+ |
+ // Expect no sync events to add origin to the remote data. |
+ syncer::SyncChangeList expected_empty_change_list; |
+ |
+ MergeDataAndStartSyncing(profiles_from_web_db, data_list, |
+ expected_bundle, expected_empty_change_list); |
+ autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); |
+} |
+ |
+// Missing language code field should not generate sync events. |
+TEST_F(AutofillProfileSyncableServiceTest, NoLanguageCodeNoSync) { |
+ std::vector<AutofillProfile*> profiles_from_web_db; |
+ |
+ // Local autofill profile has an empty language code. |
+ AutofillProfile profile(kGuid1, kHttpsOrigin); |
+ EXPECT_TRUE(profile.language_code().empty()); |
+ profiles_from_web_db.push_back(new AutofillProfile(profile)); |
+ |
+ // Remote data does not have a language code value. |
+ 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()); |
+ EXPECT_FALSE(autofill_specifics->has_address_home_language_code()); |
+ |
+ syncer::SyncDataList data_list; |
+ data_list.push_back( |
+ syncer::SyncData::CreateLocalData( |
+ profile.guid(), profile.guid(), specifics)); |
+ |
+ // Expect no changes to local and remote data. |
+ MockAutofillProfileSyncableService::DataBundle expected_empty_bundle; |
+ syncer::SyncChangeList expected_empty_change_list; |
+ |
+ MergeDataAndStartSyncing(profiles_from_web_db, data_list, |
+ expected_empty_bundle, expected_empty_change_list); |
+ autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); |
+} |
+ |
+// Empty language code should be overwritten by sync. |
+TEST_F(AutofillProfileSyncableServiceTest, SyncUpdatesEmptyLanguageCode) { |
+ std::vector<AutofillProfile*> profiles_from_web_db; |
+ |
+ // Local autofill profile has an empty language code. |
+ AutofillProfile profile(kGuid1, kHttpsOrigin); |
+ EXPECT_TRUE(profile.language_code().empty()); |
+ profiles_from_web_db.push_back(new AutofillProfile(profile)); |
+ |
+ // Remote data has "en" language code. |
+ 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_language_code("en"); |
+ EXPECT_TRUE(autofill_specifics->has_address_home_language_code()); |
+ |
+ syncer::SyncDataList data_list; |
+ data_list.push_back( |
+ syncer::SyncData::CreateLocalData( |
+ profile.guid(), profile.guid(), specifics)); |
+ |
+ // Expect the local autofill profile to have "en" language code after sync. |
+ MockAutofillProfileSyncableService::DataBundle expected_bundle; |
+ AutofillProfile expected_profile(kGuid1, kHttpsOrigin); |
+ expected_profile.set_language_code("en"); |
+ expected_bundle.profiles_to_update.push_back(&expected_profile); |
+ |
+ // Expect not changes to remote data. |
+ syncer::SyncChangeList expected_empty_change_list; |
+ |
+ MergeDataAndStartSyncing(profiles_from_web_db, data_list, |
+ expected_bundle, expected_empty_change_list); |
+ autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); |
+} |
+ |
+// Incorrect language code should be overwritten by sync. |
+TEST_F(AutofillProfileSyncableServiceTest, SyncUpdatesIncorrectLanguageCode) { |
+ std::vector<AutofillProfile*> profiles_from_web_db; |
+ |
+ // Local autofill profile has "de" language code. |
+ AutofillProfile profile(kGuid1, kHttpsOrigin); |
+ profile.set_language_code("de"); |
+ profiles_from_web_db.push_back(new AutofillProfile(profile)); |
+ |
+ // Remote data has "en" language code. |
+ 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_language_code("en"); |
+ EXPECT_TRUE(autofill_specifics->has_address_home_language_code()); |
+ |
+ syncer::SyncDataList data_list; |
+ data_list.push_back( |
+ syncer::SyncData::CreateLocalData( |
+ profile.guid(), profile.guid(), specifics)); |
+ |
+ // Expect the local autofill profile to have "en" language code after sync. |
+ MockAutofillProfileSyncableService::DataBundle expected_bundle; |
+ AutofillProfile expected_profile(kGuid1, kHttpsOrigin); |
+ expected_profile.set_language_code("en"); |
+ expected_bundle.profiles_to_update.push_back(&expected_profile); |
+ |
+ // Expect no changes to remote data. |
+ syncer::SyncChangeList expected_empty_change_list; |
+ |
+ MergeDataAndStartSyncing(profiles_from_web_db, data_list, |
+ expected_bundle, expected_empty_change_list); |
+ autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); |
+} |
+ |
+// Sync data without language code should not overwrite existing language code |
+// in local autofill profile. |
+TEST_F(AutofillProfileSyncableServiceTest, EmptySyncPreservesLanguageCode) { |
+ std::vector<AutofillProfile*> profiles_from_web_db; |
+ |
+ // Local autofill profile has "en" language code. |
+ AutofillProfile profile(kGuid1, kHttpsOrigin); |
+ profile.set_language_code("en"); |
+ profiles_from_web_db.push_back(new AutofillProfile(profile)); |
+ |
+ // Remote data does not have a language code value. |
+ 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("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()); |
+ EXPECT_FALSE(autofill_specifics->has_address_home_language_code()); |
+ |
+ syncer::SyncDataList data_list; |
+ data_list.push_back( |
+ syncer::SyncData::CreateLocalData( |
+ profile.guid(), profile.guid(), specifics)); |
+ |
+ // Expect local autofill profile to still have "en" language code after sync. |
+ MockAutofillProfileSyncableService::DataBundle expected_bundle; |
+ AutofillProfile expected_profile(profile.guid(), profile.origin()); |
+ expected_profile.set_language_code("en"); |
+ expected_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John")); |
+ expected_bundle.profiles_to_update.push_back(&expected_profile); |
+ |
+ // Expect no changes to remote data. |
+ syncer::SyncChangeList expected_empty_change_list; |
+ |
+ MergeDataAndStartSyncing(profiles_from_web_db, data_list, |
+ expected_bundle, expected_empty_change_list); |
+ autofill_syncable_service_.StopSyncing(syncer::AUTOFILL_PROFILE); |
+} |
+ |
+// Language code in autofill profiles should be synced to the server. |
+TEST_F(AutofillProfileSyncableServiceTest, LanguageCodePropagates) { |
+ TestSyncChangeProcessor* sync_change_processor = new TestSyncChangeProcessor; |
+ autofill_syncable_service_.set_sync_processor(sync_change_processor); |
+ |
+ AutofillProfile profile(kGuid1, kHttpsOrigin); |
+ profile.set_language_code("en"); |
+ 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_EQ("en", specifics.address_home_language_code()); |
+} |
+ |
} // namespace autofill |