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

Unified Diff: chrome/browser/prerender/prerender_unittest.cc

Issue 10198040: New link rel=prerender api, using WebKit::WebPrerenderingPlatform (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 80 columns Created 8 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prerender/prerender_unittest.cc
diff --git a/chrome/browser/prerender/prerender_unittest.cc b/chrome/browser/prerender/prerender_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..322c86693c4778dbeceb2c16dba2d31f735f3f1c
--- /dev/null
+++ b/chrome/browser/prerender/prerender_unittest.cc
@@ -0,0 +1,924 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/command_line.h"
+#include "base/memory/scoped_vector.h"
+#include "base/message_loop.h"
+#include "base/time.h"
+#include "chrome/browser/prerender/prerender_contents.h"
+#include "chrome/browser/prerender/prerender_link_manager.h"
+#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_origin.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/test/test_browser_thread.h"
+#include "googleurl/src/gurl.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/size.h"
+
+using content::BrowserThread;
+
+namespace prerender {
+
+namespace {
+
+class DummyPrerenderContents : public PrerenderContents {
+ public:
+ DummyPrerenderContents(PrerenderManager* prerender_manager,
+ PrerenderTracker* prerender_tracker,
+ const GURL& url,
+ Origin origin,
+ FinalStatus expected_final_status)
+ : PrerenderContents(prerender_manager, prerender_tracker,
+ NULL, url, content::Referrer(),
+ origin, PrerenderManager::kNoExperiment),
+ has_started_(false),
+ expected_final_status_(expected_final_status) {
+ }
+
+ virtual ~DummyPrerenderContents() {
+ EXPECT_EQ(expected_final_status_, final_status());
+ }
+
+ virtual void StartPrerendering(
+ int ALLOW_UNUSED creator_child_id,
+ const gfx::Size& ALLOW_UNUSED size,
+ content::SessionStorageNamespace* ALLOW_UNUSED
+ session_storage_namespace) OVERRIDE {
+ has_started_ = true;
+ }
+
+ virtual bool GetChildId(int* child_id) const OVERRIDE {
+ *child_id = 0;
+ return true;
+ }
+
+ virtual bool GetRouteId(int* route_id) const OVERRIDE {
+ *route_id = 0;
+ return true;
+ }
+
+ bool has_started() const { return has_started_; }
+
+ FinalStatus expected_final_status() const { return expected_final_status_; }
+
+ bool prerendering_has_been_cancelled() const {
+ return PrerenderContents::prerendering_has_been_cancelled();
+ }
+
+ private:
+ bool has_started_;
+ FinalStatus expected_final_status_;
+};
+
+class TestPrerenderManager : public PrerenderManager {
+ public:
+ explicit TestPrerenderManager(PrerenderTracker* prerender_tracker)
+ : PrerenderManager(&profile_, prerender_tracker),
+ time_(base::Time::Now()),
+ time_ticks_(base::TimeTicks::Now()),
+ next_prerender_contents_(NULL),
+ prerender_tracker_(prerender_tracker) {
+ set_rate_limit_enabled(false);
+ }
+
+ virtual ~TestPrerenderManager() {
+ if (next_prerender_contents()) {
+ next_prerender_contents_.release()->Destroy(
+ FINAL_STATUS_MANAGER_SHUTDOWN);
+ }
+ // Set the final status for all PrerenderContents with an expected final
+ // status of FINAL_STATUS_USED. These values are normally set when the
+ // prerendered RVH is swapped into a tab, which doesn't happen in these
+ // unit tests.
+ for (ScopedVector<PrerenderContents>::iterator it =
+ used_prerender_contents_.begin();
+ it != used_prerender_contents_.end(); ++it) {
+ (*it)->set_final_status(FINAL_STATUS_USED);
+ }
+ DoShutdown();
+ }
+
+ void AdvanceTime(base::TimeDelta delta) {
+ time_ += delta;
+ }
+
+ void AdvanceTimeTicks(base::TimeDelta delta) {
+ time_ticks_ += delta;
+ }
+
+ DummyPrerenderContents* CreateNextPrerenderContents(
+ const GURL& url,
+ FinalStatus expected_final_status) {
+ DummyPrerenderContents* prerender_contents =
+ new DummyPrerenderContents(this, prerender_tracker_, url,
+ ORIGIN_LINK_REL_PRERENDER,
+ expected_final_status);
+ SetNextPrerenderContents(prerender_contents);
+ return prerender_contents;
+ }
+
+ DummyPrerenderContents* CreateNextPrerenderContents(
+ const GURL& url,
+ Origin origin,
+ FinalStatus expected_final_status) {
+ DummyPrerenderContents* prerender_contents =
+ new DummyPrerenderContents(this, prerender_tracker_, url,
+ origin, expected_final_status);
+ SetNextPrerenderContents(prerender_contents);
+ return prerender_contents;
+ }
+
+ DummyPrerenderContents* CreateNextPrerenderContents(
+ const GURL& url,
+ const std::vector<GURL>& alias_urls,
+ FinalStatus expected_final_status) {
+ DummyPrerenderContents* prerender_contents =
+ new DummyPrerenderContents(this, prerender_tracker_, url,
+ ORIGIN_LINK_REL_PRERENDER,
+ expected_final_status);
+ for (std::vector<GURL>::const_iterator it = alias_urls.begin();
+ it != alias_urls.end();
+ ++it) {
+ EXPECT_TRUE(prerender_contents->AddAliasURL(*it));
+ }
+ SetNextPrerenderContents(prerender_contents);
+ return prerender_contents;
+ }
+
+ void set_rate_limit_enabled(bool enabled) {
+ mutable_config().rate_limit_enabled = enabled;
+ }
+
+ PrerenderContents* next_prerender_contents() {
+ return next_prerender_contents_.get();
+ }
+
+ private:
+ void SetNextPrerenderContents(DummyPrerenderContents* prerender_contents) {
+ DCHECK(!next_prerender_contents_.get());
+ next_prerender_contents_.reset(prerender_contents);
+ if (prerender_contents->expected_final_status() == FINAL_STATUS_USED)
+ used_prerender_contents_.push_back(prerender_contents);
+ }
+
+ virtual base::Time GetCurrentTime() const OVERRIDE {
+ return time_;
+ }
+
+ virtual base::TimeTicks GetCurrentTimeTicks() const OVERRIDE {
+ return time_ticks_;
+ }
+
+ virtual PrerenderContents* CreatePrerenderContents(
+ const GURL& url,
+ const content::Referrer& referrer,
+ Origin origin,
+ uint8 experiment_id) OVERRIDE {
+ DCHECK(next_prerender_contents_.get());
+ DCHECK_EQ(next_prerender_contents_->prerender_url(), url);
+ DCHECK_EQ(next_prerender_contents_->origin(), origin);
+ return next_prerender_contents_.release();
+ }
+
+ base::Time time_;
+ base::TimeTicks time_ticks_;
+ scoped_ptr<PrerenderContents> next_prerender_contents_;
+ // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED,
+ // tracked so they will be automatically deleted.
+ ScopedVector<PrerenderContents> used_prerender_contents_;
+
+ PrerenderTracker* prerender_tracker_;
+
+ TestingProfile profile_;
+};
+
+class RestorePrerenderMode {
+ public:
+ RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) {
+ }
+
+ ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); }
+ private:
+ PrerenderManager::PrerenderManagerMode prev_mode_;
+};
+
+} // namespace
+
+class PrerenderTest : public testing::Test {
+ public:
+ static const int kDefaultChildId = -1;
+ static const int kDefaultRenderViewRouteId = -1;
+
+ PrerenderTest() : ui_thread_(BrowserThread::UI, &message_loop_),
+ prerender_manager_(
+ new TestPrerenderManager(prerender_tracker())),
+ prerender_link_manager_(
+ new PrerenderLinkManager(prerender_manager_.get())),
+ last_prerender_id_(0) {
+ // Enable omnibox prerendering.
+ CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+ switches::kPrerenderFromOmnibox,
+ switches::kPrerenderFromOmniboxSwitchValueEnabled);
+ }
+
+ TestPrerenderManager* prerender_manager() {
+ return prerender_manager_.get();
+ }
+
+ PrerenderLinkManager* prerender_link_manager() {
+ return prerender_link_manager_.get();
+ }
+
+ bool IsEmptyPrerenderLinkManager() {
+ return prerender_link_manager_->IsEmpty();
+ }
+
+ int last_prerender_id() const {
+ return last_prerender_id_;
+ }
+
+ int GetNextPrerenderID() {
+ return ++last_prerender_id_;
+ }
+
+ // Shorthand to add a simple preload with a reasonable source.
+ bool AddSimplePrerender(const GURL& url) {
+ return prerender_link_manager()->OnAddPrerender(
+ kDefaultChildId, GetNextPrerenderID(),
+ url, content::Referrer(),
+ gfx::Size(), kDefaultRenderViewRouteId);
+ }
+
+ private:
+ PrerenderTracker* prerender_tracker() {
+ return g_browser_process->prerender_tracker();
+ }
+
+ // Needed to pass PrerenderManager's DCHECKs.
+ MessageLoop message_loop_;
+ content::TestBrowserThread ui_thread_;
+ scoped_ptr<TestPrerenderManager> prerender_manager_;
+ scoped_ptr<PrerenderLinkManager> prerender_link_manager_;
+ int last_prerender_id_;
+};
+
+TEST_F(PrerenderTest, EmptyTest) {
+ EXPECT_FALSE(prerender_manager()->MaybeUsePrerenderedPage(
+ NULL,
+ GURL("http://www.google.com/")));
+}
+
+TEST_F(PrerenderTest, FoundTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
+}
+
+// Make sure that if queue a request, and a second prerender request for the
+// same URL comes in, that we drop the second request and keep the first one.
+TEST_F(PrerenderTest, DropSecondRequestTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_USED);
+ DummyPrerenderContents* null = NULL;
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents->has_started());
+
+ DummyPrerenderContents* prerender_contents1 =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_MANAGER_SHUTDOWN);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_EQ(prerender_contents1,
+ prerender_manager()->next_prerender_contents());
+ EXPECT_FALSE(prerender_contents1->has_started());
+
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
+}
+
+// Ensure that we expire a prerendered page after the max. permitted time.
+TEST_F(PrerenderTest, ExpireTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_TIMED_OUT);
+ DummyPrerenderContents* null = NULL;
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents->has_started());
+ prerender_manager()->AdvanceTime(prerender_manager()->GetMaxAge() +
+ base::TimeDelta::FromSeconds(1));
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+}
+
+// LRU Test. Make sure that if we prerender more than one request, that
+// the oldest one will be dropped.
+TEST_F(PrerenderTest, DropOldestRequestTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_EVICTED);
+ DummyPrerenderContents* null = NULL;
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents->has_started());
+
+ GURL url1("http://news.google.com/");
+ DummyPrerenderContents* prerender_contents1 =
+ prerender_manager()->CreateNextPrerenderContents(
+ url1,
+ FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url1));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents1->has_started());
+
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+ ASSERT_EQ(prerender_contents1, prerender_manager()->GetEntry(url1));
+}
+
+// Two element prerender test. Ensure that the LRU operates correctly if we
+// permit 2 elements to be kept prerendered.
+TEST_F(PrerenderTest, TwoElementPrerenderTest) {
+ prerender_manager()->mutable_config().max_elements = 2;
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_EVICTED);
+ DummyPrerenderContents* null = NULL;
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents->has_started());
+
+ GURL url1("http://news.google.com/");
+ DummyPrerenderContents* prerender_contents1 =
+ prerender_manager()->CreateNextPrerenderContents(
+ url1,
+ FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url1));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents1->has_started());
+
+ GURL url2("http://images.google.com/");
+ DummyPrerenderContents* prerender_contents2 =
+ prerender_manager()->CreateNextPrerenderContents(
+ url2,
+ FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url2));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents2->has_started());
+
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+ ASSERT_EQ(prerender_contents1, prerender_manager()->GetEntry(url1));
+ ASSERT_EQ(prerender_contents2, prerender_manager()->GetEntry(url2));
+}
+
+TEST_F(PrerenderTest, AliasURLTest) {
+ GURL url("http://www.google.com/");
+ GURL alias_url1("http://www.google.com/index.html");
+ GURL alias_url2("http://google.com/");
+ GURL not_an_alias_url("http://google.com/index.html");
+ std::vector<GURL> alias_urls;
+ alias_urls.push_back(alias_url1);
+ alias_urls.push_back(alias_url2);
+
+ // Test that all of the aliases work, but not_an_alias_url does not.
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, alias_urls, FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ ASSERT_EQ(NULL, prerender_manager()->GetEntry(not_an_alias_url));
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(alias_url1));
+ prerender_contents = prerender_manager()->CreateNextPrerenderContents(
+ url, alias_urls, FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(alias_url2));
+ prerender_contents = prerender_manager()->CreateNextPrerenderContents(
+ url, alias_urls, FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
+
+ // Test that alias URLs can not be added.
+ prerender_contents = prerender_manager()->CreateNextPrerenderContents(
+ url, alias_urls, FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(AddSimplePrerender(alias_url1));
+ EXPECT_TRUE(AddSimplePrerender(alias_url2));
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
+}
+
+// Ensure that we ignore prerender requests within the rate limit.
+TEST_F(PrerenderTest, RateLimitInWindowTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_MANAGER_SHUTDOWN);
+ DummyPrerenderContents* null = NULL;
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents->has_started());
+
+ prerender_manager()->set_rate_limit_enabled(true);
+ prerender_manager()->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(1));
+
+ GURL url1("http://news.google.com/");
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_MANAGER_SHUTDOWN);
+ EXPECT_FALSE(AddSimplePrerender(url1));
+ prerender_manager()->set_rate_limit_enabled(false);
+}
+
+// Ensure that we don't ignore prerender requests outside the rate limit.
+TEST_F(PrerenderTest, RateLimitOutsideWindowTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_EVICTED);
+ DummyPrerenderContents* null = NULL;
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(prerender_contents->has_started());
+
+ prerender_manager()->set_rate_limit_enabled(true);
+ prerender_manager()->AdvanceTimeTicks(
+ base::TimeDelta::FromMilliseconds(2000));
+
+ GURL url1("http://news.google.com/");
+ DummyPrerenderContents* rate_limit_prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url1,
+ FINAL_STATUS_MANAGER_SHUTDOWN);
+ EXPECT_TRUE(AddSimplePrerender(url1));
+ EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
+ EXPECT_TRUE(rate_limit_prerender_contents->has_started());
+ prerender_manager()->set_rate_limit_enabled(false);
+}
+
+TEST_F(PrerenderTest, PendingPrerenderTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ int child_id;
+ int route_id;
+ ASSERT_TRUE(prerender_contents->GetChildId(&child_id));
+ ASSERT_TRUE(prerender_contents->GetRouteId(&route_id));
+
+ GURL pending_url("http://news.google.com/");
+
+ EXPECT_TRUE(prerender_manager()->AddPrerenderFromLinkRelPrerender(
+ child_id, route_id,
+ pending_url, content::Referrer(url, WebKit::WebReferrerPolicyDefault),
+ gfx::Size()));
+
+ EXPECT_TRUE(prerender_manager()->IsPendingEntry(pending_url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
+}
+
+// Tests that a PrerenderManager created for a browser session in the control
+// group works as expected.
+TEST_F(PrerenderTest, ControlGroup) {
+ RestorePrerenderMode restore_prerender_mode;
+ PrerenderManager::SetMode(
+ PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP);
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_MANAGER_SHUTDOWN);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_FALSE(prerender_contents->has_started());
+}
+
+// Tests that prerendering is cancelled when the source render view does not
+// exist. On failure, the DCHECK in CreatePrerenderContents() above should be
+// triggered.
+TEST_F(PrerenderTest, SourceRenderViewClosed) {
+ GURL url("http://www.google.com/");
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_MANAGER_SHUTDOWN);
+ EXPECT_FALSE(prerender_link_manager()->OnAddPrerender(
+ 100, GetNextPrerenderID(), url,
+ content::Referrer(), gfx::Size(), 200));
+}
+
+// Tests that the prerender manager ignores fragment references when matching
+// prerender URLs in the case the fragment is not in the prerender URL.
+TEST_F(PrerenderTest, PageMatchesFragmentTest) {
+ GURL url("http://www.google.com/");
+ GURL fragment_url("http://www.google.com/#test");
+
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(url,
+ FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(fragment_url));
+}
+
+// Tests that the prerender manager ignores fragment references when matching
+// prerender URLs in the case the fragment is in the prerender URL.
+// TODO(gavinp): Re-enable this in the Prerender API once we're officially
+// fragment clean.
+TEST_F(PrerenderTest, DISABLED_FragmentMatchesPageTest) {
+ GURL url("http://www.google.com/");
+ GURL fragment_url("http://www.google.com/#test");
+
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(fragment_url,
+ FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(fragment_url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
+}
+
+// Tests that the prerender manager ignores fragment references when matching
+// prerender URLs in the case the fragment is in both URLs.
+// TODO(gavinp): Re-enable this in the Prerender API once we're officially
+// fragment clean.
+TEST_F(PrerenderTest, DISABLED_FragmentMatchesFragmentTest) {
+ GURL fragment_url("http://www.google.com/#test");
+ GURL other_fragment_url("http://www.google.com/#other_test");
+
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(fragment_url,
+ FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(fragment_url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ ASSERT_EQ(prerender_contents,
+ prerender_manager()->GetEntry(other_fragment_url));
+}
+
+// Make sure that clearing works as expected.
+TEST_F(PrerenderTest, ClearTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url,
+ FINAL_STATUS_CACHE_OR_HISTORY_CLEARED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ prerender_manager()->ClearData(PrerenderManager::CLEAR_PRERENDER_CONTENTS);
+ DummyPrerenderContents* null = NULL;
+ EXPECT_EQ(null, prerender_manager()->FindEntry(url));
+}
+
+// Make sure canceling works as expected.
+TEST_F(PrerenderTest, CancelAllTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_CANCELLED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ prerender_manager()->CancelAllPrerenders();
+ const DummyPrerenderContents* null = NULL;
+ EXPECT_EQ(null, prerender_manager()->FindEntry(url));
+}
+
+// Make sure canceling for omnibox works as expected.
+TEST_F(PrerenderTest, CancelOmniboxRemovesOmniboxTest) {
+ // Check canceling removes the Omnibox url.
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, ORIGIN_OMNIBOX, FINAL_STATUS_CANCELLED);
+ EXPECT_TRUE(prerender_manager()->AddPrerenderFromOmnibox(url, NULL));
+ EXPECT_TRUE(prerender_contents->has_started());
+ prerender_manager()->CancelOmniboxPrerenders();
+ const DummyPrerenderContents* null = NULL;
+ EXPECT_EQ(null, prerender_manager()->FindEntry(url));
+}
+
+TEST_F(PrerenderTest, CancelOmniboxDoesNotRemoveLinkTest) {
+ GURL url("http://www.google.com/");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, ORIGIN_LINK_REL_PRERENDER, FINAL_STATUS_MANAGER_SHUTDOWN);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ prerender_manager()->CancelOmniboxPrerenders();
+ const DummyPrerenderContents* null = NULL;
+ EXPECT_NE(null, prerender_manager()->FindEntry(url));
+}
+
+TEST_F(PrerenderTest, OmniboxNotAllowedWhenDisabled) {
+ prerender_manager()->set_enabled(false);
+ EXPECT_FALSE(prerender_manager()->AddPrerenderFromOmnibox(
+ GURL("http://www.example.com"), NULL));
+}
+
+TEST_F(PrerenderTest, LinkRelNotAllowedWhenDisabled) {
+ prerender_manager()->set_enabled(false);
+ EXPECT_FALSE(AddSimplePrerender(
+ GURL("http://www.example.com")));
+}
+
+TEST_F(PrerenderTest, LinkManagerCancel) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_CANCELLED);
+
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ EXPECT_FALSE(IsEmptyPrerenderLinkManager());
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ last_prerender_id());
+
+ EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
+ DummyPrerenderContents* null = NULL;
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+}
+
+TEST_F(PrerenderTest, LinkManagerCancelThenAbandon) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_CANCELLED);
+
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ EXPECT_FALSE(IsEmptyPrerenderLinkManager());
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ last_prerender_id());
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
+ prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
+ last_prerender_id());
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
+ DummyPrerenderContents* null = NULL;
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+}
+
+// TODO(gavinp): Update this test after abandon has an effect on Prerenders,
+// like shortening the timeouts.
+TEST_F(PrerenderTest, LinkManagerAbandon) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_USED);
+
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ EXPECT_FALSE(IsEmptyPrerenderLinkManager());
+ prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
+ last_prerender_id());
+
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+}
+
+TEST_F(PrerenderTest, LinkManagerCancelTwice) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_CANCELLED);
+
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ last_prerender_id());
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
+ DummyPrerenderContents* null = NULL;
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ last_prerender_id());
+}
+
+TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwice) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_CANCELLED);
+
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ const int first_prerender_id = last_prerender_id();
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ const int second_prerender_id = last_prerender_id();
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ first_prerender_id);
+
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ second_prerender_id);
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
+ DummyPrerenderContents* null = NULL;
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+}
+
+TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwiceThenAbandonTwice) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_CANCELLED);
+
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ const int first_prerender_id = last_prerender_id();
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ const int second_prerender_id = last_prerender_id();
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ first_prerender_id);
+
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ second_prerender_id);
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
+ prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
+ first_prerender_id);
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
+ prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
+ second_prerender_id);
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
+ DummyPrerenderContents* null = NULL;
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+}
+
+// TODO(gavinp): Update this test after abandon has an effect on Prerenders,
+// like shortening the timeouts.
+TEST_F(PrerenderTest, LinkManagerAddTwiceAbandonTwice) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_USED);
+
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ const int first_prerender_id = last_prerender_id();
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ const int second_prerender_id = last_prerender_id();
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
+ first_prerender_id);
+
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
+ second_prerender_id);
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
+}
+
+// TODO(gavinp): After abandon shortens the expire time on a Prerender,
+// add a series of tests testing advancing the time by either the abandon
+// or normal expire, and verifying the expected behaviour with groups
+// of links.
+TEST_F(PrerenderTest, LinkManagerExpireThenCancel) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_TIMED_OUT);
+
+ EXPECT_TRUE(AddSimplePrerender(url));
+
+ EXPECT_TRUE(prerender_contents->has_started());
+ EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_manager()->AdvanceTime(prerender_manager()->GetMaxAge() +
+ base::TimeDelta::FromSeconds(1));
+
+ EXPECT_FALSE(IsEmptyPrerenderLinkManager());
+ DummyPrerenderContents* null = NULL;
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ last_prerender_id());
+
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+}
+
+TEST_F(PrerenderTest, LinkManagerExpireThenAddAgain) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* first_prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_TIMED_OUT);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(first_prerender_contents->has_started());
+ EXPECT_FALSE(first_prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(first_prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_manager()->AdvanceTime(prerender_manager()->GetMaxAge() +
+ base::TimeDelta::FromSeconds(1));
+ DummyPrerenderContents* null = NULL;
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+ DummyPrerenderContents* second_prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(second_prerender_contents->has_started());
+ ASSERT_EQ(second_prerender_contents, prerender_manager()->GetEntry(url));
+ // The PrerenderLinkManager is not empty since we never removed the first
+ // prerender.
+ EXPECT_FALSE(IsEmptyPrerenderLinkManager());
+}
+
+TEST_F(PrerenderTest, LinkManagerCancelThenAddAgain) {
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ GURL url("http://www.myexample.com");
+ DummyPrerenderContents* first_prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_CANCELLED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(first_prerender_contents->has_started());
+ EXPECT_FALSE(first_prerender_contents->prerendering_has_been_cancelled());
+ ASSERT_EQ(first_prerender_contents, prerender_manager()->FindEntry(url));
+ prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
+ last_prerender_id());
+ EXPECT_TRUE(IsEmptyPrerenderLinkManager());
+ EXPECT_TRUE(first_prerender_contents->prerendering_has_been_cancelled());
+ DummyPrerenderContents* null = NULL;
+ ASSERT_EQ(null, prerender_manager()->GetEntry(url));
+ DummyPrerenderContents* second_prerender_contents =
+ prerender_manager()->CreateNextPrerenderContents(
+ url, FINAL_STATUS_USED);
+ EXPECT_TRUE(AddSimplePrerender(url));
+ EXPECT_TRUE(second_prerender_contents->has_started());
+ ASSERT_EQ(second_prerender_contents, prerender_manager()->GetEntry(url));
+ EXPECT_FALSE(IsEmptyPrerenderLinkManager());
+}
+
+} // namespace prerender
+

Powered by Google App Engine
This is Rietveld 408576698