Index: chrome/browser/prerender/prerender_unittest.cc |
diff --git a/chrome/browser/prerender/prerender_unittest.cc b/chrome/browser/prerender/prerender_unittest.cc |
index 4dead3002f8a6e6533093a32e82e8069fbe31180..b4e8fe360b955eb7ce4f05dc02479c0c575e3dc8 100644 |
--- a/chrome/browser/prerender/prerender_unittest.cc |
+++ b/chrome/browser/prerender/prerender_unittest.cc |
@@ -1355,4 +1355,54 @@ TEST_F(PrerenderTest, LinkManagerWaitToLaunchNotLaunched) { |
EXPECT_TRUE(IsEmptyPrerenderLinkManager()); |
} |
+// Creates two prerenders, one of which should start when the first one expires. |
+TEST_F(PrerenderTest, LinkManagerExpireRevealingLaunch) { |
+ SetConcurrency(1); |
+ ASSERT_LT(prerender_manager()->config().max_wait_to_launch, |
+ prerender_manager()->config().time_to_live); |
+ |
+ GURL first_url("http://www.willexpire.com"); |
+ DummyPrerenderContents* first_prerender_contents = |
+ prerender_manager()->CreateNextPrerenderContents( |
+ first_url, FINAL_STATUS_TIMED_OUT); |
+ EXPECT_TRUE(AddSimplePrerender(first_url)); |
+ EXPECT_EQ(first_prerender_contents, |
+ prerender_manager()->FindEntry(first_url)); |
+ |
+ // Insert the second prerender so it will be still be launchable when the |
+ // first expires. |
+ const TimeDelta wait_to_launch_second_prerender = |
+ prerender_manager()->config().time_to_live - |
+ prerender_manager()->config().max_wait_to_launch + |
+ TimeDelta::FromSeconds(2); |
+ const TimeDelta wait_for_first_prerender_to_expire = |
+ prerender_manager()->config().time_to_live - |
+ wait_to_launch_second_prerender + |
+ TimeDelta::FromSeconds(1); |
+ ASSERT_LT(prerender_manager()->config().time_to_live, |
+ wait_to_launch_second_prerender + |
+ wait_for_first_prerender_to_expire); |
+ ASSERT_GT(prerender_manager()->config().max_wait_to_launch.InSeconds(), |
+ wait_for_first_prerender_to_expire.InSeconds()); |
+ |
+ prerender_manager()->AdvanceTimeTicks(wait_to_launch_second_prerender); |
+ GURL second_url("http://www.willlaunch.com"); |
+ DummyPrerenderContents* second_prerender_contents = |
+ prerender_manager()->CreateNextPrerenderContents( |
+ second_url, FINAL_STATUS_USED); |
+ EXPECT_FALSE(AddSimplePrerender(second_url)); |
+ |
+ // The first prerender is still running, but the second has not yet launched. |
+ EXPECT_EQ(first_prerender_contents, |
+ prerender_manager()->FindEntry(first_url)); |
+ PrerenderContents* null = NULL; |
+ EXPECT_EQ(null, prerender_manager()->FindEntry(second_url)); |
+ |
+ // The first prerender should have died, giving life to the second one. |
+ prerender_manager()->AdvanceTimeTicks(wait_for_first_prerender_to_expire); |
+ EXPECT_EQ(null, prerender_manager()->FindEntry(first_url)); |
+ EXPECT_EQ(second_prerender_contents, |
+ prerender_manager()->FindAndUseEntry(second_url)); |
+} |
+ |
} // namespace prerender |