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

Side by Side Diff: chrome/browser/history/top_sites_impl_unittest.cc

Issue 53283004: Adding support for forced URLs to TopSites. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed GetAllMostVisited. Created 7 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/history/top_sites_impl.cc ('k') | chrome/browser/jumplist_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/history/top_sites_impl.cc ('k') | chrome/browser/jumplist_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698