OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/bind.h" | 5 #include "base/bind.h" |
6 #include "base/memory/weak_ptr.h" | 6 #include "base/memory/weak_ptr.h" |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "chrome/browser/history/history_db_task.h" | 10 #include "chrome/browser/history/history_db_task.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 class TopSitesQuerier { | 55 class TopSitesQuerier { |
56 public: | 56 public: |
57 TopSitesQuerier() | 57 TopSitesQuerier() |
58 : weak_ptr_factory_(this), | 58 : weak_ptr_factory_(this), |
59 number_of_callbacks_(0), | 59 number_of_callbacks_(0), |
60 waiting_(false) {} | 60 waiting_(false) {} |
61 | 61 |
62 // Queries top sites. If |wait| is true a nested message loop is run until the | 62 // Queries top sites. If |wait| is true a nested message loop is run until the |
63 // callback is notified. | 63 // callback is notified. |
64 void QueryTopSites(TopSitesImpl* top_sites, bool wait) { | 64 void QueryTopSites(TopSitesImpl* top_sites, bool wait) { |
| 65 QueryAllTopSites(top_sites, wait, false); |
| 66 } |
| 67 |
| 68 // Queries top sites, including potentially forced URLs if |
| 69 // |include_forced_urls| is true. |
| 70 void QueryAllTopSites(TopSitesImpl* top_sites, |
| 71 bool wait, |
| 72 bool include_forced_urls) { |
65 int start_number_of_callbacks = number_of_callbacks_; | 73 int start_number_of_callbacks = number_of_callbacks_; |
66 top_sites->GetMostVisitedURLs( | 74 top_sites->GetMostVisitedURLs( |
67 base::Bind(&TopSitesQuerier::OnTopSitesAvailable, | 75 base::Bind(&TopSitesQuerier::OnTopSitesAvailable, |
68 weak_ptr_factory_.GetWeakPtr())); | 76 weak_ptr_factory_.GetWeakPtr()), |
| 77 include_forced_urls); |
69 if (wait && start_number_of_callbacks == number_of_callbacks_) { | 78 if (wait && start_number_of_callbacks == number_of_callbacks_) { |
70 waiting_ = true; | 79 waiting_ = true; |
71 base::MessageLoop::current()->Run(); | 80 base::MessageLoop::current()->Run(); |
72 } | 81 } |
73 } | 82 } |
74 | 83 |
75 void CancelRequest() { | 84 void CancelRequest() { |
76 weak_ptr_factory_.InvalidateWeakPtrs(); | 85 weak_ptr_factory_.InvalidateWeakPtrs(); |
77 } | 86 } |
78 | 87 |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 | 306 |
298 size_t last_num_urls_changed() { return top_sites()->last_num_urls_changed_; } | 307 size_t last_num_urls_changed() { return top_sites()->last_num_urls_changed_; } |
299 | 308 |
300 base::TimeDelta GetUpdateDelay() { | 309 base::TimeDelta GetUpdateDelay() { |
301 return top_sites()->GetUpdateDelay(); | 310 return top_sites()->GetUpdateDelay(); |
302 } | 311 } |
303 | 312 |
304 bool IsTopSitesLoaded() { return top_sites()->loaded_; } | 313 bool IsTopSitesLoaded() { return top_sites()->loaded_; } |
305 | 314 |
306 bool AddPrepopulatedPages(MostVisitedURLList* urls) { | 315 bool AddPrepopulatedPages(MostVisitedURLList* urls) { |
307 return top_sites()->AddPrepopulatedPages(urls); | 316 return top_sites()->AddPrepopulatedPages(urls, 0u); |
| 317 } |
| 318 |
| 319 void EmptyThreadSafeCache() { |
| 320 base::AutoLock lock(top_sites()->lock_); |
| 321 MostVisitedURLList empty; |
| 322 top_sites()->thread_safe_cache_->SetTopSites(empty); |
308 } | 323 } |
309 | 324 |
310 private: | 325 private: |
311 base::MessageLoopForUI message_loop_; | 326 base::MessageLoopForUI message_loop_; |
312 content::TestBrowserThread ui_thread_; | 327 content::TestBrowserThread ui_thread_; |
313 content::TestBrowserThread db_thread_; | 328 content::TestBrowserThread db_thread_; |
314 scoped_ptr<TestingProfile> profile_; | 329 scoped_ptr<TestingProfile> profile_; |
315 | 330 |
316 // To cancel HistoryService tasks. | 331 // To cancel HistoryService tasks. |
317 CancelableRequestConsumer consumer_; | 332 CancelableRequestConsumer consumer_; |
318 | 333 |
319 // To cancel TopSitesBackend tasks. | 334 // To cancel TopSitesBackend tasks. |
320 CancelableTaskTracker cancelable_task_tracker_; | 335 CancelableTaskTracker cancelable_task_tracker_; |
321 | 336 |
322 DISALLOW_COPY_AND_ASSIGN(TopSitesImplTest); | 337 DISALLOW_COPY_AND_ASSIGN(TopSitesImplTest); |
323 }; // Class TopSitesImplTest | 338 }; // Class TopSitesImplTest |
324 | 339 |
325 // Helper function for appending a URL to a vector of "most visited" URLs, | 340 // Helper function for appending a URL to a vector of "most visited" URLs, |
326 // using the default values for everything but the URL. | 341 // using the default values for everything but the URL. |
327 static void AppendMostVisitedURL(std::vector<MostVisitedURL>* list, | 342 static void AppendMostVisitedURL(std::vector<MostVisitedURL>* list, |
328 const GURL& url) { | 343 const GURL& url) { |
329 MostVisitedURL mv; | 344 MostVisitedURL mv; |
330 mv.url = url; | 345 mv.url = url; |
331 mv.redirects.push_back(url); | 346 mv.redirects.push_back(url); |
332 list->push_back(mv); | 347 list->push_back(mv); |
333 } | 348 } |
334 | 349 |
| 350 // Helper function for appending a URL to a vector of "most visited" URLs, |
| 351 // using the default values for everything but the URL. |
| 352 static void AppendForcedMostVisitedURL(std::vector<MostVisitedURL>* list, |
| 353 const GURL& url, |
| 354 double last_forced_time) { |
| 355 MostVisitedURL mv; |
| 356 mv.url = url; |
| 357 mv.last_forced_time = base::Time::FromJsTime(last_forced_time); |
| 358 mv.redirects.push_back(url); |
| 359 list->push_back(mv); |
| 360 } |
| 361 |
335 // Same as AppendMostVisitedURL except that it adds a redirect from the first | 362 // Same as AppendMostVisitedURL except that it adds a redirect from the first |
336 // URL to the second. | 363 // URL to the second. |
337 static void AppendMostVisitedURLWithRedirect( | 364 static void AppendMostVisitedURLWithRedirect( |
338 std::vector<MostVisitedURL>* list, | 365 std::vector<MostVisitedURL>* list, |
339 const GURL& redirect_source, const GURL& redirect_dest) { | 366 const GURL& redirect_source, const GURL& redirect_dest) { |
340 MostVisitedURL mv; | 367 MostVisitedURL mv; |
341 mv.url = redirect_dest; | 368 mv.url = redirect_dest; |
342 mv.redirects.push_back(redirect_source); | 369 mv.redirects.push_back(redirect_source); |
343 mv.redirects.push_back(redirect_dest); | 370 mv.redirects.push_back(redirect_dest); |
344 list->push_back(mv); | 371 list->push_back(mv); |
(...skipping 28 matching lines...) Expand all Loading... |
373 // The URL in question is the destination of a redirect. | 400 // The URL in question is the destination of a redirect. |
374 result = GetCanonicalURL(dest); | 401 result = GetCanonicalURL(dest); |
375 EXPECT_EQ(dest, result); | 402 EXPECT_EQ(dest, result); |
376 } | 403 } |
377 | 404 |
378 // Tests DiffMostVisited. | 405 // Tests DiffMostVisited. |
379 TEST_F(TopSitesImplTest, DiffMostVisited) { | 406 TEST_F(TopSitesImplTest, DiffMostVisited) { |
380 GURL stays_the_same("http://staysthesame/"); | 407 GURL stays_the_same("http://staysthesame/"); |
381 GURL gets_added_1("http://getsadded1/"); | 408 GURL gets_added_1("http://getsadded1/"); |
382 GURL gets_added_2("http://getsadded2/"); | 409 GURL gets_added_2("http://getsadded2/"); |
383 GURL gets_deleted_1("http://getsdeleted2/"); | 410 GURL gets_deleted_1("http://getsdeleted1/"); |
384 GURL gets_moved_1("http://getsmoved1/"); | 411 GURL gets_moved_1("http://getsmoved1/"); |
385 | 412 |
386 std::vector<MostVisitedURL> old_list; | 413 std::vector<MostVisitedURL> old_list; |
387 AppendMostVisitedURL(&old_list, stays_the_same); // 0 (unchanged) | 414 AppendMostVisitedURL(&old_list, stays_the_same); // 0 (unchanged) |
388 AppendMostVisitedURL(&old_list, gets_deleted_1); // 1 (deleted) | 415 AppendMostVisitedURL(&old_list, gets_deleted_1); // 1 (deleted) |
389 AppendMostVisitedURL(&old_list, gets_moved_1); // 2 (moved to 3) | 416 AppendMostVisitedURL(&old_list, gets_moved_1); // 2 (moved to 3) |
390 | 417 |
391 std::vector<MostVisitedURL> new_list; | 418 std::vector<MostVisitedURL> new_list; |
392 AppendMostVisitedURL(&new_list, stays_the_same); // 0 (unchanged) | 419 AppendMostVisitedURL(&new_list, stays_the_same); // 0 (unchanged) |
393 AppendMostVisitedURL(&new_list, gets_added_1); // 1 (added) | 420 AppendMostVisitedURL(&new_list, gets_added_1); // 1 (added) |
394 AppendMostVisitedURL(&new_list, gets_added_2); // 2 (added) | 421 AppendMostVisitedURL(&new_list, gets_added_2); // 2 (added) |
395 AppendMostVisitedURL(&new_list, gets_moved_1); // 3 (moved from 2) | 422 AppendMostVisitedURL(&new_list, gets_moved_1); // 3 (moved from 2) |
396 | 423 |
397 history::TopSitesDelta delta; | 424 history::TopSitesDelta delta; |
398 history::TopSitesImpl::DiffMostVisited(old_list, new_list, &delta); | 425 history::TopSitesImpl::DiffMostVisited(old_list, new_list, &delta); |
399 | 426 |
400 ASSERT_EQ(2u, delta.added.size()); | 427 ASSERT_EQ(2u, delta.added.size()); |
401 ASSERT_TRUE(gets_added_1 == delta.added[0].url.url); | 428 EXPECT_TRUE(gets_added_1 == delta.added[0].url.url); |
402 ASSERT_EQ(1, delta.added[0].rank); | 429 EXPECT_EQ(1, delta.added[0].rank); |
403 ASSERT_TRUE(gets_added_2 == delta.added[1].url.url); | 430 EXPECT_TRUE(gets_added_2 == delta.added[1].url.url); |
404 ASSERT_EQ(2, delta.added[1].rank); | 431 EXPECT_EQ(2, delta.added[1].rank); |
405 | 432 |
406 ASSERT_EQ(1u, delta.deleted.size()); | 433 ASSERT_EQ(1u, delta.deleted.size()); |
407 ASSERT_TRUE(gets_deleted_1 == delta.deleted[0].url); | 434 EXPECT_TRUE(gets_deleted_1 == delta.deleted[0].url); |
408 | 435 |
409 ASSERT_EQ(1u, delta.moved.size()); | 436 ASSERT_EQ(1u, delta.moved.size()); |
410 ASSERT_TRUE(gets_moved_1 == delta.moved[0].url.url); | 437 EXPECT_TRUE(gets_moved_1 == delta.moved[0].url.url); |
411 ASSERT_EQ(3, delta.moved[0].rank); | 438 EXPECT_EQ(3, delta.moved[0].rank); |
| 439 } |
| 440 |
| 441 // Tests DiffMostVisited with forced URLs. |
| 442 TEST_F(TopSitesImplTest, DiffMostVisitedWithForced) { |
| 443 // Forced URLs. |
| 444 GURL stays_the_same_1("http://staysthesame1/"); |
| 445 GURL new_last_forced_time("http://newlastforcedtime/"); |
| 446 GURL stays_the_same_2("http://staysthesame2/"); |
| 447 GURL move_to_nonforced("http://movetononforced/"); |
| 448 GURL gets_added_1("http://getsadded1/"); |
| 449 GURL gets_deleted_1("http://getsdeleted1/"); |
| 450 // Non-forced URLs. |
| 451 GURL move_to_forced("http://movetoforced/"); |
| 452 GURL stays_the_same_3("http://staysthesame3/"); |
| 453 GURL gets_added_2("http://getsadded2/"); |
| 454 GURL gets_deleted_2("http://getsdeleted2/"); |
| 455 GURL gets_moved_1("http://getsmoved1/"); |
| 456 |
| 457 std::vector<MostVisitedURL> old_list; |
| 458 AppendForcedMostVisitedURL(&old_list, stays_the_same_1, 1000); |
| 459 AppendForcedMostVisitedURL(&old_list, new_last_forced_time, 2000); |
| 460 AppendForcedMostVisitedURL(&old_list, stays_the_same_2, 3000); |
| 461 AppendForcedMostVisitedURL(&old_list, move_to_nonforced, 4000); |
| 462 AppendForcedMostVisitedURL(&old_list, gets_deleted_1, 5000); |
| 463 AppendMostVisitedURL(&old_list, move_to_forced); |
| 464 AppendMostVisitedURL(&old_list, stays_the_same_3); |
| 465 AppendMostVisitedURL(&old_list, gets_deleted_2); |
| 466 AppendMostVisitedURL(&old_list, gets_moved_1); |
| 467 |
| 468 std::vector<MostVisitedURL> new_list; |
| 469 AppendForcedMostVisitedURL(&new_list, stays_the_same_1, 1000); |
| 470 AppendForcedMostVisitedURL(&new_list, stays_the_same_2, 3000); |
| 471 AppendForcedMostVisitedURL(&new_list, new_last_forced_time, 4000); |
| 472 AppendForcedMostVisitedURL(&new_list, gets_added_1, 5000); |
| 473 AppendForcedMostVisitedURL(&new_list, move_to_forced, 6000); |
| 474 AppendMostVisitedURL(&new_list, move_to_nonforced); |
| 475 AppendMostVisitedURL(&new_list, stays_the_same_3); |
| 476 AppendMostVisitedURL(&new_list, gets_added_2); |
| 477 AppendMostVisitedURL(&new_list, gets_moved_1); |
| 478 |
| 479 history::TopSitesDelta delta; |
| 480 history::TopSitesImpl::DiffMostVisited(old_list, new_list, &delta); |
| 481 |
| 482 ASSERT_EQ(2u, delta.added.size()); |
| 483 EXPECT_TRUE(gets_added_1 == delta.added[0].url.url); |
| 484 EXPECT_EQ(-1, delta.added[0].rank); |
| 485 EXPECT_TRUE(gets_added_2 == delta.added[1].url.url); |
| 486 EXPECT_EQ(2, delta.added[1].rank); |
| 487 |
| 488 ASSERT_EQ(2u, delta.deleted.size()); |
| 489 EXPECT_TRUE(gets_deleted_1 == delta.deleted[0].url); |
| 490 EXPECT_TRUE(gets_deleted_2 == delta.deleted[1].url); |
| 491 |
| 492 ASSERT_EQ(3u, delta.moved.size()); |
| 493 EXPECT_TRUE(new_last_forced_time == delta.moved[0].url.url); |
| 494 EXPECT_EQ(-1, delta.moved[0].rank); |
| 495 EXPECT_EQ(base::Time::FromJsTime(4000), delta.moved[0].url.last_forced_time); |
| 496 EXPECT_TRUE(move_to_forced == delta.moved[1].url.url); |
| 497 EXPECT_EQ(-1, delta.moved[1].rank); |
| 498 EXPECT_EQ(base::Time::FromJsTime(6000), delta.moved[1].url.last_forced_time); |
| 499 EXPECT_TRUE(move_to_nonforced == delta.moved[2].url.url); |
| 500 EXPECT_EQ(0, delta.moved[2].rank); |
| 501 EXPECT_TRUE(delta.moved[2].url.last_forced_time.is_null()); |
412 } | 502 } |
413 | 503 |
414 // Tests SetPageThumbnail. | 504 // Tests SetPageThumbnail. |
415 TEST_F(TopSitesImplTest, SetPageThumbnail) { | 505 TEST_F(TopSitesImplTest, SetPageThumbnail) { |
416 GURL url1a("http://google.com/"); | 506 GURL url1a("http://google.com/"); |
417 GURL url1b("http://www.google.com/"); | 507 GURL url1b("http://www.google.com/"); |
418 GURL url2("http://images.google.com/"); | 508 GURL url2("http://images.google.com/"); |
419 GURL invalid_url("chrome://favicon/http://google.com/"); | 509 GURL invalid_url("chrome://favicon/http://google.com/"); |
420 | 510 |
421 std::vector<MostVisitedURL> list; | 511 std::vector<MostVisitedURL> list; |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 querier.QueryTopSites(top_sites(), false); | 698 querier.QueryTopSites(top_sites(), false); |
609 ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size()); | 699 ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size()); |
610 EXPECT_EQ(asdf_url, querier.urls()[0].url); | 700 EXPECT_EQ(asdf_url, querier.urls()[0].url); |
611 EXPECT_EQ(asdf_title, querier.urls()[0].title); | 701 EXPECT_EQ(asdf_title, querier.urls()[0].title); |
612 EXPECT_EQ(google_url, querier.urls()[1].url); | 702 EXPECT_EQ(google_url, querier.urls()[1].url); |
613 EXPECT_EQ(google_title, querier.urls()[1].title); | 703 EXPECT_EQ(google_title, querier.urls()[1].title); |
614 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2)); | 704 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2)); |
615 } | 705 } |
616 } | 706 } |
617 | 707 |
| 708 // Makes sure forced URLs in top sites get mirrored to the db. |
| 709 TEST_F(TopSitesImplTest, SaveForcedToDB) { |
| 710 MostVisitedURL url; |
| 711 GURL asdf_url("http://asdf.com"); |
| 712 string16 asdf_title(ASCIIToUTF16("ASDF")); |
| 713 GURL google_url("http://google.com"); |
| 714 string16 google_title(ASCIIToUTF16("Google")); |
| 715 GURL news_url("http://news.google.com"); |
| 716 string16 news_title(ASCIIToUTF16("Google News")); |
| 717 |
| 718 // Add a number of forced URLs. |
| 719 std::vector<MostVisitedURL> list; |
| 720 AppendForcedMostVisitedURL(&list, GURL("http://forced1"), 1000); |
| 721 list[0].title = ASCIIToUTF16("forced1"); |
| 722 AppendForcedMostVisitedURL(&list, GURL("http://forced2"), 2000); |
| 723 AppendForcedMostVisitedURL(&list, GURL("http://forced3"), 3000); |
| 724 AppendForcedMostVisitedURL(&list, GURL("http://forced4"), 4000); |
| 725 SetTopSites(list); |
| 726 |
| 727 // Add a thumbnail. |
| 728 gfx::Image red_thumbnail(CreateBitmap(SK_ColorRED)); |
| 729 ASSERT_TRUE(top_sites()->SetPageThumbnail( |
| 730 GURL("http://forced1"), red_thumbnail, ThumbnailScore())); |
| 731 |
| 732 // Get the original thumbnail for later comparison. Some compression can |
| 733 // happen in |top_sites| and we don't want to depend on that. |
| 734 SkBitmap orig_thumbnail = GetThumbnail(GURL("http://forced1")); |
| 735 |
| 736 // Force-flush the cache to ensure we don't reread from it inadvertently. |
| 737 EmptyThreadSafeCache(); |
| 738 |
| 739 // Make TopSites reread from the db. |
| 740 StartQueryForMostVisited(); |
| 741 WaitForHistory(); |
| 742 |
| 743 TopSitesQuerier querier; |
| 744 querier.QueryAllTopSites(top_sites(), true, true); |
| 745 |
| 746 ASSERT_EQ(4u + GetPrepopulatePages().size(), querier.urls().size()); |
| 747 EXPECT_EQ(GURL("http://forced1"), querier.urls()[0].url); |
| 748 EXPECT_EQ(ASCIIToUTF16("forced1"), querier.urls()[0].title); |
| 749 SkBitmap thumbnail = GetThumbnail(GURL("http://forced1")); |
| 750 ASSERT_EQ(orig_thumbnail.getSize(), thumbnail.getSize()); |
| 751 orig_thumbnail.lockPixels(); |
| 752 thumbnail.lockPixels(); |
| 753 EXPECT_EQ(0, memcmp(orig_thumbnail.getPixels(), thumbnail.getPixels(), |
| 754 orig_thumbnail.getSize())); |
| 755 thumbnail.unlockPixels(); |
| 756 orig_thumbnail.unlockPixels(); |
| 757 EXPECT_EQ(base::Time::FromJsTime(1000), querier.urls()[0].last_forced_time); |
| 758 EXPECT_EQ(GURL("http://forced2"), querier.urls()[1].url); |
| 759 EXPECT_EQ(base::Time::FromJsTime(2000), querier.urls()[1].last_forced_time); |
| 760 EXPECT_EQ(GURL("http://forced3"), querier.urls()[2].url); |
| 761 EXPECT_EQ(base::Time::FromJsTime(3000), querier.urls()[2].last_forced_time); |
| 762 EXPECT_EQ(GURL("http://forced4"), querier.urls()[3].url); |
| 763 EXPECT_EQ(base::Time::FromJsTime(4000), querier.urls()[3].last_forced_time); |
| 764 |
| 765 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 4)); |
| 766 } |
| 767 |
618 // More permutations of saving to db. | 768 // More permutations of saving to db. |
619 TEST_F(TopSitesImplTest, RealDatabase) { | 769 TEST_F(TopSitesImplTest, RealDatabase) { |
620 MostVisitedURL url; | 770 MostVisitedURL url; |
621 GURL asdf_url("http://asdf.com"); | 771 GURL asdf_url("http://asdf.com"); |
622 string16 asdf_title(ASCIIToUTF16("ASDF")); | 772 string16 asdf_title(ASCIIToUTF16("ASDF")); |
623 GURL google1_url("http://google.com"); | 773 GURL google1_url("http://google.com"); |
624 GURL google2_url("http://google.com/redirect"); | 774 GURL google2_url("http://google.com/redirect"); |
625 GURL google3_url("http://www.google.com"); | 775 GURL google3_url("http://www.google.com"); |
626 string16 google_title(ASCIIToUTF16("Google")); | 776 string16 google_title(ASCIIToUTF16("Google")); |
627 GURL news_url("http://news.google.com"); | 777 GURL news_url("http://news.google.com"); |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1088 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0)); | 1238 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0)); |
1089 | 1239 |
1090 MostVisitedURLList pages = q.urls(); | 1240 MostVisitedURLList pages = q.urls(); |
1091 EXPECT_FALSE(AddPrepopulatedPages(&pages)); | 1241 EXPECT_FALSE(AddPrepopulatedPages(&pages)); |
1092 | 1242 |
1093 EXPECT_EQ(GetPrepopulatePages().size(), pages.size()); | 1243 EXPECT_EQ(GetPrepopulatePages().size(), pages.size()); |
1094 q.set_urls(pages); | 1244 q.set_urls(pages); |
1095 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0)); | 1245 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0)); |
1096 } | 1246 } |
1097 | 1247 |
| 1248 // Ensure calling SetTopSites with forced sites already in the DB works. |
| 1249 // This test both eviction and |
| 1250 TEST_F(TopSitesImplTest, SetForcedTopSites) { |
| 1251 |
| 1252 const double old_last_forced_time[] = { |
| 1253 1000, |
| 1254 4000, |
| 1255 7000, |
| 1256 10000, |
| 1257 11000, |
| 1258 12000, |
| 1259 13000, |
| 1260 18000, |
| 1261 21000 |
| 1262 }; |
| 1263 size_t num_old_forced = arraysize(old_last_forced_time); |
| 1264 |
| 1265 const double new_last_forced_time[] = { |
| 1266 2000, |
| 1267 3000, |
| 1268 5000, |
| 1269 6000, |
| 1270 8000, |
| 1271 9000, |
| 1272 14000, |
| 1273 15000, |
| 1274 16000, |
| 1275 17000, |
| 1276 19000, |
| 1277 20000, |
| 1278 22000 |
| 1279 }; |
| 1280 size_t num_new_forced = arraysize(new_last_forced_time); |
| 1281 |
| 1282 const size_t kNumNonForcedURLs = 20; // Maximum number of non-forced URLs. |
| 1283 |
| 1284 MostVisitedURLList old_url_list; |
| 1285 MostVisitedURLList new_url_list; |
| 1286 |
| 1287 old_url_list.resize(num_old_forced + kNumNonForcedURLs); |
| 1288 new_url_list.resize(num_new_forced + kNumNonForcedURLs); |
| 1289 |
| 1290 // Setup a number of forced and non-forced URLs. |
| 1291 for (size_t i = 0; i < num_old_forced; ++i) { |
| 1292 std::ostringstream url; |
| 1293 url << "http://oldforced/" << i; |
| 1294 old_url_list[i].url = GURL(url.str()); |
| 1295 old_url_list[i].last_forced_time = |
| 1296 base::Time::FromJsTime(old_last_forced_time[i]); |
| 1297 } |
| 1298 for (size_t i = num_old_forced; i < old_url_list.size(); ++i) { |
| 1299 std::ostringstream url; |
| 1300 url << "http://oldnonforced/" << (i - num_old_forced); |
| 1301 old_url_list[i].url = GURL(url.str()); |
| 1302 } |
| 1303 for (size_t i = 0; i < num_new_forced; ++i) { |
| 1304 std::ostringstream url; |
| 1305 url << "http://newforced/" << i; |
| 1306 new_url_list[i].url = GURL(url.str()); |
| 1307 new_url_list[i].last_forced_time = |
| 1308 base::Time::FromJsTime(new_last_forced_time[i]); |
| 1309 } |
| 1310 for (size_t i = num_new_forced; i < new_url_list.size(); ++i) { |
| 1311 std::ostringstream url; |
| 1312 url << "http://newnonforced/" << (i - num_new_forced); |
| 1313 new_url_list[i].url = GURL(url.str()); |
| 1314 } |
| 1315 |
| 1316 // Set the initial list of URLs. |
| 1317 SetTopSites(old_url_list); |
| 1318 EXPECT_EQ(num_old_forced + kNumNonForcedURLs, last_num_urls_changed()); |
| 1319 |
| 1320 TopSitesQuerier querier; |
| 1321 // Query only non-forced URLs first. |
| 1322 querier.QueryTopSites(top_sites(), false); |
| 1323 ASSERT_EQ(kNumNonForcedURLs, querier.urls().size()); |
| 1324 |
| 1325 // Check first URL. |
| 1326 EXPECT_EQ("http://oldnonforced/0", querier.urls()[0].url.spec()); |
| 1327 |
| 1328 // Query all URLs. |
| 1329 querier.QueryAllTopSites(top_sites(), false, true); |
| 1330 EXPECT_EQ(num_old_forced + kNumNonForcedURLs, querier.urls().size()); |
| 1331 |
| 1332 // Check first URLs. |
| 1333 EXPECT_EQ("http://oldforced/0", querier.urls()[0].url.spec()); |
| 1334 EXPECT_EQ("http://oldnonforced/0", querier.urls()[num_old_forced].url.spec()); |
| 1335 |
| 1336 // Set the new list of URLs. |
| 1337 SetTopSites(new_url_list); |
| 1338 |
| 1339 // Query all URLs. |
| 1340 querier.QueryAllTopSites(top_sites(), false, true); |
| 1341 |
| 1342 // We should have reached the maximum of 20 forced URLs. |
| 1343 ASSERT_EQ(20 + kNumNonForcedURLs, querier.urls().size()); |
| 1344 |
| 1345 // Check forced URLs. They follow the order of timestamps above, smaller |
| 1346 // timestamps since they were evicted. |
| 1347 EXPECT_EQ("http://newforced/1", querier.urls()[0].url.spec()); // 3000 |
| 1348 EXPECT_EQ("http://oldforced/1", querier.urls()[1].url.spec()); // 4000 |
| 1349 EXPECT_EQ("http://newforced/2", querier.urls()[2].url.spec()); // 5000 |
| 1350 EXPECT_EQ("http://newforced/3", querier.urls()[3].url.spec()); // 6000 |
| 1351 EXPECT_EQ("http://oldforced/2", querier.urls()[4].url.spec()); // 7000 |
| 1352 EXPECT_EQ("http://newforced/4", querier.urls()[5].url.spec()); // 8000 |
| 1353 EXPECT_EQ("http://newforced/5", querier.urls()[6].url.spec()); // 9000 |
| 1354 EXPECT_EQ("http://oldforced/3", querier.urls()[7].url.spec()); // 10000 |
| 1355 EXPECT_EQ("http://oldforced/4", querier.urls()[8].url.spec()); // 11000 |
| 1356 EXPECT_EQ("http://oldforced/5", querier.urls()[9].url.spec()); // 12000 |
| 1357 EXPECT_EQ("http://oldforced/6", querier.urls()[10].url.spec()); // 13000 |
| 1358 EXPECT_EQ("http://newforced/6", querier.urls()[11].url.spec()); // 14000 |
| 1359 EXPECT_EQ("http://newforced/7", querier.urls()[12].url.spec()); // 15000 |
| 1360 EXPECT_EQ("http://newforced/8", querier.urls()[13].url.spec()); // 16000 |
| 1361 EXPECT_EQ("http://newforced/9", querier.urls()[14].url.spec()); // 17000 |
| 1362 EXPECT_EQ("http://oldforced/7", querier.urls()[15].url.spec()); // 18000 |
| 1363 EXPECT_EQ("http://newforced/10", querier.urls()[16].url.spec()); // 19000 |
| 1364 EXPECT_EQ("http://newforced/11", querier.urls()[17].url.spec()); // 20000 |
| 1365 EXPECT_EQ("http://oldforced/8", querier.urls()[18].url.spec()); // 21000 |
| 1366 EXPECT_EQ("http://newforced/12", querier.urls()[19].url.spec()); // 22000 |
| 1367 |
| 1368 // Check first and last non-forced URLs. |
| 1369 EXPECT_EQ("http://newnonforced/0", querier.urls()[20].url.spec()); |
| 1370 EXPECT_EQ("http://newnonforced/19", querier.urls()[39].url.spec()); |
| 1371 } |
| 1372 |
| 1373 TEST_F(TopSitesImplTest, SetForcedTopSitesWithCollisions) { |
| 1374 MostVisitedURLList old_url_list; |
| 1375 MostVisitedURLList new_url_list; |
| 1376 |
| 1377 old_url_list.resize(5); |
| 1378 old_url_list[0].url = GURL("http://url/0"); |
| 1379 old_url_list[0].last_forced_time = base::Time::FromJsTime(1000); |
| 1380 old_url_list[1].url = GURL("http://collision/0"); // Evicted |
| 1381 old_url_list[1].last_forced_time = base::Time::FromJsTime(4000); |
| 1382 old_url_list[2].url = GURL("http://collision/1"); // Evicted |
| 1383 old_url_list[2].last_forced_time = base::Time::FromJsTime(6000); |
| 1384 old_url_list[3].url = GURL("http://collision/2"); // Evicted |
| 1385 old_url_list[3].last_forced_time = base::Time::FromJsTime(7000); |
| 1386 // The following is evicted since all non-forced URLs are, therefore it |
| 1387 // doesn't cause a collision. |
| 1388 old_url_list[4].url = GURL("http://noncollision/0"); |
| 1389 |
| 1390 new_url_list.resize(6); |
| 1391 new_url_list[0].url = GURL("http://collision/1"); |
| 1392 new_url_list[0].last_forced_time = base::Time::FromJsTime(2000); |
| 1393 new_url_list[1].url = GURL("http://url/2"); |
| 1394 new_url_list[1].last_forced_time = base::Time::FromJsTime(3000); |
| 1395 new_url_list[2].url = GURL("http://collision/0"); |
| 1396 new_url_list[2].last_forced_time = base::Time::FromJsTime(5000); |
| 1397 new_url_list[3].url = GURL("http://noncollision/0"); |
| 1398 new_url_list[3].last_forced_time = base::Time::FromJsTime(9000); |
| 1399 new_url_list[4].url = GURL("http://collision/2"); |
| 1400 new_url_list[5].url = GURL("http://url/3"); |
| 1401 |
| 1402 // Set the initial list of URLs. |
| 1403 SetTopSites(old_url_list); |
| 1404 |
| 1405 // Set the new list of URLs. |
| 1406 SetTopSites(new_url_list); |
| 1407 |
| 1408 // Query all URLs. |
| 1409 TopSitesQuerier querier; |
| 1410 querier.QueryAllTopSites(top_sites(), false, true); |
| 1411 |
| 1412 // Check URLs. When collision occurs, the incoming one is always preferred. |
| 1413 ASSERT_EQ(7u + GetPrepopulatePages().size(), querier.urls().size()); |
| 1414 EXPECT_EQ("http://url/0", querier.urls()[0].url.spec()); |
| 1415 EXPECT_EQ(1000u, querier.urls()[0].last_forced_time.ToJsTime()); |
| 1416 EXPECT_EQ("http://collision/1", querier.urls()[1].url.spec()); |
| 1417 EXPECT_EQ(2000u, querier.urls()[1].last_forced_time.ToJsTime()); |
| 1418 EXPECT_EQ("http://url/2", querier.urls()[2].url.spec()); |
| 1419 EXPECT_EQ(3000u, querier.urls()[2].last_forced_time.ToJsTime()); |
| 1420 EXPECT_EQ("http://collision/0", querier.urls()[3].url.spec()); |
| 1421 EXPECT_EQ(5000u, querier.urls()[3].last_forced_time.ToJsTime()); |
| 1422 EXPECT_EQ("http://noncollision/0", querier.urls()[4].url.spec()); |
| 1423 EXPECT_EQ(9000u, querier.urls()[4].last_forced_time.ToJsTime()); |
| 1424 EXPECT_EQ("http://collision/2", querier.urls()[5].url.spec()); |
| 1425 EXPECT_TRUE(querier.urls()[5].last_forced_time.is_null()); |
| 1426 EXPECT_EQ("http://url/3", querier.urls()[6].url.spec()); |
| 1427 EXPECT_TRUE(querier.urls()[6].last_forced_time.is_null()); |
| 1428 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 7)); |
| 1429 } |
| 1430 |
| 1431 |
| 1432 TEST_F(TopSitesImplTest, SetTopSitesIdentical) { |
| 1433 MostVisitedURLList url_list; |
| 1434 url_list.resize(3); |
| 1435 url_list[0].url = GURL("http://url/0"); |
| 1436 url_list[0].last_forced_time = base::Time::FromJsTime(1000); |
| 1437 url_list[1].url = GURL("http://url/1"); // Evicted |
| 1438 url_list[2].url = GURL("http://url/2"); // Evicted |
| 1439 |
| 1440 // Set the initial list of URLs. |
| 1441 SetTopSites(url_list); |
| 1442 |
| 1443 // Set the new list of URLs. |
| 1444 SetTopSites(MostVisitedURLList(url_list)); |
| 1445 |
| 1446 // Query all URLs. |
| 1447 TopSitesQuerier querier; |
| 1448 querier.QueryAllTopSites(top_sites(), false, true); |
| 1449 |
| 1450 // Check URLs. When collision occurs, the incoming one is always preferred. |
| 1451 ASSERT_EQ(3u + GetPrepopulatePages().size(), querier.urls().size()); |
| 1452 EXPECT_EQ("http://url/0", querier.urls()[0].url.spec()); |
| 1453 EXPECT_EQ(1000u, querier.urls()[0].last_forced_time.ToJsTime()); |
| 1454 EXPECT_EQ("http://url/1", querier.urls()[1].url.spec()); |
| 1455 EXPECT_EQ("http://url/2", querier.urls()[2].url.spec()); |
| 1456 ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 3)); |
| 1457 } |
| 1458 |
1098 } // namespace history | 1459 } // namespace history |
OLD | NEW |