OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
6 #include "base/string_util.h" | 6 #include "base/string_util.h" |
7 #include "base/time.h" | 7 #include "base/time.h" |
8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
9 #include "chrome/browser/search_engines/template_url.h" | 9 #include "chrome/browser/search_engines/template_url.h" |
10 #include "chrome/browser/search_engines/template_url_service.h" | 10 #include "chrome/browser/search_engines/template_url_service.h" |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 string16 original_turl_keyword = original_turl->keyword(); | 316 string16 original_turl_keyword = original_turl->keyword(); |
317 model()->Add(original_turl); | 317 model()->Add(original_turl); |
318 | 318 |
319 // Create a key that does not conflict with something in the model. | 319 // Create a key that does not conflict with something in the model. |
320 scoped_ptr<TemplateURL> sync_turl(CreateTestTemplateURL("unique", | 320 scoped_ptr<TemplateURL> sync_turl(CreateTestTemplateURL("unique", |
321 "http://new.com")); | 321 "http://new.com")); |
322 string16 sync_keyword = sync_turl->keyword(); | 322 string16 sync_keyword = sync_turl->keyword(); |
323 SyncChangeList changes; | 323 SyncChangeList changes; |
324 | 324 |
325 // No conflict, no TURLs changed, no changes. | 325 // No conflict, no TURLs changed, no changes. |
326 EXPECT_FALSE(model()->ResolveSyncKeywordConflict(sync_turl.get(), changes)); | 326 EXPECT_FALSE(model()->ResolveSyncKeywordConflict(sync_turl.get(), &changes)); |
327 EXPECT_EQ(original_turl_keyword, original_turl->keyword()); | 327 EXPECT_EQ(original_turl_keyword, original_turl->keyword()); |
328 EXPECT_EQ(sync_keyword, sync_turl->keyword()); | 328 EXPECT_EQ(sync_keyword, sync_turl->keyword()); |
329 EXPECT_EQ(0U, changes.size()); | 329 EXPECT_EQ(0U, changes.size()); |
330 | 330 |
331 // Change sync keyword to something that conflicts, and make it older. | 331 // Change sync keyword to something that conflicts, and make it older. |
332 // Conflict, sync keyword is uniquified, and a SyncChange is added. | 332 // Conflict, sync keyword is uniquified, and a SyncChange is added. |
333 sync_turl->set_keyword(original_turl->keyword()); | 333 sync_turl->set_keyword(original_turl->keyword()); |
334 sync_turl->set_last_modified(Time::FromTimeT(8999)); | 334 sync_turl->set_last_modified(Time::FromTimeT(8999)); |
335 EXPECT_TRUE(model()->ResolveSyncKeywordConflict(sync_turl.get(), changes)); | 335 EXPECT_TRUE(model()->ResolveSyncKeywordConflict(sync_turl.get(), &changes)); |
336 EXPECT_NE(sync_keyword, sync_turl->keyword()); | 336 EXPECT_NE(sync_keyword, sync_turl->keyword()); |
337 EXPECT_EQ(original_turl_keyword, original_turl->keyword()); | 337 EXPECT_EQ(original_turl_keyword, original_turl->keyword()); |
338 EXPECT_EQ(NULL, model()->GetTemplateURLForKeyword(sync_turl->keyword())); | 338 EXPECT_EQ(NULL, model()->GetTemplateURLForKeyword(sync_turl->keyword())); |
339 EXPECT_EQ(1U, changes.size()); | 339 EXPECT_EQ(1U, changes.size()); |
340 changes.clear(); | 340 changes.clear(); |
341 | 341 |
342 // Sync is newer. Original TemplateURL keyword is uniquified, no SyncChange | 342 // Sync is newer. Original TemplateURL keyword is uniquified, no SyncChange |
343 // is added. | 343 // is added. |
344 sync_turl->set_keyword(original_turl->keyword()); | 344 sync_turl->set_keyword(original_turl->keyword()); |
345 sync_keyword = sync_turl->keyword(); | 345 sync_keyword = sync_turl->keyword(); |
346 sync_turl->set_last_modified(Time::FromTimeT(9001)); | 346 sync_turl->set_last_modified(Time::FromTimeT(9001)); |
347 EXPECT_TRUE(model()->ResolveSyncKeywordConflict(sync_turl.get(), changes)); | 347 EXPECT_TRUE(model()->ResolveSyncKeywordConflict(sync_turl.get(), &changes)); |
348 EXPECT_EQ(sync_keyword, sync_turl->keyword()); | 348 EXPECT_EQ(sync_keyword, sync_turl->keyword()); |
349 EXPECT_NE(original_turl_keyword, original_turl->keyword()); | 349 EXPECT_NE(original_turl_keyword, original_turl->keyword()); |
350 EXPECT_EQ(NULL, model()->GetTemplateURLForKeyword(sync_turl->keyword())); | 350 EXPECT_EQ(NULL, model()->GetTemplateURLForKeyword(sync_turl->keyword())); |
351 EXPECT_EQ(0U, changes.size()); | 351 EXPECT_EQ(0U, changes.size()); |
352 | 352 |
353 // Equal times. Same result as above. Sync left alone, original uniquified so | 353 // Equal times. Same result as above. Sync left alone, original uniquified so |
354 // sync_turl can fit. | 354 // sync_turl can fit. |
355 sync_turl->set_keyword(original_turl->keyword()); | 355 sync_turl->set_keyword(original_turl->keyword()); |
356 sync_keyword = sync_turl->keyword(); | 356 sync_keyword = sync_turl->keyword(); |
357 // Note that we have to reset original_turl's last_modified time as it was | 357 // Note that we have to reset original_turl's last_modified time as it was |
358 // modified above. | 358 // modified above. |
359 original_turl->set_last_modified(Time::FromTimeT(9000)); | 359 original_turl->set_last_modified(Time::FromTimeT(9000)); |
360 sync_turl->set_last_modified(Time::FromTimeT(9000)); | 360 sync_turl->set_last_modified(Time::FromTimeT(9000)); |
361 EXPECT_TRUE(model()->ResolveSyncKeywordConflict(sync_turl.get(), changes)); | 361 EXPECT_TRUE(model()->ResolveSyncKeywordConflict(sync_turl.get(), &changes)); |
362 EXPECT_EQ(sync_keyword, sync_turl->keyword()); | 362 EXPECT_EQ(sync_keyword, sync_turl->keyword()); |
363 EXPECT_NE(original_turl_keyword, original_turl->keyword()); | 363 EXPECT_NE(original_turl_keyword, original_turl->keyword()); |
364 EXPECT_EQ(NULL, model()->GetTemplateURLForKeyword(sync_turl->keyword())); | 364 EXPECT_EQ(NULL, model()->GetTemplateURLForKeyword(sync_turl->keyword())); |
365 EXPECT_EQ(0U, changes.size()); | 365 EXPECT_EQ(0U, changes.size()); |
366 } | 366 } |
367 | 367 |
368 TEST_F(TemplateURLServiceSyncTest, FindDuplicateOfSyncTemplateURL) { | 368 TEST_F(TemplateURLServiceSyncTest, FindDuplicateOfSyncTemplateURL) { |
369 TemplateURL* original_turl = | 369 TemplateURL* original_turl = |
370 CreateTestTemplateURL("key1", "http://key1.com"); | 370 CreateTestTemplateURL("key1", "http://key1.com"); |
371 model()->Add(original_turl); | 371 model()->Add(original_turl); |
(...skipping 24 matching lines...) Expand all Loading... |
396 TEST_F(TemplateURLServiceSyncTest, MergeSyncAndLocalURLDuplicates) { | 396 TEST_F(TemplateURLServiceSyncTest, MergeSyncAndLocalURLDuplicates) { |
397 TemplateURL* original_turl = | 397 TemplateURL* original_turl = |
398 CreateTestTemplateURL("key1", "http://key1.com", std::string(), 9000); | 398 CreateTestTemplateURL("key1", "http://key1.com", std::string(), 9000); |
399 model()->Add(original_turl); | 399 model()->Add(original_turl); |
400 TemplateURL* sync_turl = | 400 TemplateURL* sync_turl = |
401 CreateTestTemplateURL("key1", "http://key1.com", std::string(), 9001); | 401 CreateTestTemplateURL("key1", "http://key1.com", std::string(), 9001); |
402 SyncChangeList changes; | 402 SyncChangeList changes; |
403 | 403 |
404 // The sync TemplateURL is newer. It should replace the original TemplateURL. | 404 // The sync TemplateURL is newer. It should replace the original TemplateURL. |
405 // Note that MergeSyncAndLocalURLDuplicates takes ownership of sync_turl. | 405 // Note that MergeSyncAndLocalURLDuplicates takes ownership of sync_turl. |
406 model()->MergeSyncAndLocalURLDuplicates(sync_turl, original_turl, changes); | 406 model()->MergeSyncAndLocalURLDuplicates(sync_turl, original_turl, &changes); |
407 const TemplateURL* result = | 407 const TemplateURL* result = |
408 model()->GetTemplateURLForKeyword(UTF8ToUTF16("key1")); | 408 model()->GetTemplateURLForKeyword(UTF8ToUTF16("key1")); |
409 ASSERT_TRUE(result); | 409 ASSERT_TRUE(result); |
410 EXPECT_EQ(9001, result->last_modified().ToTimeT()); | 410 EXPECT_EQ(9001, result->last_modified().ToTimeT()); |
411 EXPECT_EQ(0U, changes.size()); | 411 EXPECT_EQ(0U, changes.size()); |
412 | 412 |
413 // The sync TemplateURL is older. The existing TemplateURL should win and a | 413 // The sync TemplateURL is older. The existing TemplateURL should win and a |
414 // SyncChange should be added to the list. | 414 // SyncChange should be added to the list. |
415 TemplateURL* sync_turl2 = | 415 TemplateURL* sync_turl2 = |
416 CreateTestTemplateURL("key1", "http://key1.com", std::string(), 8999); | 416 CreateTestTemplateURL("key1", "http://key1.com", std::string(), 8999); |
417 model()->MergeSyncAndLocalURLDuplicates(sync_turl2, sync_turl, changes); | 417 model()->MergeSyncAndLocalURLDuplicates(sync_turl2, sync_turl, &changes); |
418 result = model()->GetTemplateURLForKeyword(UTF8ToUTF16("key1")); | 418 result = model()->GetTemplateURLForKeyword(UTF8ToUTF16("key1")); |
419 ASSERT_TRUE(result); | 419 ASSERT_TRUE(result); |
420 EXPECT_EQ(9001, result->last_modified().ToTimeT()); | 420 EXPECT_EQ(9001, result->last_modified().ToTimeT()); |
421 EXPECT_EQ(1U, changes.size()); | 421 EXPECT_EQ(1U, changes.size()); |
422 } | 422 } |
423 | 423 |
424 TEST_F(TemplateURLServiceSyncTest, StartSyncEmpty) { | 424 TEST_F(TemplateURLServiceSyncTest, StartSyncEmpty) { |
425 model()->MergeDataAndStartSyncing( | 425 model()->MergeDataAndStartSyncing( |
426 syncable::SEARCH_ENGINES, | 426 syncable::SEARCH_ENGINES, |
427 SyncDataList(), // Empty. | 427 SyncDataList(), // Empty. |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
972 ASSERT_FALSE(error.IsSet()); | 972 ASSERT_FALSE(error.IsSet()); |
973 | 973 |
974 SyncChangeList changes; | 974 SyncChangeList changes; |
975 changes.push_back(CreateTestSyncChange( | 975 changes.push_back(CreateTestSyncChange( |
976 SyncChange::ACTION_UPDATE, | 976 SyncChange::ACTION_UPDATE, |
977 CreateTestTemplateURL("newkeyword", "http://new.com", "key2"))); | 977 CreateTestTemplateURL("newkeyword", "http://new.com", "key2"))); |
978 processor()->set_erroneous(true); | 978 processor()->set_erroneous(true); |
979 error = model()->ProcessSyncChanges(FROM_HERE, changes); | 979 error = model()->ProcessSyncChanges(FROM_HERE, changes); |
980 EXPECT_TRUE(error.IsSet()); | 980 EXPECT_TRUE(error.IsSet()); |
981 } | 981 } |
| 982 |
| 983 TEST_F(TemplateURLServiceSyncTest, MergeTwiceWithSameSyncData) { |
| 984 // Ensure that a second merge with the same data as the first does not |
| 985 // actually update the local data. |
| 986 SyncDataList initial_data; |
| 987 initial_data.push_back(CreateInitialSyncData().at(0)); |
| 988 TemplateURL* turl = TemplateURLService::CreateTemplateURLFromSyncData( |
| 989 initial_data.at(0)); |
| 990 ASSERT_TRUE(turl); |
| 991 turl->set_last_modified(Time::FromTimeT(10)); // earlier |
| 992 model()->Add(turl); |
| 993 |
| 994 SyncError error = model()->MergeDataAndStartSyncing( |
| 995 syncable::SEARCH_ENGINES, |
| 996 initial_data, |
| 997 processor()); |
| 998 ASSERT_FALSE(error.IsSet()); |
| 999 |
| 1000 // We should have updated the original TemplateURL with Sync's version. |
| 1001 // Keep a copy of it so we can compare it after we re-merge. |
| 1002 ASSERT_TRUE(model()->GetTemplateURLForGUID("key1")); |
| 1003 TemplateURL updated_turl(*model()->GetTemplateURLForGUID("key1")); |
| 1004 EXPECT_EQ(Time::FromTimeT(90), updated_turl.last_modified()); |
| 1005 |
| 1006 // Modify a single field of the initial data. This should not be updated in |
| 1007 // the second merge, as the last_modified timestamp remains the same. |
| 1008 scoped_ptr<TemplateURL> temp_turl( |
| 1009 TemplateURLService::CreateTemplateURLFromSyncData(initial_data.at(0))); |
| 1010 temp_turl->set_short_name(UTF8ToUTF16("SomethingDifferent")); |
| 1011 initial_data.clear(); |
| 1012 initial_data.push_back( |
| 1013 TemplateURLService::CreateSyncDataFromTemplateURL(*temp_turl)); |
| 1014 |
| 1015 // Remerge the data again. This simulates shutting down and syncing again |
| 1016 // at a different time, but the cloud data has not changed. |
| 1017 model()->StopSyncing(syncable::SEARCH_ENGINES); |
| 1018 error = model()->MergeDataAndStartSyncing(syncable::SEARCH_ENGINES, |
| 1019 initial_data, |
| 1020 processor()); |
| 1021 ASSERT_FALSE(error.IsSet()); |
| 1022 |
| 1023 // Check that the TemplateURL was not modified. |
| 1024 const TemplateURL* reupdated_turl = model()->GetTemplateURLForGUID("key1"); |
| 1025 ASSERT_TRUE(reupdated_turl); |
| 1026 AssertEquals(updated_turl, *reupdated_turl); |
| 1027 } |
OLD | NEW |