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

Side by Side Diff: chrome/browser/prerender/prerender_unittest.cc

Issue 11551003: Change multi-prerender API to include per launcher slots. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 12 months 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
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/command_line.h" 5 #include "base/command_line.h"
6 #include "base/format_macros.h"
6 #include "base/memory/scoped_vector.h" 7 #include "base/memory/scoped_vector.h"
7 #include "base/message_loop.h" 8 #include "base/message_loop.h"
8 #include "base/stringprintf.h" 9 #include "base/stringprintf.h"
9 #include "base/time.h" 10 #include "base/time.h"
10 #include "chrome/browser/prerender/prerender_contents.h" 11 #include "chrome/browser/prerender/prerender_contents.h"
11 #include "chrome/browser/prerender/prerender_handle.h" 12 #include "chrome/browser/prerender/prerender_handle.h"
12 #include "chrome/browser/prerender/prerender_link_manager.h" 13 #include "chrome/browser/prerender/prerender_link_manager.h"
13 #include "chrome/browser/prerender/prerender_manager.h" 14 #include "chrome/browser/prerender/prerender_manager.h"
14 #include "chrome/browser/prerender/prerender_origin.h" 15 #include "chrome/browser/prerender/prerender_origin.h"
15 #include "chrome/common/chrome_switches.h" 16 #include "chrome/common/chrome_switches.h"
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 } 297 }
297 298
298 UnitTestPrerenderManager* prerender_manager() { 299 UnitTestPrerenderManager* prerender_manager() {
299 return prerender_manager_.get(); 300 return prerender_manager_.get();
300 } 301 }
301 302
302 PrerenderLinkManager* prerender_link_manager() { 303 PrerenderLinkManager* prerender_link_manager() {
303 return prerender_link_manager_.get(); 304 return prerender_link_manager_.get();
304 } 305 }
305 306
307 void SetConcurrency(size_t concurrency) {
308 prerender_manager()->mutable_config().max_link_concurrency_per_launcher =
309 concurrency;
310 prerender_manager()->mutable_config().max_link_concurrency =
311 std::max(prerender_manager()->mutable_config().max_link_concurrency,
312 concurrency);
313 }
314
306 bool IsEmptyPrerenderLinkManager() { 315 bool IsEmptyPrerenderLinkManager() {
307 return prerender_link_manager_->IsEmpty(); 316 return prerender_link_manager_->IsEmpty();
308 } 317 }
309 318
310 int last_prerender_id() const { 319 int last_prerender_id() const {
311 return last_prerender_id_; 320 return last_prerender_id_;
312 } 321 }
313 322
314 int GetNextPrerenderID() { 323 int GetNextPrerenderID() {
315 return ++last_prerender_id_; 324 return ++last_prerender_id_;
316 } 325 }
317 326
318 // Shorthand to add a simple preload with a reasonable source. 327 bool PrerenderHasHandle(int child_id, int prerender_id) {
mmenke 2012/12/28 18:25:33 Think this name is confusing. LauncherHasRunningP
gavinp 2012/12/28 19:53:46 Done.
328 PrerenderLinkManager::Prerender* prerender =
329 prerender_link_manager()-> FindByLauncherChildIdAndPrerenderId(
mmenke 2012/12/28 18:25:33 nit: Remove space
gavinp 2012/12/28 19:53:46 Done.
330 child_id, prerender_id);
331 return prerender && prerender->handle;
332 }
333
334 // Shorthand to add a simple prerender with a reasonable source. Returns
335 // true iff the prerender has been added to the PrerenderManager by the
336 // PrerenderLinkManager and the PrerenderManager returned a handle.
319 bool AddSimplePrerender(const GURL& url) { 337 bool AddSimplePrerender(const GURL& url) {
320 return prerender_link_manager()->OnAddPrerender( 338 prerender_link_manager()->OnAddPrerender(kDefaultChildId,
321 kDefaultChildId, GetNextPrerenderID(), 339 GetNextPrerenderID(),
322 url, content::Referrer(), 340 url, content::Referrer(),
323 kSize, kDefaultRenderViewRouteId); 341 kSize, kDefaultRenderViewRouteId);
342 return PrerenderHasHandle(kDefaultChildId, last_prerender_id());
324 } 343 }
325 344
326 private: 345 private:
327 PrerenderTracker* prerender_tracker() { 346 PrerenderTracker* prerender_tracker() {
328 return g_browser_process->prerender_tracker(); 347 return g_browser_process->prerender_tracker();
329 } 348 }
330 349
331 // Needed to pass PrerenderManager's DCHECKs. 350 // Needed to pass PrerenderManager's DCHECKs.
332 TestingProfile profile_; 351 TestingProfile profile_;
333 MessageLoop message_loop_; 352 MessageLoop message_loop_;
334 content::TestBrowserThread ui_thread_; 353 content::TestBrowserThread ui_thread_;
335 scoped_ptr<UnitTestPrerenderManager> prerender_manager_; 354 scoped_ptr<UnitTestPrerenderManager> prerender_manager_;
336 scoped_ptr<PrerenderLinkManager> prerender_link_manager_; 355 scoped_ptr<PrerenderLinkManager> prerender_link_manager_;
337 int last_prerender_id_; 356 int last_prerender_id_;
338 }; 357 };
339 358
340 TEST_F(PrerenderTest, FoundTest) { 359 TEST_F(PrerenderTest, FoundTest) {
341 GURL url("http://www.google.com/"); 360 GURL url("http://www.google.com/");
342 DummyPrerenderContents* prerender_contents = 361 DummyPrerenderContents* prerender_contents =
343 prerender_manager()->CreateNextPrerenderContents( 362 prerender_manager()->CreateNextPrerenderContents(
344 url, 363 url,
345 FINAL_STATUS_USED); 364 FINAL_STATUS_USED);
346 EXPECT_TRUE(AddSimplePrerender(url)); 365 EXPECT_TRUE(AddSimplePrerender(url));
347 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 366 EXPECT_TRUE(prerender_contents->prerendering_has_started());
348 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 367 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
349 } 368 }
350 369
370 // Make sure that if queue a request, and a second prerender request for the
371 // same URL comes in, that the second request attaches to the first prerender,
372 // and we don't use the second prerender contents.
351 TEST_F(PrerenderTest, DuplicateTest) { 373 TEST_F(PrerenderTest, DuplicateTest) {
374 SetConcurrency(2);
352 GURL url("http://www.google.com/"); 375 GURL url("http://www.google.com/");
353 DummyPrerenderContents* prerender_contents = 376 DummyPrerenderContents* prerender_contents =
354 prerender_manager()->CreateNextPrerenderContents( 377 prerender_manager()->CreateNextPrerenderContents(
355 url,
356 FINAL_STATUS_USED);
357 EXPECT_TRUE(AddSimplePrerender(url));
358 EXPECT_TRUE(prerender_contents->prerendering_has_started());
359
360 scoped_ptr<PrerenderHandle> duplicate_prerender_handle(
361 prerender_manager()->AddPrerenderFromLinkRelPrerender(
362 kDefaultChildId, kDefaultRenderViewRouteId, url,
363 Referrer(url, WebKit::WebReferrerPolicyDefault), kSize));
364
365 EXPECT_TRUE(duplicate_prerender_handle->IsPrerendering());
366
367 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
368
369 EXPECT_FALSE(duplicate_prerender_handle->IsPrerendering());
370 }
371
372 // Make sure that if queue a request, and a second prerender request for the
373 // same URL comes in, that we drop the second request and keep the first one.
374 TEST_F(PrerenderTest, DropSecondRequestTest) {
375 GURL url("http://www.google.com/");
376 DummyPrerenderContents* prerender_contents =
377 prerender_manager()->CreateNextPrerenderContents(
378 url, 378 url,
379 FINAL_STATUS_USED); 379 FINAL_STATUS_USED);
380 DummyPrerenderContents* null = NULL; 380 DummyPrerenderContents* null = NULL;
381 EXPECT_TRUE(AddSimplePrerender(url)); 381 EXPECT_TRUE(AddSimplePrerender(url));
382 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 382 EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
383 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 383 EXPECT_TRUE(prerender_contents->prerendering_has_started());
384 384
385 DummyPrerenderContents* prerender_contents1 = 385 DummyPrerenderContents* prerender_contents1 =
386 prerender_manager()->CreateNextPrerenderContents( 386 prerender_manager()->CreateNextPrerenderContents(
387 url, 387 url,
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 last_prerender_id()); 477 last_prerender_id());
478 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 478 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
479 479
480 DummyPrerenderContents* null = NULL; 480 DummyPrerenderContents* null = NULL;
481 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 481 EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
482 482
483 prerender_manager()->AdvanceTimeTicks(second_advance); 483 prerender_manager()->AdvanceTimeTicks(second_advance);
484 EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 484 EXPECT_EQ(null, prerender_manager()->FindEntry(url));
485 } 485 }
486 486
487 // LRU Test. Make sure that if we prerender more requests than we support, that 487 // Make sure that if we prerender more requests than we support, that we launch
488 // the oldest one will be dropped. 488 // them in the order given up until we reach MaxConcurrency, at which point we
489 TEST_F(PrerenderTest, DropOldestRequestTest) { 489 // queue them and launch them in the order given. As well, insure that limits
490 std::vector<int> concurrencies_to_test; 490 // are enforced for the system as a whole and on a per launcher basis.
491 concurrencies_to_test.push_back( 491 TEST_F(PrerenderTest, MaxConcurrencyTest) {
mmenke 2012/12/28 18:25:33 Three test suggestions, with per_launcher = 1, max
gavinp 2012/12/28 19:53:46 (1) is already tested in this test, right? I've a
mmenke 2012/12/28 20:15:13 Yup. Wrote this comment early, before I looked at
492 prerender_manager()->config().max_concurrency); 492 struct TestConcurrency {
493 concurrencies_to_test.push_back(1); 493 size_t max_link_concurrency;
494 concurrencies_to_test.push_back(2); 494 size_t max_link_concurrency_per_launcher;
495 };
496
497 TestConcurrency concurrencies_to_test[] = {
498 { prerender_manager()->config().max_link_concurrency,
499 prerender_manager()->config(). max_link_concurrency_per_launcher},
mmenke 2012/12/28 18:25:33 nit: Remove space.
gavinp 2012/12/28 19:53:46 Done.
500
501 // With the system limit higher than the per launcher limit, the per
502 // launcher limit should be in effect.
503 { 2, 1 },
504
505 // With the per launcher limit higher than system limit, the system limit
506 // should be in effect.
507 { 2, 4 },
508 };
495 509
496 DummyPrerenderContents* null = NULL; 510 DummyPrerenderContents* null = NULL;
497 GURL url_to_evict("http://www.google.com/evictme"); 511 GURL url_to_delay("http://www.google.com/delayme");
498 512
499 for (std::vector<int>::const_iterator i = concurrencies_to_test.begin(); 513 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(concurrencies_to_test); ++i) {
500 i != concurrencies_to_test.end(); 514 prerender_manager()->mutable_config().max_link_concurrency =
501 ++i) { 515 concurrencies_to_test[i].max_link_concurrency;
502 const int max_concurrency = *i; 516 prerender_manager()->mutable_config().max_link_concurrency_per_launcher =
503 prerender_manager()->mutable_config().max_concurrency = max_concurrency; 517 concurrencies_to_test[i].max_link_concurrency_per_launcher;
504 518
505 DummyPrerenderContents* prerender_contents_to_evict = 519 const size_t effective_max_link_concurrency =
506 prerender_manager()->CreateNextPrerenderContents( 520 std::min(concurrencies_to_test[i].max_link_concurrency,
507 url_to_evict, FINAL_STATUS_EVICTED); 521 concurrencies_to_test[i].max_link_concurrency_per_launcher);
508 EXPECT_TRUE(AddSimplePrerender(url_to_evict));
509 EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
510 EXPECT_TRUE(prerender_contents_to_evict->prerendering_has_started());
511 522
512 std::vector<GURL> urls; 523 std::vector<GURL> urls;
513 std::vector<PrerenderContents*> prerender_contentses; 524 std::vector<PrerenderContents*> prerender_contentses;
514 525
515 for (int j = 0; j < max_concurrency; ++j) { 526 for (size_t j = 0; j < effective_max_link_concurrency; ++j) {
516 urls.push_back(GURL(base::StringPrintf("http://google.com/use#%d", j))); 527 urls.push_back(
528 GURL(base::StringPrintf("http://google.com/use#%" PRIuS, j)));
517 prerender_contentses.push_back( 529 prerender_contentses.push_back(
518 prerender_manager()->CreateNextPrerenderContents(urls.back(), 530 prerender_manager()->CreateNextPrerenderContents(urls.back(),
519 FINAL_STATUS_USED)); 531 FINAL_STATUS_USED));
520 EXPECT_TRUE(AddSimplePrerender(urls.back())); 532 EXPECT_TRUE(AddSimplePrerender(urls.back()));
521 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 533 EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
522 EXPECT_TRUE(prerender_contentses.back()->prerendering_has_started()); 534 EXPECT_TRUE(prerender_contentses.back()->prerendering_has_started());
523 } 535 }
524 536
525 ASSERT_EQ(null, prerender_manager()->FindEntry(url_to_evict)); 537 DummyPrerenderContents* prerender_contents_to_delay =
526 for (int j = 0; j < max_concurrency; ++j) { 538 prerender_manager()->CreateNextPrerenderContents(url_to_delay,
527 ASSERT_EQ(prerender_contentses[j], 539 FINAL_STATUS_USED);
540 EXPECT_FALSE(AddSimplePrerender(url_to_delay));
541 EXPECT_FALSE(prerender_contents_to_delay->prerendering_has_started());
542 EXPECT_NE(null, prerender_manager()->next_prerender_contents());
543 EXPECT_EQ(null, prerender_manager()->FindEntry(url_to_delay));
544 for (size_t j = 0; j < effective_max_link_concurrency; ++j) {
545 EXPECT_EQ(prerender_contentses[j],
528 prerender_manager()->FindAndUseEntry(urls[j])); 546 prerender_manager()->FindAndUseEntry(urls[j]));
529 } 547 }
548
549 EXPECT_TRUE(prerender_contents_to_delay->prerendering_has_started());
mmenke 2012/12/28 18:25:33 Suggest checking this at the end of the above loop
gavinp 2012/12/28 19:53:46 Done.
550 EXPECT_EQ(prerender_contents_to_delay,
551 prerender_manager()->FindAndUseEntry(url_to_delay));
552 EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
530 } 553 }
531 } 554 }
532 555
533 TEST_F(PrerenderTest, AliasURLTest) { 556 TEST_F(PrerenderTest, AliasURLTest) {
557 SetConcurrency(7);
558
534 GURL url("http://www.google.com/"); 559 GURL url("http://www.google.com/");
535 GURL alias_url1("http://www.google.com/index.html"); 560 GURL alias_url1("http://www.google.com/index.html");
536 GURL alias_url2("http://google.com/"); 561 GURL alias_url2("http://google.com/");
537 GURL not_an_alias_url("http://google.com/index.html"); 562 GURL not_an_alias_url("http://google.com/index.html");
538 std::vector<GURL> alias_urls; 563 std::vector<GURL> alias_urls;
539 alias_urls.push_back(alias_url1); 564 alias_urls.push_back(alias_url1);
540 alias_urls.push_back(alias_url2); 565 alias_urls.push_back(alias_url2);
541 566
542 // Test that all of the aliases work, but not_an_alias_url does not. 567 // Test that all of the aliases work, but not_an_alias_url does not.
543 DummyPrerenderContents* prerender_contents = 568 DummyPrerenderContents* prerender_contents =
(...skipping 17 matching lines...) Expand all
561 prerender_contents = prerender_manager()->CreateNextPrerenderContents( 586 prerender_contents = prerender_manager()->CreateNextPrerenderContents(
562 url, alias_urls, FINAL_STATUS_USED); 587 url, alias_urls, FINAL_STATUS_USED);
563 EXPECT_TRUE(AddSimplePrerender(url)); 588 EXPECT_TRUE(AddSimplePrerender(url));
564 EXPECT_TRUE(AddSimplePrerender(url)); 589 EXPECT_TRUE(AddSimplePrerender(url));
565 EXPECT_TRUE(AddSimplePrerender(alias_url1)); 590 EXPECT_TRUE(AddSimplePrerender(alias_url1));
566 EXPECT_TRUE(AddSimplePrerender(alias_url2)); 591 EXPECT_TRUE(AddSimplePrerender(alias_url2));
567 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 592 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
568 } 593 }
569 594
570 // Ensure that we ignore prerender requests within the rate limit. 595 // Ensure that we ignore prerender requests within the rate limit.
571 TEST_F(PrerenderTest, RateLimitInWindowTest) { 596 TEST_F(PrerenderTest, RateLimitInWindowTest) {
mmenke 2012/12/28 18:25:33 Test comment and name no longer make any sense. S
gavinp 2012/12/28 19:53:46 Done.
597 prerender_manager()->set_rate_limit_enabled(true);
598 SetConcurrency(2);
572 GURL url("http://www.google.com/"); 599 GURL url("http://www.google.com/");
573 DummyPrerenderContents* prerender_contents = 600 DummyPrerenderContents* prerender_contents =
574 prerender_manager()->CreateNextPrerenderContents( 601 prerender_manager()->CreateNextPrerenderContents(
575 url, 602 url,
576 FINAL_STATUS_MANAGER_SHUTDOWN); 603 FINAL_STATUS_MANAGER_SHUTDOWN);
577 DummyPrerenderContents* null = NULL; 604 DummyPrerenderContents* null = NULL;
578 EXPECT_TRUE(AddSimplePrerender(url)); 605 EXPECT_TRUE(AddSimplePrerender(url));
579 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 606 EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
580 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 607 EXPECT_TRUE(prerender_contents->prerendering_has_started());
581 608
582 prerender_manager()->set_rate_limit_enabled(true);
583 prerender_manager()->AdvanceTimeTicks(TimeDelta::FromMilliseconds(1)); 609 prerender_manager()->AdvanceTimeTicks(TimeDelta::FromMilliseconds(1));
584 610
585 GURL url1("http://news.google.com/"); 611 GURL url1("http://news.google.com/");
586 prerender_manager()->CreateNextPrerenderContents( 612 prerender_manager()->CreateNextPrerenderContents(
587 url, 613 url1,
588 FINAL_STATUS_MANAGER_SHUTDOWN); 614 FINAL_STATUS_MANAGER_SHUTDOWN);
589 EXPECT_FALSE(AddSimplePrerender(url1)); 615 EXPECT_FALSE(AddSimplePrerender(url1));
590 prerender_manager()->set_rate_limit_enabled(false); 616 prerender_manager()->set_rate_limit_enabled(false);
591 } 617 }
592 618
593 // Ensure that we don't ignore prerender requests outside the rate limit. 619 // Ensure that we don't ignore prerender requests outside the rate limit.
594 TEST_F(PrerenderTest, RateLimitOutsideWindowTest) { 620 TEST_F(PrerenderTest, RateLimitOutsideWindowTest) {
mmenke 2012/12/28 18:25:33 This is now identical to the above test, so should
595 // Setting concurrency to one lets us force eviction by adding only one more 621 SetConcurrency(2);
596 // prerender.
597 prerender_manager()->mutable_config().max_concurrency = 1;
598 622
599 GURL url("http://www.google.com/"); 623 GURL url("http://www.google.com/");
600 DummyPrerenderContents* prerender_contents = 624 DummyPrerenderContents* prerender_contents =
601 prerender_manager()->CreateNextPrerenderContents( 625 prerender_manager()->CreateNextPrerenderContents(
602 url, 626 url,
603 FINAL_STATUS_EVICTED); 627 FINAL_STATUS_MANAGER_SHUTDOWN);
mmenke 2012/12/28 18:25:33 If we wanted to test the same thing as before, thi
gavinp 2012/12/28 19:53:46 I just tossed it.
604 DummyPrerenderContents* null = NULL; 628 DummyPrerenderContents* null = NULL;
605 EXPECT_TRUE(AddSimplePrerender(url)); 629 EXPECT_TRUE(AddSimplePrerender(url));
606 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); 630 EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
607 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 631 EXPECT_TRUE(prerender_contents->prerendering_has_started());
608 632
609 prerender_manager()->set_rate_limit_enabled(true); 633 prerender_manager()->set_rate_limit_enabled(true);
610 prerender_manager()->AdvanceTimeTicks( 634 prerender_manager()->AdvanceTimeTicks(
611 TimeDelta::FromMilliseconds( 635 TimeDelta::FromMilliseconds(
612 UnitTestPrerenderManager::kMinTimeBetweenPrerendersMs + 500)); 636 UnitTestPrerenderManager::kMinTimeBetweenPrerendersMs + 500));
613 637
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
736 } 760 }
737 761
738 // Tests that prerendering is cancelled when the source render view does not 762 // Tests that prerendering is cancelled when the source render view does not
739 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be 763 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be
740 // triggered. 764 // triggered.
741 TEST_F(PrerenderTest, SourceRenderViewClosed) { 765 TEST_F(PrerenderTest, SourceRenderViewClosed) {
742 GURL url("http://www.google.com/"); 766 GURL url("http://www.google.com/");
743 prerender_manager()->CreateNextPrerenderContents( 767 prerender_manager()->CreateNextPrerenderContents(
744 url, 768 url,
745 FINAL_STATUS_MANAGER_SHUTDOWN); 769 FINAL_STATUS_MANAGER_SHUTDOWN);
746 EXPECT_FALSE(prerender_link_manager()->OnAddPrerender( 770 prerender_link_manager()->OnAddPrerender(100, GetNextPrerenderID(), url,
747 100, GetNextPrerenderID(), url, 771 Referrer(), kSize, 200);
748 Referrer(), kSize, 200)); 772 EXPECT_FALSE(PrerenderHasHandle(100, last_prerender_id()));
749 } 773 }
750 774
751 // Tests that prerendering is cancelled when we launch a second prerender of 775 // Tests that prerendering is cancelled when we launch a second prerender of
752 // the same target within a short time interval. 776 // the same target within a short time interval.
753 TEST_F(PrerenderTest, RecentlyVisited) { 777 TEST_F(PrerenderTest, RecentlyVisited) {
754 GURL url("http://www.google.com/"); 778 GURL url("http://www.google.com/");
755 779
756 prerender_manager()->RecordNavigation(url); 780 prerender_manager()->RecordNavigation(url);
757 781
758 DummyPrerenderContents* prerender_contents = 782 DummyPrerenderContents* prerender_contents =
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 TEST_F(PrerenderTest, LinkManagerCancelTwice) { 1037 TEST_F(PrerenderTest, LinkManagerCancelTwice) {
1014 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1038 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1015 GURL url("http://www.myexample.com"); 1039 GURL url("http://www.myexample.com");
1016 DummyPrerenderContents* prerender_contents = 1040 DummyPrerenderContents* prerender_contents =
1017 prerender_manager()->CreateNextPrerenderContents( 1041 prerender_manager()->CreateNextPrerenderContents(
1018 url, FINAL_STATUS_CANCELLED); 1042 url, FINAL_STATUS_CANCELLED);
1019 1043
1020 EXPECT_TRUE(AddSimplePrerender(url)); 1044 EXPECT_TRUE(AddSimplePrerender(url));
1021 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 1045 EXPECT_TRUE(prerender_contents->prerendering_has_started());
1022 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 1046 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
1023 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 1047 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
1024 prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 1048 prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
1025 last_prerender_id()); 1049 last_prerender_id());
1026 1050
1027 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1051 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1028 EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 1052 EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
1029 DummyPrerenderContents* null = NULL; 1053 DummyPrerenderContents* null = NULL;
1030 ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 1054 ASSERT_EQ(null, prerender_manager()->FindEntry(url));
1031 prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 1055 prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
1032 last_prerender_id()); 1056 last_prerender_id());
1033 } 1057 }
1034 1058
1035 TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwice) { 1059 TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwice) {
1060 SetConcurrency(2);
1036 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1061 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1037 GURL url("http://www.myexample.com"); 1062 GURL url("http://www.myexample.com");
1038 DummyPrerenderContents* prerender_contents = 1063 DummyPrerenderContents* prerender_contents =
1039 prerender_manager()->CreateNextPrerenderContents( 1064 prerender_manager()->CreateNextPrerenderContents(
1040 url, FINAL_STATUS_CANCELLED); 1065 url, FINAL_STATUS_CANCELLED);
1041 1066
1042 EXPECT_TRUE(AddSimplePrerender(url)); 1067 EXPECT_TRUE(AddSimplePrerender(url));
1043 1068
1044 const int first_prerender_id = last_prerender_id(); 1069 const int first_prerender_id = last_prerender_id();
1045 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 1070 EXPECT_TRUE(prerender_contents->prerendering_has_started());
1046 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 1071 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
1047 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 1072 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
1048 EXPECT_TRUE(AddSimplePrerender(url)); 1073 EXPECT_TRUE(AddSimplePrerender(url));
1049 1074
1050 const int second_prerender_id = last_prerender_id(); 1075 const int second_prerender_id = last_prerender_id();
1051 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 1076 EXPECT_TRUE(prerender_contents->prerendering_has_started());
1052 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 1077 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
1053 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 1078 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
1054 prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 1079 prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
1055 first_prerender_id); 1080 first_prerender_id);
1056 1081
1057 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 1082 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
1058 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 1083 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
1059 prerender_link_manager()->OnCancelPrerender(kDefaultChildId, 1084 prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
1060 second_prerender_id); 1085 second_prerender_id);
1061 1086
1062 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1087 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1063 EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 1088 EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
1064 DummyPrerenderContents* null = NULL; 1089 DummyPrerenderContents* null = NULL;
1065 ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 1090 ASSERT_EQ(null, prerender_manager()->FindEntry(url));
1066 } 1091 }
1067 1092
1068 TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwiceThenAbandonTwice) { 1093 TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwiceThenAbandonTwice) {
1094 SetConcurrency(2);
1069 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1095 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1070 GURL url("http://www.myexample.com"); 1096 GURL url("http://www.myexample.com");
1071 DummyPrerenderContents* prerender_contents = 1097 DummyPrerenderContents* prerender_contents =
1072 prerender_manager()->CreateNextPrerenderContents( 1098 prerender_manager()->CreateNextPrerenderContents(
1073 url, FINAL_STATUS_CANCELLED); 1099 url, FINAL_STATUS_CANCELLED);
1074 1100
1075 EXPECT_TRUE(AddSimplePrerender(url)); 1101 EXPECT_TRUE(AddSimplePrerender(url));
1076 1102
1077 const int first_prerender_id = last_prerender_id(); 1103 const int first_prerender_id = last_prerender_id();
1078 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 1104 EXPECT_TRUE(prerender_contents->prerendering_has_started());
(...skipping 24 matching lines...) Expand all
1103 second_prerender_id); 1129 second_prerender_id);
1104 1130
1105 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1131 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1106 EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled()); 1132 EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
1107 DummyPrerenderContents* null = NULL; 1133 DummyPrerenderContents* null = NULL;
1108 ASSERT_EQ(null, prerender_manager()->FindEntry(url)); 1134 ASSERT_EQ(null, prerender_manager()->FindEntry(url));
1109 } 1135 }
1110 1136
1111 // TODO(gavinp): Update this test after abandon has an effect on Prerenders, 1137 // TODO(gavinp): Update this test after abandon has an effect on Prerenders,
1112 // like shortening the timeouts. 1138 // like shortening the timeouts.
1113 TEST_F(PrerenderTest, LinkManagerAddTwiceAbandonTwice) { 1139 TEST_F(PrerenderTest, LinkManagerAddTwiceAbandonTwice) {
mmenke 2012/12/28 18:25:33 nit: May want to rename to LinkManagerAddTwiceAba
gavinp 2012/12/28 19:53:46 Done.
1140 SetConcurrency(2);
1114 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1141 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1115 GURL url("http://www.myexample.com"); 1142 GURL url("http://www.myexample.com");
1116 DummyPrerenderContents* prerender_contents = 1143 DummyPrerenderContents* prerender_contents =
1117 prerender_manager()->CreateNextPrerenderContents( 1144 prerender_manager()->CreateNextPrerenderContents(
1118 url, FINAL_STATUS_USED); 1145 url, FINAL_STATUS_USED);
1119 1146
1120 EXPECT_TRUE(AddSimplePrerender(url)); 1147 EXPECT_TRUE(AddSimplePrerender(url));
1121 1148
1122 const int first_prerender_id = last_prerender_id(); 1149 const int first_prerender_id = last_prerender_id();
1123 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 1150 EXPECT_TRUE(prerender_contents->prerendering_has_started());
1124 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 1151 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
1125 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 1152 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
1126 EXPECT_TRUE(AddSimplePrerender(url)); 1153 EXPECT_TRUE(AddSimplePrerender(url));
1127 1154
1128 const int second_prerender_id = last_prerender_id(); 1155 const int second_prerender_id = last_prerender_id();
1129 EXPECT_TRUE(prerender_contents->prerendering_has_started()); 1156 EXPECT_TRUE(prerender_contents->prerendering_has_started());
1130 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 1157 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
1131 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 1158 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
1132 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 1159 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
1133 first_prerender_id); 1160 first_prerender_id);
1134 1161
1135 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 1162 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
1136 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url)); 1163 ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
1137 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, 1164 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
1138 second_prerender_id); 1165 second_prerender_id);
1139 1166
1140 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled()); 1167 EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
1141 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); 1168 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
1169 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1142 } 1170 }
1143 1171
1144 // TODO(gavinp): After abandon shortens the expire time on a Prerender, 1172 // TODO(gavinp): After abandon shortens the expire time on a Prerender,
1145 // add a series of tests testing advancing the time by either the abandon 1173 // add a series of tests testing advancing the time by either the abandon
1146 // or normal expire, and verifying the expected behaviour with groups 1174 // or normal expire, and verifying the expected behaviour with groups
1147 // of links. 1175 // of links.
1148 TEST_F(PrerenderTest, LinkManagerExpireThenCancel) { 1176 TEST_F(PrerenderTest, LinkManagerExpireThenCancel) {
1149 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1177 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1150 GURL url("http://www.myexample.com"); 1178 GURL url("http://www.myexample.com");
1151 DummyPrerenderContents* prerender_contents = 1179 DummyPrerenderContents* prerender_contents =
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 1263
1236 prerender_manager()->AdvanceTimeTicks( 1264 prerender_manager()->AdvanceTimeTicks(
1237 prerender_manager()->config().abandon_time_to_live + 1265 prerender_manager()->config().abandon_time_to_live +
1238 TimeDelta::FromSeconds(1)); 1266 TimeDelta::FromSeconds(1));
1239 1267
1240 DummyPrerenderContents* null = NULL; 1268 DummyPrerenderContents* null = NULL;
1241 EXPECT_EQ(null, prerender_manager()->FindEntry(url)); 1269 EXPECT_EQ(null, prerender_manager()->FindEntry(url));
1242 EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1270 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1243 } 1271 }
1244 1272
1273 // Creates two prerenders, one of which should be blocked by the
1274 // max_link_concurrency; abandons both of them and waits to make sure both
1275 // are cleared from the PrerenderLinkManager.
1276 TEST_F(PrerenderTest, LinkManagerClearOnAbandon) {
mmenke 2012/12/28 18:25:33 I think "LinkManagerAbandonPendingPrerender" (Slow
mmenke 2012/12/28 18:25:33 You're depending on max_link_concurrency being 1 i
gavinp 2012/12/28 19:53:46 I set the concurrency in the test now. I went with
1277 ASSERT_LT(prerender_manager()->config().abandon_time_to_live,
1278 prerender_manager()->config().time_to_live);
1279 GURL first_url("http://www.myexample.com");
1280 DummyPrerenderContents* prerender_contents =
1281 prerender_manager()->CreateNextPrerenderContents(
1282 first_url, FINAL_STATUS_TIMED_OUT);
1283 EXPECT_TRUE(AddSimplePrerender(first_url));
1284 const int first_prerender_id = last_prerender_id();
1285
1286 GURL second_url("http://www.neverlaunched.com");
1287 EXPECT_FALSE(AddSimplePrerender(second_url));
1288 const int second_prerender_id = last_prerender_id();
1289
1290 EXPECT_FALSE(IsEmptyPrerenderLinkManager());
1291
1292 DummyPrerenderContents* null = NULL;
1293 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url));
1294 EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
1295
1296 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
1297 first_prerender_id);
1298 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
1299 second_prerender_id);
1300
1301 prerender_manager()->AdvanceTimeTicks(
1302 prerender_manager()->config().abandon_time_to_live +
1303 TimeDelta::FromSeconds(1));
1304 EXPECT_EQ(null, prerender_manager()->FindEntry(first_url));
1305 EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
1306 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1307 }
1308
1309 // Creates two prerenders, one of which should be blocked by the
1310 // max_link_concurrency; abandons both of them and waits to make sure both
1311 // are cleared from the PrerenderLinkManager.
mmenke 2012/12/28 18:25:33 Description should mention the second prerender is
gavinp 2012/12/28 19:53:46 Done.
1312 TEST_F(PrerenderTest, LinkManagerClearOnPendingAbandon) {
mmenke 2012/12/28 18:25:33 Suggest renaming the test. Now that PrerenderLink
gavinp 2012/12/28 19:53:46 I went with Inactive on the rename request on the
mmenke 2012/12/28 20:15:13 SGTM. Still think this test needs renaming, thoug
1313 ASSERT_LT(prerender_manager()->config().abandon_time_to_live,
1314 prerender_manager()->config().time_to_live);
1315 GURL first_url("http://www.myexample.com");
1316 DummyPrerenderContents* prerender_contents =
1317 prerender_manager()->CreateNextPrerenderContents(
1318 first_url, FINAL_STATUS_TIMED_OUT);
1319 EXPECT_TRUE(AddSimplePrerender(first_url));
1320 const int first_prerender_id = last_prerender_id();
1321
1322 int child_id;
1323 int route_id;
1324 ASSERT_TRUE(prerender_contents->GetChildId(&child_id));
1325 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id));
1326
1327 GURL pending_url("http://www.neverlaunched.com");
1328 prerender_link_manager()->OnAddPrerender(child_id,
1329 GetNextPrerenderID(),
1330 pending_url, content::Referrer(),
1331 kSize, route_id);
1332 const int second_prerender_id = last_prerender_id();
1333
1334 EXPECT_FALSE(IsEmptyPrerenderLinkManager());
1335
1336 DummyPrerenderContents* null = NULL;
1337 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url));
1338 EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url));
1339
1340 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
1341 first_prerender_id);
1342 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
1343 second_prerender_id);
1344
1345 prerender_manager()->AdvanceTimeTicks(
1346 prerender_manager()->config().abandon_time_to_live +
1347 TimeDelta::FromSeconds(1));
1348 EXPECT_EQ(null, prerender_manager()->FindEntry(first_url));
1349 EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url));
1350 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1351 }
1352
1353 // Creates two prerenders, one of which should be blocked by the
1354 // max_link_concurrency; uses one after the max wait to launch, and
1355 // ensures the second prerender does not start.
1356 TEST_F(PrerenderTest, LinkManagerWaitToLaunch) {
mmenke 2012/12/28 18:25:33 Suggest calling this LinkManagerWaitToLaunchNotLau
gavinp 2012/12/28 19:53:46 Done.
1357 ASSERT_LT(prerender_manager()->config().max_wait_to_launch,
1358 prerender_manager()->config().time_to_live);
1359 GURL first_url("http://www.myexample.com");
1360 DummyPrerenderContents* prerender_contents =
1361 prerender_manager()->CreateNextPrerenderContents(
1362 first_url, FINAL_STATUS_TIMED_OUT);
1363 EXPECT_TRUE(AddSimplePrerender(first_url));
1364
1365 GURL second_url("http://www.neverlaunched.com");
1366 EXPECT_FALSE(AddSimplePrerender(second_url));
1367
1368 EXPECT_FALSE(IsEmptyPrerenderLinkManager());
1369
1370 DummyPrerenderContents* null = NULL;
1371 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url));
1372 EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
1373
1374 prerender_manager()->AdvanceTimeTicks(
1375 prerender_manager()->config().max_wait_to_launch +
1376 TimeDelta::FromSeconds(1));
1377 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url));
1378 EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
1379
1380 EXPECT_EQ(prerender_contents,
1381 prerender_manager()->FindAndUseEntry(first_url));
1382
1383 EXPECT_EQ(null, prerender_manager()->FindEntry(first_url));
1384 EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
1385 EXPECT_TRUE(IsEmptyPrerenderLinkManager());
1386 }
1387
1245 } // namespace prerender 1388 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698