Chromium Code Reviews| Index: chrome/browser/prerender/prerender_unittest.cc |
| diff --git a/chrome/browser/prerender/prerender_unittest.cc b/chrome/browser/prerender/prerender_unittest.cc |
| index 59fbd4280ab42bb2c35cc335340b7313547bc1be..8ffb439667638213a7e500b324157cd80370132b 100644 |
| --- a/chrome/browser/prerender/prerender_unittest.cc |
| +++ b/chrome/browser/prerender/prerender_unittest.cc |
| @@ -2,6 +2,9 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <map> |
| +#include <utility> |
| + |
| #include "base/command_line.h" |
| #include "base/format_macros.h" |
| #include "base/memory/scoped_vector.h" |
| @@ -43,9 +46,7 @@ class DummyPrerenderContents : public PrerenderContents { |
| Origin origin, |
| FinalStatus expected_final_status); |
| - virtual ~DummyPrerenderContents() { |
| - EXPECT_EQ(expected_final_status_, final_status()); |
| - } |
| + virtual ~DummyPrerenderContents(); |
| virtual void StartPrerendering( |
| int ALLOW_UNUSED creator_child_id, |
| @@ -135,7 +136,6 @@ class UnitTestPrerenderManager : public PrerenderManager { |
| PrerenderContents* prerender_contents = prerender_data->ReleaseContents(); |
| active_prerenders_.erase(to_erase); |
| - prerender_contents->SetFinalStatus(FINAL_STATUS_USED); |
| prerender_contents->PrepareForUse(); |
| return prerender_contents; |
| } |
| @@ -204,6 +204,28 @@ class UnitTestPrerenderManager : public PrerenderManager { |
| return time_ticks_; |
| } |
| + virtual PrerenderContents* GetPrerenderContentsForRoute( |
| + int child_id, int route_id) const OVERRIDE { |
| + // Overridden for the PrerenderLinkManager's pending prerender logic. |
| + PrerenderContentsMap::const_iterator iter = prerender_contents_map_.find( |
| + std::make_pair(child_id, route_id)); |
| + if (iter == prerender_contents_map_.end()) |
| + return NULL; |
| + return iter->second; |
| + } |
| + |
| + void DummyPrerenderContentsStarted(int child_id, |
| + int route_id, |
| + PrerenderContents* prerender_contents) { |
| + prerender_contents_map_[std::make_pair(child_id, route_id)] = |
| + prerender_contents; |
| + } |
| + |
| + void DummyPrerenderContentsDestroyed(int child_id, |
| + int route_id) { |
| + prerender_contents_map_.erase(std::make_pair(child_id, route_id)); |
| + } |
| + |
| private: |
| void SetNextPrerenderContents(DummyPrerenderContents* prerender_contents) { |
| CHECK(!next_prerender_contents_.get()); |
| @@ -224,6 +246,11 @@ class UnitTestPrerenderManager : public PrerenderManager { |
| return next_prerender_contents_.release(); |
| } |
| + // Maintain a map from route pairs to PrerenderContents for |
| + // GetPrerenderContentsForRoute. |
| + typedef std::map<std::pair<int,int>, PrerenderContents*> PrerenderContentsMap; |
| + PrerenderContentsMap prerender_contents_map_; |
| + |
| Time time_; |
| TimeTicks time_ticks_; |
| scoped_ptr<PrerenderContents> next_prerender_contents_; |
| @@ -258,6 +285,11 @@ DummyPrerenderContents::DummyPrerenderContents( |
| expected_final_status_(expected_final_status) { |
| } |
| +DummyPrerenderContents::~DummyPrerenderContents() { |
| + EXPECT_EQ(expected_final_status_, final_status()); |
| + test_prerender_manager_->DummyPrerenderContentsDestroyed(-1, route_id_); |
| +} |
| + |
| void DummyPrerenderContents::StartPrerendering( |
| int ALLOW_UNUSED creator_child_id, |
| const gfx::Size& ALLOW_UNUSED size, |
| @@ -269,6 +301,7 @@ void DummyPrerenderContents::StartPrerendering( |
| load_start_time_ = test_prerender_manager_->GetCurrentTimeTicks(); |
| if (!test_prerender_manager_->IsControlGroup(experiment_id())) { |
| prerendering_has_started_ = true; |
| + test_prerender_manager_->DummyPrerenderContentsStarted(-1, route_id_, this); |
| NotifyPrerenderStart(); |
| } |
| } |
| @@ -332,6 +365,13 @@ class PrerenderTest : public testing::Test { |
| return prerender && prerender->handle; |
| } |
| + bool LauncherHasScheduledPrerender(int child_id, int prerender_id) { |
| + PrerenderLinkManager::LinkPrerender* prerender = |
| + prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( |
| + child_id, prerender_id); |
| + return prerender != NULL; |
| + } |
| + |
| // Shorthand to add a simple prerender with a reasonable source. Returns |
| // true iff the prerender has been added to the PrerenderManager by the |
| // PrerenderLinkManager and the PrerenderManager returned a handle. |
| @@ -587,21 +627,16 @@ TEST_F(PrerenderTest, MaxConcurrencyTest) { |
| if (concurrencies_to_test[i].max_link_concurrency > |
| effective_max_link_concurrency) { |
| // We should be able to launch more prerenders on this system, but not for |
| - // our current launcher. |
| - int child_id; |
| - int route_id; |
| - ASSERT_TRUE(prerender_contentses.back()->GetChildId(&child_id)); |
| - ASSERT_TRUE(prerender_contentses.back()->GetRouteId(&route_id)); |
| - |
| + // the default launcher. |
| GURL extra_url("http://google.com/extraurl"); |
| - prerender_link_manager()->OnAddPrerender(child_id, |
| - GetNextPrerenderID(), |
| - extra_url, content::Referrer(), |
| - kSize, route_id); |
| + EXPECT_FALSE(AddSimplePrerender(extra_url)); |
| const int prerender_id = last_prerender_id(); |
| - EXPECT_TRUE(LauncherHasRunningPrerender(child_id, prerender_id)); |
| - prerender_link_manager()->OnCancelPrerender(child_id, prerender_id); |
| - EXPECT_FALSE(LauncherHasRunningPrerender(child_id, prerender_id)); |
| + EXPECT_TRUE(LauncherHasScheduledPrerender(kDefaultChildId, |
| + prerender_id)); |
| + prerender_link_manager()->OnCancelPrerender(kDefaultChildId, |
| + prerender_id); |
| + EXPECT_FALSE(LauncherHasScheduledPrerender(kDefaultChildId, |
| + prerender_id)); |
| } |
| DummyPrerenderContents* prerender_contents_to_delay = |
| @@ -677,25 +712,28 @@ TEST_F(PrerenderTest, PendingPrerenderTest) { |
| GURL pending_url("http://news.google.com/"); |
| + // Schedule a pending prerender launched from the prerender. |
| DummyPrerenderContents* pending_prerender_contents = |
| prerender_manager()->CreateNextPrerenderContents( |
| pending_url, |
| ORIGIN_GWS_PRERENDER, |
| FINAL_STATUS_USED); |
| - scoped_ptr<PrerenderHandle> pending_prerender_handle( |
| - prerender_manager()->AddPrerenderFromLinkRelPrerender( |
| - child_id, route_id, pending_url, |
| - Referrer(url, blink::WebReferrerPolicyDefault), kSize)); |
| - CHECK(pending_prerender_handle.get()); |
| - EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
| - |
| + prerender_link_manager()->OnAddPrerender( |
| + child_id, GetNextPrerenderID(), pending_url, |
| + Referrer(url, blink::WebReferrerPolicyDefault), |
| + kSize, route_id); |
| + EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| + EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
| + |
| + // Use the referring prerender. |
| EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
| ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
| - EXPECT_TRUE(pending_prerender_handle->IsPrerendering()); |
| + // The pending prerender should start now. |
| + EXPECT_TRUE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| + EXPECT_TRUE(pending_prerender_contents->prerendering_has_started()); |
| ASSERT_EQ(pending_prerender_contents, |
| prerender_manager()->FindAndUseEntry(pending_url)); |
| - EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
| } |
| TEST_F(PrerenderTest, InvalidPendingPrerenderTest) { |
| @@ -715,21 +753,26 @@ TEST_F(PrerenderTest, InvalidPendingPrerenderTest) { |
| // to start. |
| GURL pending_url("ftp://news.google.com/"); |
| - prerender_manager()->CreateNextPrerenderContents( |
| - pending_url, |
| - ORIGIN_GWS_PRERENDER, |
| - FINAL_STATUS_UNSUPPORTED_SCHEME); |
| - scoped_ptr<PrerenderHandle> pending_prerender_handle( |
| - prerender_manager()->AddPrerenderFromLinkRelPrerender( |
| - child_id, route_id, pending_url, |
| - Referrer(url, blink::WebReferrerPolicyDefault), kSize)); |
| - DCHECK(pending_prerender_handle.get()); |
| - EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
| - |
| + // Schedule a pending prerender launched from the prerender. |
| + DummyPrerenderContents* pending_prerender_contents = |
| + prerender_manager()->CreateNextPrerenderContents( |
| + pending_url, |
| + ORIGIN_GWS_PRERENDER, |
| + FINAL_STATUS_UNSUPPORTED_SCHEME); |
| + prerender_link_manager()->OnAddPrerender( |
|
gavinp
2014/01/30 19:58:49
Nice. I like that these tests are going through th
davidben
2014/01/30 21:01:51
They have to anyway; the logic has moved to Preren
|
| + child_id, GetNextPrerenderID(), pending_url, |
| + Referrer(url, blink::WebReferrerPolicyDefault), |
| + kSize, route_id); |
| + EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| + EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
| + |
| + // Use the referring prerender. |
| EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
| ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
| - EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
| + // The pending prerender still doesn't start. |
| + EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| + EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
| } |
| TEST_F(PrerenderTest, CancelPendingPrerenderTest) { |
| @@ -747,18 +790,22 @@ TEST_F(PrerenderTest, CancelPendingPrerenderTest) { |
| GURL pending_url("http://news.google.com/"); |
| - scoped_ptr<PrerenderHandle> pending_prerender_handle( |
| - prerender_manager()->AddPrerenderFromLinkRelPrerender( |
| - child_id, route_id, pending_url, |
| - Referrer(url, blink::WebReferrerPolicyDefault), kSize)); |
| - CHECK(pending_prerender_handle.get()); |
| - EXPECT_FALSE(pending_prerender_handle->IsPrerendering()); |
| + // Schedule a pending prerender launched from the prerender. |
| + prerender_link_manager()->OnAddPrerender( |
| + child_id, GetNextPrerenderID(), pending_url, |
| + Referrer(url, blink::WebReferrerPolicyDefault), |
| + kSize, route_id); |
| + EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| - EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
| - |
| - pending_prerender_handle.reset(); |
| + // Cancel the pending prerender. |
| + prerender_link_manager()->OnCancelPrerender(child_id, last_prerender_id()); |
| + // Use the referring prerender. |
| + EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
| ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
| + |
| + // The pending prerender doesn't start. |
| + EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
| } |
| // Tests that a PrerenderManager created for a browser session in the control |