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; |
393 DummyPrerenderContents* prerender_contents = | 395 concurrencies_to_test.push_back( |
394 prerender_manager()->CreateNextPrerenderContents( | 396 prerender_manager()->config().max_concurrency); |
395 url, | 397 concurrencies_to_test.push_back(1); |
396 FINAL_STATUS_EVICTED); | 398 concurrencies_to_test.push_back(2); |
| 399 |
397 DummyPrerenderContents* null = NULL; | 400 DummyPrerenderContents* null = NULL; |
398 EXPECT_TRUE(AddSimplePrerender(url)); | 401 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 | 402 |
402 GURL url1("http://news.google.com/"); | 403 for (std::vector<int>::const_iterator i = concurrencies_to_test.begin(); |
403 DummyPrerenderContents* prerender_contents1 = | 404 i != concurrencies_to_test.end(); |
404 prerender_manager()->CreateNextPrerenderContents( | 405 ++i) { |
405 url1, | 406 const int max_concurrency = *i; |
406 FINAL_STATUS_USED); | 407 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 | 408 |
411 ASSERT_EQ(null, prerender_manager()->FindEntry(url)); | 409 DummyPrerenderContents* prerender_contents_to_evict = |
412 ASSERT_EQ(prerender_contents1, prerender_manager()->FindAndUseEntry(url1)); | 410 prerender_manager()->CreateNextPrerenderContents( |
413 } | 411 url_to_evict, FINAL_STATUS_EVICTED); |
| 412 EXPECT_TRUE(AddSimplePrerender(url_to_evict)); |
| 413 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
| 414 EXPECT_TRUE(prerender_contents_to_evict->prerendering_has_started()); |
414 | 415 |
415 // Two element prerender test. Ensure that the LRU operates correctly if we | 416 std::vector<GURL> urls; |
416 // permit 2 elements to be kept prerendered. | 417 std::vector<PrerenderContents*> prerender_contentses; |
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 | 418 |
429 GURL url1("http://news.google.com/"); | 419 for (int j = 0; j < max_concurrency; ++j) { |
430 DummyPrerenderContents* prerender_contents1 = | 420 urls.push_back(GURL(base::StringPrintf("http://google.com/use#%d", j))); |
431 prerender_manager()->CreateNextPrerenderContents( | 421 prerender_contentses.push_back( |
432 url1, | 422 prerender_manager()->CreateNextPrerenderContents(urls.back(), |
433 FINAL_STATUS_USED); | 423 FINAL_STATUS_USED)); |
434 EXPECT_TRUE(AddSimplePrerender(url1)); | 424 EXPECT_TRUE(AddSimplePrerender(urls.back())); |
435 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | 425 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
436 EXPECT_TRUE(prerender_contents1->prerendering_has_started()); | 426 EXPECT_TRUE(prerender_contentses.back()->prerendering_has_started()); |
| 427 } |
437 | 428 |
438 GURL url2("http://images.google.com/"); | 429 ASSERT_EQ(null, prerender_manager()->FindEntry(url_to_evict)); |
439 DummyPrerenderContents* prerender_contents2 = | 430 for (int j = 0; j < max_concurrency; ++j) { |
440 prerender_manager()->CreateNextPrerenderContents( | 431 ASSERT_EQ(prerender_contentses[j], |
441 url2, | 432 prerender_manager()->FindAndUseEntry(urls[j])); |
442 FINAL_STATUS_USED); | 433 } |
443 EXPECT_TRUE(AddSimplePrerender(url2)); | 434 } |
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 } | 435 } |
451 | 436 |
452 TEST_F(PrerenderTest, AliasURLTest) { | 437 TEST_F(PrerenderTest, AliasURLTest) { |
453 GURL url("http://www.google.com/"); | 438 GURL url("http://www.google.com/"); |
454 GURL alias_url1("http://www.google.com/index.html"); | 439 GURL alias_url1("http://www.google.com/index.html"); |
455 GURL alias_url2("http://google.com/"); | 440 GURL alias_url2("http://google.com/"); |
456 GURL not_an_alias_url("http://google.com/index.html"); | 441 GURL not_an_alias_url("http://google.com/index.html"); |
457 std::vector<GURL> alias_urls; | 442 std::vector<GURL> alias_urls; |
458 alias_urls.push_back(alias_url1); | 443 alias_urls.push_back(alias_url1); |
459 alias_urls.push_back(alias_url2); | 444 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/"); | 489 GURL url1("http://news.google.com/"); |
505 prerender_manager()->CreateNextPrerenderContents( | 490 prerender_manager()->CreateNextPrerenderContents( |
506 url, | 491 url, |
507 FINAL_STATUS_MANAGER_SHUTDOWN); | 492 FINAL_STATUS_MANAGER_SHUTDOWN); |
508 EXPECT_FALSE(AddSimplePrerender(url1)); | 493 EXPECT_FALSE(AddSimplePrerender(url1)); |
509 prerender_manager()->set_rate_limit_enabled(false); | 494 prerender_manager()->set_rate_limit_enabled(false); |
510 } | 495 } |
511 | 496 |
512 // Ensure that we don't ignore prerender requests outside the rate limit. | 497 // Ensure that we don't ignore prerender requests outside the rate limit. |
513 TEST_F(PrerenderTest, RateLimitOutsideWindowTest) { | 498 TEST_F(PrerenderTest, RateLimitOutsideWindowTest) { |
| 499 // Setting concurrency to one lets us force eviction by adding only one more |
| 500 // prerender. |
| 501 prerender_manager()->mutable_config().max_concurrency = 1; |
| 502 |
514 GURL url("http://www.google.com/"); | 503 GURL url("http://www.google.com/"); |
515 DummyPrerenderContents* prerender_contents = | 504 DummyPrerenderContents* prerender_contents = |
516 prerender_manager()->CreateNextPrerenderContents( | 505 prerender_manager()->CreateNextPrerenderContents( |
517 url, | 506 url, |
518 FINAL_STATUS_EVICTED); | 507 FINAL_STATUS_EVICTED); |
519 DummyPrerenderContents* null = NULL; | 508 DummyPrerenderContents* null = NULL; |
520 EXPECT_TRUE(AddSimplePrerender(url)); | 509 EXPECT_TRUE(AddSimplePrerender(url)); |
521 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | 510 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
522 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 511 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
523 | 512 |
524 prerender_manager()->set_rate_limit_enabled(true); | 513 prerender_manager()->set_rate_limit_enabled(true); |
525 prerender_manager()->AdvanceTimeTicks( | 514 prerender_manager()->AdvanceTimeTicks( |
526 base::TimeDelta::FromMilliseconds(2000)); | 515 base::TimeDelta::FromMilliseconds( |
| 516 UnitTestPrerenderManager::kMinTimeBetweenPrerendersMs + 500)); |
527 | 517 |
528 GURL url1("http://news.google.com/"); | 518 GURL url1("http://news.google.com/"); |
529 DummyPrerenderContents* rate_limit_prerender_contents = | 519 DummyPrerenderContents* rate_limit_prerender_contents = |
530 prerender_manager()->CreateNextPrerenderContents( | 520 prerender_manager()->CreateNextPrerenderContents( |
531 url1, | 521 url1, |
532 FINAL_STATUS_MANAGER_SHUTDOWN); | 522 FINAL_STATUS_MANAGER_SHUTDOWN); |
533 EXPECT_TRUE(AddSimplePrerender(url1)); | 523 EXPECT_TRUE(AddSimplePrerender(url1)); |
534 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); | 524 EXPECT_EQ(null, prerender_manager()->next_prerender_contents()); |
535 EXPECT_TRUE(rate_limit_prerender_contents->prerendering_has_started()); | 525 EXPECT_TRUE(rate_limit_prerender_contents->prerendering_has_started()); |
536 prerender_manager()->set_rate_limit_enabled(false); | 526 prerender_manager()->set_rate_limit_enabled(false); |
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 prerender_manager()->CreateNextPrerenderContents( | 1077 prerender_manager()->CreateNextPrerenderContents( |
1088 url, FINAL_STATUS_USED); | 1078 url, FINAL_STATUS_USED); |
1089 EXPECT_TRUE(AddSimplePrerender(url)); | 1079 EXPECT_TRUE(AddSimplePrerender(url)); |
1090 EXPECT_TRUE(second_prerender_contents->prerendering_has_started()); | 1080 EXPECT_TRUE(second_prerender_contents->prerendering_has_started()); |
1091 ASSERT_EQ(second_prerender_contents, | 1081 ASSERT_EQ(second_prerender_contents, |
1092 prerender_manager()->FindAndUseEntry(url)); | 1082 prerender_manager()->FindAndUseEntry(url)); |
1093 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); | 1083 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); |
1094 } | 1084 } |
1095 | 1085 |
1096 } // namespace prerender | 1086 } // namespace prerender |
OLD | NEW |