Index: chrome/browser/search_engines/template_url_service_sync_unittest.cc |
diff --git a/chrome/browser/search_engines/template_url_service_sync_unittest.cc b/chrome/browser/search_engines/template_url_service_sync_unittest.cc |
index ca3904c163a4ecf0693fb2a13a0ef0769f64f318..9d3e4ad1b80b150ae3a30f3d48d6d0e7e0acc3ed 100644 |
--- a/chrome/browser/search_engines/template_url_service_sync_unittest.cc |
+++ b/chrome/browser/search_engines/template_url_service_sync_unittest.cc |
@@ -60,9 +60,10 @@ std::string GetKeyword(const syncer::SyncData& sync_data) { |
// order to create custom data that should be handled specially when synced to a |
// client. |
syncer::SyncData CreateCustomSyncData(const TemplateURL& turl, |
- bool autogenerate_keyword, |
- const std::string& url, |
- const std::string& sync_guid) { |
+ bool autogenerate_keyword, |
+ const std::string& url, |
+ const std::string& sync_guid, |
+ int prepopulate_id = -1) { |
sync_pb::EntitySpecifics specifics; |
sync_pb::SearchEngineSpecifics* se_specifics = |
specifics.mutable_search_engine(); |
@@ -78,7 +79,8 @@ syncer::SyncData CreateCustomSyncData(const TemplateURL& turl, |
base::JoinString(turl.input_encodings(), ";")); |
se_specifics->set_show_in_default_list(turl.show_in_default_list()); |
se_specifics->set_suggestions_url(turl.suggestions_url()); |
- se_specifics->set_prepopulate_id(turl.prepopulate_id()); |
+ se_specifics->set_prepopulate_id(prepopulate_id == -1 ? turl.prepopulate_id() |
+ : prepopulate_id); |
se_specifics->set_autogenerate_keyword(autogenerate_keyword); |
se_specifics->set_instant_url(turl.instant_url()); |
se_specifics->set_last_modified(turl.last_modified().ToInternalValue()); |
@@ -209,7 +211,8 @@ class TemplateURLServiceSyncTest : public testing::Test { |
const std::string& guid = std::string(), |
time_t last_mod = 100, |
bool safe_for_autoreplace = false, |
- bool created_by_policy = false) const; |
+ bool created_by_policy = false, |
+ int prepopulate_id = 999999) const; |
// Verifies the two TemplateURLs are equal. |
// TODO(stevet): Share this with TemplateURLServiceTest. |
@@ -296,7 +299,8 @@ TemplateURL* TemplateURLServiceSyncTest::CreateTestTemplateURL( |
const std::string& guid, |
time_t last_mod, |
bool safe_for_autoreplace, |
- bool created_by_policy) const { |
+ bool created_by_policy, |
+ int prepopulate_id) const { |
TemplateURLData data; |
data.SetShortName(ASCIIToUTF16("unittest")); |
data.SetKeyword(keyword); |
@@ -306,7 +310,7 @@ TemplateURL* TemplateURLServiceSyncTest::CreateTestTemplateURL( |
data.date_created = Time::FromTimeT(100); |
data.last_modified = Time::FromTimeT(last_mod); |
data.created_by_policy = created_by_policy; |
- data.prepopulate_id = 999999; |
+ data.prepopulate_id = prepopulate_id; |
if (!guid.empty()) |
data.sync_guid = guid; |
return new TemplateURL(data); |
@@ -531,7 +535,7 @@ TEST_F(TemplateURLServiceSyncTest, IsLocalTemplateURLBetter) { |
CreateTestTemplateURL(ASCIIToUTF16("synckey"), "www.sync.com", |
"syncguid", test_cases[i].sync_time)); |
EXPECT_EQ(test_cases[i].expected_result, |
- model()->IsLocalTemplateURLBetter(local_turl, sync_turl.get())); |
+ model()->IsLocalTemplateURLBetter(local_turl, sync_turl.get())); |
// Undo the changes. |
if (test_cases[i].local_is_default) |
@@ -854,13 +858,15 @@ TEST_F(TemplateURLServiceSyncTest, MergeAddFromNewerSyncData) { |
// from Sync are newer. Set up the local data so that one is a dupe, one has a |
// conflicting keyword, and the last has no conflicts (a clean ADD). |
model()->Add(CreateTestTemplateURL(ASCIIToUTF16("key1"), "http://key1.com", |
- "aaa", 10)); // dupe |
+ "aaa", 10, false, false, 111)); // dupe |
model()->Add(CreateTestTemplateURL(ASCIIToUTF16("key2"), |
- "http://expected.com", "bbb", 10)); // keyword conflict |
+ "http://expected.com", "bbb", 10, false, |
+ false, 112)); // keyword conflict |
model()->Add(CreateTestTemplateURL(ASCIIToUTF16("unique"), |
- "http://unique.com", "ccc", 10)); // add |
+ "http://unique.com", "ccc", 10, false, |
+ false, 113)); // add |
syncer::SyncMergeResult merge_result = model()->MergeDataAndStartSyncing( |
syncer::SEARCH_ENGINES, |
@@ -1142,7 +1148,7 @@ TEST_F(TemplateURLServiceSyncTest, AutogeneratedKeywordMigrated) { |
turl.reset(CreateTestTemplateURL(ASCIIToUTF16("key2"), |
"{google:baseURL}search?q={searchTerms}", "key2")); |
initial_data.push_back( |
- CreateCustomSyncData(*turl, true, turl->url(), turl->sync_guid())); |
+ CreateCustomSyncData(*turl, true, turl->url(), turl->sync_guid(), 99)); |
// Now try to sync the data locally. |
model()->MergeDataAndStartSyncing(syncer::SEARCH_ENGINES, initial_data, |
@@ -2221,6 +2227,70 @@ TEST_F(TemplateURLServiceSyncTest, MergeEditedPrepopulatedEngine) { |
EXPECT_EQ(default_turl->url(), result_turl->url()); |
} |
+TEST_F(TemplateURLServiceSyncTest, MergeConflictingPrepopulatedEngine) { |
+ std::unique_ptr<TemplateURLData> default_turl( |
+ TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(nullptr)); |
+ |
+ TemplateURLData data(*default_turl); |
+ data.SetKeyword(ASCIIToUTF16("old_kw")); |
+ data.SetShortName(ASCIIToUTF16("my name")); |
+ data.SetURL("http://wrong.url.com?q={searchTerms}"); |
+ data.safe_for_autoreplace = true; |
+ data.date_created = Time::FromTimeT(50); |
+ data.last_modified = Time::FromTimeT(50); |
+ data.prepopulate_id = 1; |
+ data.sync_guid = "default"; |
+ model()->Add(new TemplateURL(data)); |
+ |
+ TemplateURLData new_data(*default_turl); |
+ new_data.SetKeyword(ASCIIToUTF16("new_kw")); |
+ new_data.SetShortName(ASCIIToUTF16("my name")); |
+ new_data.SetURL("http://wrong.url.com?q={searchTerms}"); |
+ new_data.safe_for_autoreplace = false; |
+ new_data.date_created = Time::FromTimeT(100); |
+ new_data.last_modified = Time::FromTimeT(100); |
+ new_data.prepopulate_id = 1; |
+ new_data.sync_guid = "different_guid"; |
+ |
+ // Test that a remote TemplateURL can override a local TemplateURL not yet |
+ // known to sync. |
+ std::unique_ptr<TemplateURL> sync_turl = |
+ base::MakeUnique<TemplateURL>(new_data); |
+ syncer::SyncDataList list; |
+ list.push_back(TemplateURLService::CreateSyncDataFromTemplateURL(*sync_turl)); |
+ syncer::SyncMergeResult merge_result = model()->MergeDataAndStartSyncing( |
+ syncer::SEARCH_ENGINES, list, PassProcessor(), |
+ CreateAndPassSyncErrorFactory()); |
+ |
+ TemplateURL* result_turl = model()->GetTemplateURLForGUID("different_guid"); |
+ EXPECT_TRUE(result_turl); |
+ EXPECT_EQ(ASCIIToUTF16("new_kw"), result_turl->keyword()); |
+ EXPECT_EQ(ASCIIToUTF16("my name"), result_turl->short_name()); |
+ EXPECT_EQ(default_turl->url(), result_turl->url()); |
+ |
+ // Reset the state of the service. |
+ model()->Remove(result_turl); |
+ model()->StopSyncing(syncer::SEARCH_ENGINES); |
+ sync_processor_wrapper_.reset( |
+ new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get())); |
+ |
+ // Now test that a remote TemplateURL can override the attributes of the local |
+ // default search provider. |
+ TemplateURL* existing_default = new TemplateURL(data); |
+ model()->Add(existing_default); |
+ model()->SetUserSelectedDefaultSearchProvider(existing_default); |
+ |
+ merge_result = model()->MergeDataAndStartSyncing( |
+ syncer::SEARCH_ENGINES, list, PassProcessor(), |
+ CreateAndPassSyncErrorFactory()); |
+ |
+ result_turl = model()->GetDefaultSearchProvider(); |
+ EXPECT_TRUE(result_turl); |
+ EXPECT_EQ(ASCIIToUTF16("new_kw"), result_turl->keyword()); |
+ EXPECT_EQ(ASCIIToUTF16("my name"), result_turl->short_name()); |
+ EXPECT_EQ(default_turl->url(), result_turl->url()); |
+} |
+ |
TEST_F(TemplateURLServiceSyncTest, MergeNonEditedPrepopulatedEngine) { |
std::unique_ptr<TemplateURLData> default_turl( |
TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(NULL)); |