Chromium Code Reviews| 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/command_line.h" | 5 #include "base/command_line.h" |
| 6 #include "base/memory/scoped_vector.h" | 6 #include "base/memory/scoped_vector.h" |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/stringprintf.h" | |
| 8 #include "base/time.h" | 9 #include "base/time.h" |
| 9 #include "chrome/browser/prerender/prerender_contents.h" | 10 #include "chrome/browser/prerender/prerender_contents.h" |
| 10 #include "chrome/browser/prerender/prerender_handle.h" | 11 #include "chrome/browser/prerender/prerender_handle.h" |
| 11 #include "chrome/browser/prerender/prerender_link_manager.h" | 12 #include "chrome/browser/prerender/prerender_link_manager.h" |
| 12 #include "chrome/browser/prerender/prerender_manager.h" | 13 #include "chrome/browser/prerender/prerender_manager.h" |
| 13 #include "chrome/browser/prerender/prerender_origin.h" | 14 #include "chrome/browser/prerender/prerender_origin.h" |
| 14 #include "chrome/common/chrome_switches.h" | 15 #include "chrome/common/chrome_switches.h" |
| 15 #include "chrome/test/base/testing_browser_process.h" | 16 #include "chrome/test/base/testing_browser_process.h" |
| 16 #include "chrome/test/base/testing_profile.h" | 17 #include "chrome/test/base/testing_profile.h" |
| 17 #include "content/public/browser/render_view_host.h" | 18 #include "content/public/browser/render_view_host.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 67 UnitTestPrerenderManager* test_prerender_manager_; | 68 UnitTestPrerenderManager* test_prerender_manager_; |
| 68 FinalStatus expected_final_status_; | 69 FinalStatus expected_final_status_; |
| 69 }; | 70 }; |
| 70 | 71 |
| 71 const gfx::Size kSize(640, 480); | 72 const gfx::Size kSize(640, 480); |
| 72 | 73 |
| 73 } // namespace | 74 } // namespace |
| 74 | 75 |
| 75 class UnitTestPrerenderManager : public PrerenderManager { | 76 class UnitTestPrerenderManager : public PrerenderManager { |
| 76 public: | 77 public: |
| 78 using PrerenderManager::kMinTimeBetweenPrerendersMs; | |
| 77 using PrerenderManager::kNavigationRecordWindowMs; | 79 using PrerenderManager::kNavigationRecordWindowMs; |
| 78 using PrerenderManager::GetMaxAge; | 80 using PrerenderManager::GetMaxAge; |
| 79 | 81 |
| 80 explicit UnitTestPrerenderManager(PrerenderTracker* prerender_tracker) | 82 explicit UnitTestPrerenderManager(PrerenderTracker* prerender_tracker) |
| 81 : PrerenderManager(&profile_, prerender_tracker), | 83 : PrerenderManager(&profile_, prerender_tracker), |
| 82 time_(base::Time::Now()), | 84 time_(base::Time::Now()), |
| 83 time_ticks_(base::TimeTicks::Now()), | 85 time_ticks_(base::TimeTicks::Now()), |
| 84 next_prerender_contents_(NULL), | 86 next_prerender_contents_(NULL), |
| 85 prerender_tracker_(prerender_tracker) { | 87 prerender_tracker_(prerender_tracker) { |
| 86 set_rate_limit_enabled(false); | 88 set_rate_limit_enabled(false); |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 379 FINAL_STATUS_TIMED_OUT); | 381 FINAL_STATUS_TIMED_OUT); |
| 380 DummyPrerenderContents* null = NULL; | 382 DummyPrerenderContents* null = NULL; |
| 381 EXPECT_TRUE(AddSimplePrerender(url)); | 383 EXPECT_TRUE(AddSimplePrerender(url)); |
| 382 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | 384 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
| 383 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 385 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
| 384 prerender_manager()->AdvanceTimeTicks(prerender_manager()->GetMaxAge() + | 386 prerender_manager()->AdvanceTimeTicks(prerender_manager()->GetMaxAge() + |
| 385 base::TimeDelta::FromSeconds(1)); | 387 base::TimeDelta::FromSeconds(1)); |
| 386 ASSERT_EQ(null, prerender_manager()->FindEntry(url)); | 388 ASSERT_EQ(null, prerender_manager()->FindEntry(url)); |
| 387 } | 389 } |
| 388 | 390 |
| 389 // LRU Test. Make sure that if we prerender more than one request, that | 391 // LRU Test. Make sure that if we prerender more requests than we support, that |
| 390 // the oldest one will be dropped. | 392 // the oldest one will be dropped. |
| 391 TEST_F(PrerenderTest, DropOldestRequestTest) { | 393 TEST_F(PrerenderTest, DropOldestRequestTest) { |
| 392 GURL url("http://www.google.com/"); | 394 std::vector<int> concurrencies_to_test(3); |
| 393 DummyPrerenderContents* prerender_contents = | 395 concurrencies_to_test.at(0) = prerender_manager()->config().max_concurrency; |
|
dominich
2012/07/19 16:04:38
concurrencies_to_test[0] = ...
or concurrencies_t
gavinp
2012/07/23 18:35:21
Done. Although I really like vector<>::at() for it
| |
| 394 prerender_manager()->CreateNextPrerenderContents( | 396 concurrencies_to_test.at(1) = 1; |
| 395 url, | 397 concurrencies_to_test.at(2) = 2; |
| 396 FINAL_STATUS_EVICTED); | 398 |
| 397 DummyPrerenderContents* null = NULL; | 399 DummyPrerenderContents* null = NULL; |
| 398 EXPECT_TRUE(AddSimplePrerender(url)); | 400 GURL url_to_evict("http://www.google.com/evictme"); |
| 399 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | |
| 400 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | |
| 401 | 401 |
| 402 GURL url1("http://news.google.com/"); | 402 for (std::vector<int>::size_type i = 0; |
|
dominich
2012/07/19 16:04:38
iterator loop would be better here.
gavinp
2012/07/23 18:35:21
Done.
| |
| 403 DummyPrerenderContents* prerender_contents1 = | 403 i < concurrencies_to_test.size(); |
| 404 prerender_manager()->CreateNextPrerenderContents( | 404 ++i) { |
| 405 url1, | 405 const int max_concurrency = concurrencies_to_test.at(i); |
| 406 FINAL_STATUS_USED); | 406 prerender_manager()->mutable_config().max_concurrency = max_concurrency; |
| 407 EXPECT_TRUE(AddSimplePrerender(url1)); | |
| 408 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | |
| 409 EXPECT_TRUE(prerender_contents1->prerendering_has_started()); | |
| 410 | 407 |
| 411 ASSERT_EQ(null, prerender_manager()->FindEntry(url)); | 408 DummyPrerenderContents* prerender_contents_to_evict = |
| 412 ASSERT_EQ(prerender_contents1, prerender_manager()->FindAndUseEntry(url1)); | 409 prerender_manager()->CreateNextPrerenderContents( |
| 413 } | 410 url_to_evict, FINAL_STATUS_EVICTED); |
| 411 EXPECT_TRUE(AddSimplePrerender(url_to_evict)); | |
| 412 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | |
| 413 EXPECT_TRUE(prerender_contents_to_evict->prerendering_has_started()); | |
| 414 | 414 |
| 415 // Two element prerender test. Ensure that the LRU operates correctly if we | 415 std::vector<GURL> urls; |
| 416 // permit 2 elements to be kept prerendered. | 416 std::vector<PrerenderContents*> prerender_contentses; |
|
dominich
2012/07/19 16:04:38
what's he got in his prerender contentses, my prec
gavinp
2012/07/23 18:35:21
I could have stayed with prerender_contents, but t
| |
| 417 TEST_F(PrerenderTest, TwoElementPrerenderTest) { | |
| 418 prerender_manager()->mutable_config().max_elements = 2; | |
| 419 GURL url("http://www.google.com/"); | |
| 420 DummyPrerenderContents* prerender_contents = | |
| 421 prerender_manager()->CreateNextPrerenderContents( | |
| 422 url, | |
| 423 FINAL_STATUS_EVICTED); | |
| 424 DummyPrerenderContents* null = NULL; | |
| 425 EXPECT_TRUE(AddSimplePrerender(url)); | |
| 426 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | |
| 427 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | |
| 428 | 417 |
| 429 GURL url1("http://news.google.com/"); | 418 for (int j = 0; j < max_concurrency; ++j) { |
| 430 DummyPrerenderContents* prerender_contents1 = | 419 urls.push_back(GURL(base::StringPrintf("http://google.com/use#%d", j))); |
| 431 prerender_manager()->CreateNextPrerenderContents( | 420 prerender_contentses.push_back( |
| 432 url1, | 421 prerender_manager()->CreateNextPrerenderContents(urls.back(), |
| 433 FINAL_STATUS_USED); | 422 FINAL_STATUS_USED)); |
| 434 EXPECT_TRUE(AddSimplePrerender(url1)); | 423 EXPECT_TRUE(AddSimplePrerender(urls.back())); |
| 435 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | 424 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
| 436 EXPECT_TRUE(prerender_contents1->prerendering_has_started()); | 425 EXPECT_TRUE(prerender_contentses.back()->prerendering_has_started()); |
| 426 } | |
| 437 | 427 |
| 438 GURL url2("http://images.google.com/"); | 428 ASSERT_EQ(null, prerender_manager()->FindEntry(url_to_evict)); |
| 439 DummyPrerenderContents* prerender_contents2 = | 429 for (int j = 0; j < max_concurrency; ++j) { |
| 440 prerender_manager()->CreateNextPrerenderContents( | 430 ASSERT_EQ(prerender_contentses.at(j), |
|
dominich
2012/07/19 16:04:38
prerender_contentses[j]
gavinp
2012/07/23 18:35:21
Done.
| |
| 441 url2, | 431 prerender_manager()->FindAndUseEntry(urls.at(j))); |
|
dominich
2012/07/19 16:04:38
urls[j]
gavinp
2012/07/23 18:35:21
Done.
| |
| 442 FINAL_STATUS_USED); | 432 } |
| 443 EXPECT_TRUE(AddSimplePrerender(url2)); | 433 } |
| 444 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | |
| 445 EXPECT_TRUE(prerender_contents2->prerendering_has_started()); | |
| 446 | |
| 447 ASSERT_EQ(null, prerender_manager()->FindEntry(url)); | |
| 448 ASSERT_EQ(prerender_contents1, prerender_manager()->FindAndUseEntry(url1)); | |
| 449 ASSERT_EQ(prerender_contents2, prerender_manager()->FindAndUseEntry(url2)); | |
| 450 } | 434 } |
| 451 | 435 |
| 452 TEST_F(PrerenderTest, AliasURLTest) { | 436 TEST_F(PrerenderTest, AliasURLTest) { |
| 453 GURL url("http://www.google.com/"); | 437 GURL url("http://www.google.com/"); |
| 454 GURL alias_url1("http://www.google.com/index.html"); | 438 GURL alias_url1("http://www.google.com/index.html"); |
| 455 GURL alias_url2("http://google.com/"); | 439 GURL alias_url2("http://google.com/"); |
| 456 GURL not_an_alias_url("http://google.com/index.html"); | 440 GURL not_an_alias_url("http://google.com/index.html"); |
| 457 std::vector<GURL> alias_urls; | 441 std::vector<GURL> alias_urls; |
| 458 alias_urls.push_back(alias_url1); | 442 alias_urls.push_back(alias_url1); |
| 459 alias_urls.push_back(alias_url2); | 443 alias_urls.push_back(alias_url2); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 504 GURL url1("http://news.google.com/"); | 488 GURL url1("http://news.google.com/"); |
| 505 prerender_manager()->CreateNextPrerenderContents( | 489 prerender_manager()->CreateNextPrerenderContents( |
| 506 url, | 490 url, |
| 507 FINAL_STATUS_MANAGER_SHUTDOWN); | 491 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 508 EXPECT_FALSE(AddSimplePrerender(url1)); | 492 EXPECT_FALSE(AddSimplePrerender(url1)); |
| 509 prerender_manager()->set_rate_limit_enabled(false); | 493 prerender_manager()->set_rate_limit_enabled(false); |
| 510 } | 494 } |
| 511 | 495 |
| 512 // Ensure that we don't ignore prerender requests outside the rate limit. | 496 // Ensure that we don't ignore prerender requests outside the rate limit. |
| 513 TEST_F(PrerenderTest, RateLimitOutsideWindowTest) { | 497 TEST_F(PrerenderTest, RateLimitOutsideWindowTest) { |
| 498 // Setting concurrency to one lets us force eviction by adding only one more | |
| 499 // prerender. | |
| 500 prerender_manager()->mutable_config().max_concurrency = 1; | |
| 501 | |
| 514 GURL url("http://www.google.com/"); | 502 GURL url("http://www.google.com/"); |
| 515 DummyPrerenderContents* prerender_contents = | 503 DummyPrerenderContents* prerender_contents = |
| 516 prerender_manager()->CreateNextPrerenderContents( | 504 prerender_manager()->CreateNextPrerenderContents( |
| 517 url, | 505 url, |
| 518 FINAL_STATUS_EVICTED); | 506 FINAL_STATUS_EVICTED); |
| 519 DummyPrerenderContents* null = NULL; | 507 DummyPrerenderContents* null = NULL; |
| 520 EXPECT_TRUE(AddSimplePrerender(url)); | 508 EXPECT_TRUE(AddSimplePrerender(url)); |
| 521 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | 509 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
| 522 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 510 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
| 523 | 511 |
| 524 prerender_manager()->set_rate_limit_enabled(true); | 512 prerender_manager()->set_rate_limit_enabled(true); |
| 525 prerender_manager()->AdvanceTimeTicks( | 513 prerender_manager()->AdvanceTimeTicks( |
| 526 base::TimeDelta::FromMilliseconds(2000)); | 514 base::TimeDelta::FromMilliseconds( |
| 515 UnitTestPrerenderManager::kMinTimeBetweenPrerendersMs + 500)); | |
| 527 | 516 |
| 528 GURL url1("http://news.google.com/"); | 517 GURL url1("http://news.google.com/"); |
| 529 DummyPrerenderContents* rate_limit_prerender_contents = | 518 DummyPrerenderContents* rate_limit_prerender_contents = |
| 530 prerender_manager()->CreateNextPrerenderContents( | 519 prerender_manager()->CreateNextPrerenderContents( |
| 531 url1, | 520 url1, |
| 532 FINAL_STATUS_MANAGER_SHUTDOWN); | 521 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 533 EXPECT_TRUE(AddSimplePrerender(url1)); | 522 EXPECT_TRUE(AddSimplePrerender(url1)); |
| 534 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | 523 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
| 535 EXPECT_TRUE(rate_limit_prerender_contents->prerendering_has_started()); | 524 EXPECT_TRUE(rate_limit_prerender_contents->prerendering_has_started()); |
| 536 prerender_manager()->set_rate_limit_enabled(false); | 525 prerender_manager()->set_rate_limit_enabled(false); |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1087 prerender_manager()->CreateNextPrerenderContents( | 1076 prerender_manager()->CreateNextPrerenderContents( |
| 1088 url, FINAL_STATUS_USED); | 1077 url, FINAL_STATUS_USED); |
| 1089 EXPECT_TRUE(AddSimplePrerender(url)); | 1078 EXPECT_TRUE(AddSimplePrerender(url)); |
| 1090 EXPECT_TRUE(second_prerender_contents->prerendering_has_started()); | 1079 EXPECT_TRUE(second_prerender_contents->prerendering_has_started()); |
| 1091 ASSERT_EQ(second_prerender_contents, | 1080 ASSERT_EQ(second_prerender_contents, |
| 1092 prerender_manager()->FindAndUseEntry(url)); | 1081 prerender_manager()->FindAndUseEntry(url)); |
| 1093 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); | 1082 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); |
| 1094 } | 1083 } |
| 1095 | 1084 |
| 1096 } // namespace prerender | 1085 } // namespace prerender |
| OLD | NEW |