15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map>
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <utility>
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/format_macros.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/metrics/field_trial.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/net/prediction_options.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_origin.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/prerender_types.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeTicks;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UnitTestPrerenderManager;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyPrerenderContents : public PrerenderContents {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents(UnitTestPrerenderManager* test_prerender_manager,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         PrerenderTracker* prerender_tracker,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GURL& url,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         Origin origin,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         FinalStatus expected_final_status);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~DummyPrerenderContents();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartPrerendering(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int ALLOW_UNUSED creator_child_id,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& ALLOW_UNUSED size,
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::SessionStorageNamespace* ALLOW_UNUSED session_storage_namespace,
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      net::URLRequestContextGetter* ALLOW_UNUSED request_context)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetChildId(int* child_id) const OVERRIDE {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Having a default child_id of -1 forces pending prerenders not to fail
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // on session storage and cross domain checking.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *child_id = -1;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetRouteId(int* route_id) const OVERRIDE {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *route_id = route_id_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinalStatus expected_final_status() const { return expected_final_status_; }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool prerendering_has_been_cancelled() const {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PrerenderContents::prerendering_has_been_cancelled();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static int g_next_route_id_;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int route_id_;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnitTestPrerenderManager* test_prerender_manager_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinalStatus expected_final_status_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DummyPrerenderContents::g_next_route_id_ = 0;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Size kSize(640, 480);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint32 kDefaultRelTypes = PrerenderRelTypePrerender;
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UnitTestPrerenderManager : public PrerenderManager {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using PrerenderManager::kMinTimeBetweenPrerendersMs;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using PrerenderManager::kNavigationRecordWindowMs;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit UnitTestPrerenderManager(Profile* profile,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    PrerenderTracker* prerender_tracker)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : PrerenderManager(profile, prerender_tracker),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        time_(Time::Now()),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        time_ticks_(TimeTicks::Now()),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prerender_tracker_(prerender_tracker) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_rate_limit_enabled(false);
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    OnCookieStoreLoaded();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UnitTestPrerenderManager() {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // From KeyedService, via PrererenderManager:
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Shutdown() OVERRIDE {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (next_prerender_contents())
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      next_prerender_contents_->Destroy(FINAL_STATUS_MANAGER_SHUTDOWN);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrerenderManager::Shutdown();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // From PrerenderManager:
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void MoveEntryToPendingDelete(PrerenderContents* entry,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        FinalStatus final_status) OVERRIDE {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (entry == next_prerender_contents_.get())
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrerenderManager::MoveEntryToPendingDelete(entry, final_status);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderContents* FindEntry(const GURL& url) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteOldEntries();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    to_delete_prerenders_.clear();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (PrerenderData* data = FindPrerenderData(url, NULL))
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return data->contents();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderContents* FindAndUseEntry(const GURL& url) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrerenderData* prerender_data = FindPrerenderData(url, NULL);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!prerender_data)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<PrerenderData>::iterator to_erase =
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FindIteratorForPrerenderContents(prerender_data->contents());
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(to_erase != active_prerenders_.end());
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrerenderContents* prerender_contents = prerender_data->ReleaseContents();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    active_prerenders_.erase(to_erase);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_contents->PrepareForUse();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prerender_contents;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AdvanceTime(TimeDelta delta) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    time_ += delta;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AdvanceTimeTicks(TimeDelta delta) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    time_ticks_ += delta;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* CreateNextPrerenderContents(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FinalStatus expected_final_status) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyPrerenderContents* prerender_contents =
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyPrerenderContents(this, prerender_tracker_, url,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   expected_final_status);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetNextPrerenderContents(prerender_contents);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prerender_contents;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* CreateNextPrerenderContents(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Origin origin,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FinalStatus expected_final_status) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyPrerenderContents* prerender_contents =
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyPrerenderContents(this, prerender_tracker_, url,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   origin, expected_final_status);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetNextPrerenderContents(prerender_contents);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prerender_contents;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* CreateNextPrerenderContents(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<GURL>& alias_urls,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FinalStatus expected_final_status) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyPrerenderContents* prerender_contents =
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyPrerenderContents(this, prerender_tracker_, url,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   expected_final_status);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<GURL>::const_iterator it = alias_urls.begin();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != alias_urls.end();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++it) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(prerender_contents->AddAliasURL(*it));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetNextPrerenderContents(prerender_contents);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prerender_contents;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_rate_limit_enabled(bool enabled) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mutable_config().rate_limit_enabled = enabled;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderContents* next_prerender_contents() {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return next_prerender_contents_.get();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from PrerenderManager
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Time GetCurrentTime() const OVERRIDE {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return time_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual TimeTicks GetCurrentTimeTicks() const OVERRIDE {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return time_ticks_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual PrerenderContents* GetPrerenderContentsForRoute(
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      int child_id, int route_id) const OVERRIDE {
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Overridden for the PrerenderLinkManager's pending prerender logic.
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrerenderContentsMap::const_iterator iter = prerender_contents_map_.find(
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        std::make_pair(child_id, route_id));
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (iter == prerender_contents_map_.end())
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return NULL;
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return iter->second;
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DummyPrerenderContentsStarted(int child_id,
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     int route_id,
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     PrerenderContents* prerender_contents) {
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prerender_contents_map_[std::make_pair(child_id, route_id)] =
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        prerender_contents;
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DummyPrerenderContentsDestroyed(int child_id,
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       int route_id) {
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prerender_contents_map_.erase(std::make_pair(child_id, route_id));
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual net::URLRequestContextGetter* GetURLRequestContext() OVERRIDE {
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return NULL;
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetNextPrerenderContents(DummyPrerenderContents* prerender_contents) {
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(!next_prerender_contents_.get());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_prerender_contents_.reset(prerender_contents);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prerender_contents->expected_final_status() == FINAL_STATUS_USED)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      used_prerender_contents_.push_back(prerender_contents);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PrerenderContents* CreatePrerenderContents(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Referrer& referrer,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Origin origin,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint8 experiment_id) OVERRIDE {
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(next_prerender_contents_.get());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(url, next_prerender_contents_->prerender_url());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(origin, next_prerender_contents_->origin());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return next_prerender_contents_.release();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Maintain a map from route pairs to PrerenderContents for
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // GetPrerenderContentsForRoute.
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::map<std::pair<int,int>, PrerenderContents*> PrerenderContentsMap;
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrerenderContentsMap prerender_contents_map_;
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time time_;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks time_ticks_;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PrerenderContents> next_prerender_contents_;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tracked so they will be automatically deleted.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<PrerenderContents> used_prerender_contents_;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderTracker* prerender_tracker_;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestorePrerenderMode {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderManager::PrerenderManagerMode prev_mode_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DummyPrerenderContents::DummyPrerenderContents(
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnitTestPrerenderManager* test_prerender_manager,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrerenderTracker* prerender_tracker,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Origin origin,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinalStatus expected_final_status)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : PrerenderContents(test_prerender_manager,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        NULL, url, Referrer(), origin,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        PrerenderManager::kNoExperiment),
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      route_id_(g_next_route_id_++),
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_prerender_manager_(test_prerender_manager),
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_final_status_(expected_final_status) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DummyPrerenderContents::~DummyPrerenderContents() {
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected_final_status_, final_status());
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_prerender_manager_->DummyPrerenderContentsDestroyed(-1, route_id_);
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DummyPrerenderContents::StartPrerendering(
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ALLOW_UNUSED creator_child_id,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Size& ALLOW_UNUSED size,
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::SessionStorageNamespace* ALLOW_UNUSED session_storage_namespace,
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    net::URLRequestContextGetter* ALLOW_UNUSED request_context) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the base PrerenderContents implementation, StartPrerendering will
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be called even when the PrerenderManager is part of the control group,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but it will early exit before actually creating a new RenderView if
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |is_control_group| is true;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_start_time_ = test_prerender_manager_->GetCurrentTimeTicks();
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!test_prerender_manager_->IsControlGroup(experiment_id())) {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerendering_has_started_ = true;
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_prerender_manager_->DummyPrerenderContentsStarted(-1, route_id_, this);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotifyPrerenderStart();
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderTest : public testing::Test {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDefaultChildId = -1;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDefaultRenderViewRouteId = -1;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderTest() : ui_thread_(BrowserThread::UI, &message_loop_),
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    prerender_manager_(new UnitTestPrerenderManager(
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        &profile_, prerender_tracker())),
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    prerender_link_manager_(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        new PrerenderLinkManager(prerender_manager_.get())),
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    last_prerender_id_(0),
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    field_trial_list_(NULL) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Enable omnibox prerendering.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitchASCII(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kPrerenderFromOmnibox,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kPrerenderFromOmniboxSwitchValueEnabled);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PrerenderTest() {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender_link_manager_->OnChannelClosing(kDefaultChildId);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_link_manager_->Shutdown();
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_manager_->Shutdown();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnitTestPrerenderManager* prerender_manager() {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prerender_manager_.get();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderLinkManager* prerender_link_manager() {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prerender_link_manager_.get();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetConcurrency(size_t concurrency) {
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_manager()->mutable_config().max_link_concurrency_per_launcher =
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        concurrency;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_manager()->mutable_config().max_link_concurrency =
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::max(prerender_manager()->mutable_config().max_link_concurrency,
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 concurrency);
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsEmptyPrerenderLinkManager() const {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prerender_link_manager_->IsEmpty();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int last_prerender_id() const {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_prerender_id_;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetNextPrerenderID() {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ++last_prerender_id_;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool LauncherHasRunningPrerender(int child_id, int prerender_id) {
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrerenderLinkManager::LinkPrerender* prerender =
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prerender_link_manager()->FindByLauncherChildIdAndPrerenderId(
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            child_id, prerender_id);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return prerender && prerender->handle;
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool LauncherHasScheduledPrerender(int child_id, int prerender_id) {
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrerenderLinkManager::LinkPrerender* prerender =
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        prerender_link_manager()->FindByLauncherChildIdAndPrerenderId(
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            child_id, prerender_id);
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return prerender != NULL;
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shorthand to add a simple prerender with a reasonable source. Returns
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // true iff the prerender has been added to the PrerenderManager by the
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PrerenderLinkManager and the PrerenderManager returned a handle.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddSimplePrerender(const GURL& url) {
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prerender_link_manager()->OnAddPrerender(
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        kDefaultChildId, GetNextPrerenderID(), url, kDefaultRelTypes,
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        content::Referrer(), kSize, kDefaultRenderViewRouteId);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void DisablePrerender() {
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profile_.GetPrefs()->SetInteger(
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        prefs::kNetworkPredictionOptions,
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        chrome_browser_net::NETWORK_PREDICTION_NEVER);
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderTracker* prerender_tracker() {
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return g_browser_process->prerender_tracker();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed to pass PrerenderManager's DCHECKs.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile_;
41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop_;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UnitTestPrerenderManager> prerender_manager_;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PrerenderLinkManager> prerender_link_manager_;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int last_prerender_id_;
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FieldTrialList field_trial_list_;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, FoundTest) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_USED);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that if queue a request, and a second prerender request for the
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// same URL comes in, that the second request attaches to the first prerender,
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and we don't use the second prerender contents.
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, DuplicateTest) {
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(2);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_USED);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents1 =
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_MANAGER_SHUTDOWN);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(prerender_contents1,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->next_prerender_contents());
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents1->prerendering_has_started());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensure that we expire a prerendered page after the max. permitted time.
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, ExpireTest) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_TIMED_OUT);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->config().time_to_live + TimeDelta::FromSeconds(1));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensure that we don't launch prerenders of bad urls (in this case, a mailto:
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// url)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, BadURLTest) {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("mailto:test@gmail.com");
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* prerender_contents =
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          url,
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FINAL_STATUS_UNSUPPORTED_SCHEME);
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(AddSimplePrerender(url));
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_started());
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* null = NULL;
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(url));
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the user navigates away from a page, the prerenders it launched should
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have their time to expiry shortened from the default time to live.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerNavigateAwayExpire) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TimeDelta time_to_live = TimeDelta::FromSeconds(300);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TimeDelta abandon_time_to_live = TimeDelta::FromSeconds(20);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TimeDelta test_advance = TimeDelta::FromSeconds(22);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(test_advance, time_to_live);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(abandon_time_to_live, test_advance);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->mutable_config().time_to_live = time_to_live;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->mutable_config().abandon_time_to_live =
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      abandon_time_to_live;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://example.com");
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(url,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       FINAL_STATUS_TIMED_OUT);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               last_prerender_id());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(test_advance);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(url));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// But when we navigate away very close to the original expiry of a prerender,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we shouldn't expect it to be extended.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerNavigateAwayNearExpiry) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TimeDelta time_to_live = TimeDelta::FromSeconds(300);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TimeDelta abandon_time_to_live = TimeDelta::FromSeconds(20);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We will expect the prerender to still be alive after advancing the clock
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by first_advance. But, after second_advance, we expect it to have timed
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // out, demonstrating that you can't extend a prerender by navigating away
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from its launcher.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TimeDelta first_advance = TimeDelta::FromSeconds(298);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TimeDelta second_advance = TimeDelta::FromSeconds(4);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(first_advance, time_to_live);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(time_to_live - first_advance, abandon_time_to_live);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(time_to_live, first_advance + second_advance);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->mutable_config().time_to_live = time_to_live;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->mutable_config().abandon_time_to_live =
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      abandon_time_to_live;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://example2.com");
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(url,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       FINAL_STATUS_TIMED_OUT);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(first_advance);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               last_prerender_id());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(second_advance);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(url));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// When the user navigates away from a page, and then launches a new prerender,
5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// the new prerender should preempt the abandoned prerender even if the
5651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// abandoned prerender hasn't expired.
5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerNavigateAwayLaunchAnother) {
5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const TimeDelta time_to_live = TimeDelta::FromSeconds(300);
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const TimeDelta abandon_time_to_live = TimeDelta::FromSeconds(20);
5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const TimeDelta test_advance = TimeDelta::FromSeconds(5);
5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_LT(test_advance, time_to_live);
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_GT(abandon_time_to_live, test_advance);
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prerender_manager()->mutable_config().time_to_live = time_to_live;
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prerender_manager()->mutable_config().abandon_time_to_live =
5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      abandon_time_to_live;
5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GURL url("http://example.com");
5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prerender_manager()->CreateNextPrerenderContents(url, FINAL_STATUS_CANCELLED);
5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                               last_prerender_id());
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(test_advance);
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GURL second_url("http://example2.com");
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DummyPrerenderContents* second_prerender_contents =
5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          second_url, FINAL_STATUS_MANAGER_SHUTDOWN);
5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(second_url));
5901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(second_prerender_contents,
5911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            prerender_manager()->FindEntry(second_url));
5921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that if we prerender more requests than we support, that we launch
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// them in the order given up until we reach MaxConcurrency, at which point we
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// queue them and launch them in the order given. As well, insure that limits
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// are enforced for the system as a whole and on a per launcher basis.
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, MaxConcurrencyTest) {
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct TestConcurrency {
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t max_link_concurrency;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t max_link_concurrency_per_launcher;
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestConcurrency concurrencies_to_test[] = {
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { prerender_manager()->config().max_link_concurrency,
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->config().max_link_concurrency_per_launcher},
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // With the system limit higher than the per launcher limit, the per
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // launcher limit should be in effect.
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { 2, 1 },
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // With the per launcher limit higher than system limit, the system limit
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // should be in effect.
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { 2, 4 },
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url_to_delay("http://www.google.com/delayme");
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(concurrencies_to_test); ++i) {
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_manager()->mutable_config().max_link_concurrency =
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        concurrencies_to_test[i].max_link_concurrency;
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_manager()->mutable_config().max_link_concurrency_per_launcher =
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        concurrencies_to_test[i].max_link_concurrency_per_launcher;
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const size_t effective_max_link_concurrency =
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::min(concurrencies_to_test[i].max_link_concurrency,
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 concurrencies_to_test[i].max_link_concurrency_per_launcher);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<GURL> urls;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<PrerenderContents*> prerender_contentses;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Launch prerenders up to the maximum this launcher can support.
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t j = 0; j < effective_max_link_concurrency; ++j) {
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      urls.push_back(
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GURL(base::StringPrintf("http://google.com/use#%" PRIuS, j)));
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_contentses.push_back(
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prerender_manager()->CreateNextPrerenderContents(urls.back(),
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           FINAL_STATUS_USED));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(AddSimplePrerender(urls.back()));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(prerender_contentses.back()->prerendering_has_started());
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (concurrencies_to_test[i].max_link_concurrency >
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            effective_max_link_concurrency) {
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // We should be able to launch more prerenders on this system, but not for
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // the default launcher.
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL extra_url("http://google.com/extraurl");
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(AddSimplePrerender(extra_url));
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const int prerender_id = last_prerender_id();
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_TRUE(LauncherHasScheduledPrerender(kDefaultChildId,
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                prerender_id));
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  prerender_id);
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(LauncherHasScheduledPrerender(kDefaultChildId,
6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 prerender_id));
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DummyPrerenderContents* prerender_contents_to_delay =
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prerender_manager()->CreateNextPrerenderContents(url_to_delay,
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         FINAL_STATUS_USED);
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(AddSimplePrerender(url_to_delay));
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(prerender_contents_to_delay->prerendering_has_started());
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(null, prerender_manager()->next_prerender_contents());
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(null, prerender_manager()->FindEntry(url_to_delay));
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t j = 0; j < effective_max_link_concurrency; ++j) {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(prerender_contentses[j],
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                prerender_manager()->FindAndUseEntry(urls[j]));
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(prerender_contents_to_delay->prerendering_has_started());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(prerender_contents_to_delay,
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              prerender_manager()->FindAndUseEntry(url_to_delay));
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, AliasURLTest) {
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(7);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL alias_url1("http://www.google.com/index.html");
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL alias_url2("http://google.com/");
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL not_an_alias_url("http://google.com/index.html");
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> alias_urls;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alias_urls.push_back(alias_url1);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alias_urls.push_back(alias_url2);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that all of the aliases work, but not_an_alias_url does not.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, alias_urls, FINAL_STATUS_USED);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(NULL, prerender_manager()->FindEntry(not_an_alias_url));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents,
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->FindAndUseEntry(alias_url1));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_contents = prerender_manager()->CreateNextPrerenderContents(
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, alias_urls, FINAL_STATUS_USED);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents,
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->FindAndUseEntry(alias_url2));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_contents = prerender_manager()->CreateNextPrerenderContents(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, alias_urls, FINAL_STATUS_USED);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that alias URLs can not be added.
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_contents = prerender_manager()->CreateNextPrerenderContents(
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, alias_urls, FINAL_STATUS_USED);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(alias_url1));
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(alias_url2));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, PendingPrerenderTest) {
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_USED);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int child_id;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int route_id;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prerender_contents->GetChildId(&child_id));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prerender_contents->GetRouteId(&route_id));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL pending_url("http://news.google.com/");
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Schedule a pending prerender launched from the prerender.
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* pending_prerender_contents =
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pending_url,
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ORIGIN_GWS_PRERENDER,
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_USED);
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_link_manager()->OnAddPrerender(
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes,
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Referrer(url, blink::WebReferrerPolicyDefault),
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kSize, route_id);
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id()));
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(pending_prerender_contents->prerendering_has_started());
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Use the referring prerender.
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The pending prerender should start now.
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(LauncherHasRunningPrerender(child_id, last_prerender_id()));
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(pending_prerender_contents->prerendering_has_started());
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pending_prerender_contents,
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->FindAndUseEntry(pending_url));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, InvalidPendingPrerenderTest) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_USED);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int child_id;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int route_id;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prerender_contents->GetChildId(&child_id));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prerender_contents->GetRouteId(&route_id));
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This pending URL has an unsupported scheme, and won't be able
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to start.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL pending_url("ftp://news.google.com/");
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Schedule a pending prerender launched from the prerender.
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DummyPrerenderContents* pending_prerender_contents =
7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          pending_url,
7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ORIGIN_GWS_PRERENDER,
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          FINAL_STATUS_UNSUPPORTED_SCHEME);
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_link_manager()->OnAddPrerender(
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes,
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Referrer(url, blink::WebReferrerPolicyDefault),
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kSize, route_id);
7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id()));
7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(pending_prerender_contents->prerendering_has_started());
7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Use the referring prerender.
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The pending prerender still doesn't start.
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id()));
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(pending_prerender_contents->prerendering_has_started());
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, CancelPendingPrerenderTest) {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_USED);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int child_id;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int route_id;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prerender_contents->GetChildId(&child_id));
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prerender_contents->GetRouteId(&route_id));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL pending_url("http://news.google.com/");
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Schedule a pending prerender launched from the prerender.
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_link_manager()->OnAddPrerender(
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes,
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Referrer(url, blink::WebReferrerPolicyDefault),
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kSize, route_id);
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id()));
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Cancel the pending prerender.
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(child_id, last_prerender_id());
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Use the referring prerender.
8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The pending prerender doesn't start.
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id()));
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a PrerenderManager created for a browser session in the control
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// group works as expected.
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, ControlGroup) {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RestorePrerenderMode restore_prerender_mode;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderManager::SetMode(
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_MANAGER_SHUTDOWN);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_started());
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that prerendering is cancelled when the source render view does not
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exist.  On failure, the DCHECK in CreatePrerenderContents() above should be
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// triggered.
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, SourceRenderViewClosed) {
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->CreateNextPrerenderContents(
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url,
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FINAL_STATUS_MANAGER_SHUTDOWN);
8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_link_manager()->OnAddPrerender(
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      100, GetNextPrerenderID(), url, kDefaultRelTypes, Referrer(), kSize, 200);
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(LauncherHasRunningPrerender(100, last_prerender_id()));
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests that prerendering doesn't launch rel=next prerenders without the field
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// trial.
8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PrerenderTest, NoRelNextByDefault) {
8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url("http://www.google.com/");
8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_manager()->CreateNextPrerenderContents(
8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      url, FINAL_STATUS_MANAGER_SHUTDOWN);
8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_link_manager()->OnAddPrerender(
8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext,
8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Referrer(), kSize, kDefaultRenderViewRouteId);
8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(url));
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests that prerendering does launch rel=next prerenders with the field trial.
8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PrerenderTest, RelNextByFieldTrial) {
8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("PrerenderRelNextTrial",
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                     "Yes"));
8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url("http://www.google.com/");
8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          url, ORIGIN_LINK_REL_NEXT, FINAL_STATUS_USED);
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_link_manager()->OnAddPrerender(
8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext,
8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Referrer(), kSize, kDefaultRenderViewRouteId);
8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that prerendering is cancelled when we launch a second prerender of
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same target within a short time interval.
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, RecentlyVisited) {
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->RecordNavigation(url);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_RECENTLY_VISITED);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(AddSimplePrerender(url));
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_started());
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, NotSoRecentlyVisited) {
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->RecordNavigation(url);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TimeDelta::FromMilliseconds(
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UnitTestPrerenderManager::kNavigationRecordWindowMs + 500));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_USED);
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that our PPLT dummy prerender gets created properly.
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, PPLTDummy) {
9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RestorePrerenderMode restore_prerender_mode;
9201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrerenderManager::SetMode(
9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP);
9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_UNSUPPORTED_SCHEME);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* pplt_dummy_contents =
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(url,
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       FINAL_STATUS_USED);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL ftp_url("ftp://ftp.google.com/");
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding this ftp URL will force the expected unsupported scheme error.
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_contents->AddAliasURL(ftp_url);
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pplt_dummy_contents, prerender_manager()->FindAndUseEntry(url));
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that our PPLT dummy prerender gets created properly, even
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when navigating to a page that has been recently navigated to.
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, RecentlyVisitedPPLTDummy) {
9461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RestorePrerenderMode restore_prerender_mode;
9471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrerenderManager::SetMode(
9481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP);
9491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_UNSUPPORTED_SCHEME);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* pplt_dummy_contents =
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(url,
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       FINAL_STATUS_USED);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->RecordNavigation(url);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL ftp_url("ftp://ftp.google.com/");
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_contents->AddAliasURL(ftp_url);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pplt_dummy_contents, prerender_manager()->FindAndUseEntry(url));
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, PPLTLateCancel) {
9681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RestorePrerenderMode restore_prerender_mode;
9691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrerenderManager::SetMode(
9701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP);
9711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("http://www.google.com");
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* prerender_contents =
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          url, FINAL_STATUS_JAVASCRIPT_ALERT);
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force the creation of a match complete dummy.
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* duplicate_prerender_contents =
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(url,
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       FINAL_STATUS_CANCELLED);
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_contents->Destroy(FINAL_STATUS_JAVASCRIPT_ALERT);
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(duplicate_prerender_contents, prerender_manager()->FindEntry(url));
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure that events on prerender handles propogate to the match
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // complete replacement.
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* null = NULL;
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              last_prerender_id());
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the prerender manager matches include the fragment.
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, FragmentMatchesTest) {
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL fragment_url("http://www.google.com/#test");
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(fragment_url,
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       FINAL_STATUS_USED);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(fragment_url));
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents,
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->FindAndUseEntry(fragment_url));
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the prerender manager uses fragment references when matching
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerender URLs in the case a different fragment is in both URLs.
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, FragmentsDifferTest) {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL fragment_url("http://www.google.com/#test");
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL other_fragment_url("http://www.google.com/#other_test");
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(fragment_url,
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       FINAL_STATUS_USED);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(fragment_url));
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(other_fragment_url));
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents,
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->FindAndUseEntry(fragment_url));
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that clearing works as expected.
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, ClearTest) {
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FINAL_STATUS_CACHE_OR_HISTORY_CLEARED);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->ClearData(PrerenderManager::CLEAR_PRERENDER_CONTENTS);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(url));
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure canceling works as expected.
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, CancelAllTest) {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com/");
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_CANCELLED);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->CancelAllPrerenders();
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const DummyPrerenderContents* null = NULL;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(url));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, OmniboxNotAllowedWhenDisabled) {
10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisablePrerender();
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_manager()->AddPrerenderFromOmnibox(
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com"), NULL, gfx::Size()));
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkRelNotAllowedWhenDisabled) {
10601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisablePrerender();
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(AddSimplePrerender(
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com")));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerCancel) {
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_CANCELLED);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              last_prerender_id());
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerCancelThenAbandon) {
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_CANCELLED);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              last_prerender_id());
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               last_prerender_id());
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAbandon) {
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_USED);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               last_prerender_id());
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAbandonThenCancel) {
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("http://www.myexample.com");
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* prerender_contents =
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          url, FINAL_STATUS_CANCELLED);
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               last_prerender_id());
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              last_prerender_id());
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* null = NULL;
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerCancelTwice) {
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_CANCELLED);
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              last_prerender_id());
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              last_prerender_id());
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwice) {
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(2);
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_CANCELLED);
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int first_prerender_id = last_prerender_id();
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int second_prerender_id = last_prerender_id();
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              first_prerender_id);
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              second_prerender_id);
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAddTwiceCancelTwiceThenAbandonTwice) {
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(2);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_CANCELLED);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int first_prerender_id = last_prerender_id();
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int second_prerender_id = last_prerender_id();
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              first_prerender_id);
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              second_prerender_id);
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               first_prerender_id);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               second_prerender_id);
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_been_cancelled());
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(gavinp): Update this test after abandon has an effect on Prerenders,
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// like shortening the timeouts.
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAddTwiceAbandonTwiceUseTwice) {
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(2);
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_USED);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int first_prerender_id = last_prerender_id();
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int second_prerender_id = last_prerender_id();
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               first_prerender_id);
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               second_prerender_id);
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(gavinp): After abandon shortens the expire time on a Prerender,
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// add a series of tests testing advancing the time by either the abandon
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or normal expire, and verifying the expected behaviour with groups
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of links.
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerExpireThenCancel) {
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* prerender_contents =
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_TIMED_OUT);
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->config().time_to_live + TimeDelta::FromSeconds(1));
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              last_prerender_id());
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerExpireThenAddAgain) {
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* first_prerender_contents =
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_TIMED_OUT);
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(first_prerender_contents->prerendering_has_started());
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(first_prerender_contents->prerendering_has_been_cancelled());
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(first_prerender_contents,
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->FindEntry(url));
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->config().time_to_live + TimeDelta::FromSeconds(1));
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* second_prerender_contents =
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_USED);
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(second_prerender_contents->prerendering_has_started());
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(second_prerender_contents,
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->FindAndUseEntry(url));
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrerenderTest, LinkManagerCancelThenAddAgain) {
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.myexample.com");
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* first_prerender_contents =
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_CANCELLED);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(first_prerender_contents->prerendering_has_started());
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(first_prerender_contents->prerendering_has_been_cancelled());
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(first_prerender_contents, prerender_manager()->FindEntry(url));
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender_link_manager()->OnCancelPrerender(kDefaultChildId,
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              last_prerender_id());
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(first_prerender_contents->prerendering_has_been_cancelled());
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* null = NULL;
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(null, prerender_manager()->FindEntry(url));
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DummyPrerenderContents* second_prerender_contents =
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, FINAL_STATUS_USED);
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(second_prerender_contents->prerendering_has_started());
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(second_prerender_contents,
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prerender_manager()->FindAndUseEntry(url));
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerChannelClosing) {
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("http://www.myexample.com");
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* prerender_contents =
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          url, FINAL_STATUS_TIMED_OUT);
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(url));
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(prerender_contents->prerendering_has_been_cancelled());
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindEntry(url));
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_link_manager()->OnChannelClosing(kDefaultChildId);
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->config().abandon_time_to_live +
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TimeDelta::FromSeconds(1));
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* null = NULL;
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(url));
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates two prerenders, one of which should be blocked by the
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// max_link_concurrency; abandons both of them and waits to make sure both
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// are cleared from the PrerenderLinkManager.
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerAbandonInactivePrerender) {
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(1);
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_LT(prerender_manager()->config().abandon_time_to_live,
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            prerender_manager()->config().time_to_live);
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL first_url("http://www.myexample.com");
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* prerender_contents =
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          first_url, FINAL_STATUS_TIMED_OUT);
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(first_url));
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int first_prerender_id = last_prerender_id();
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL second_url("http://www.neverlaunched.com");
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(AddSimplePrerender(second_url));
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int second_prerender_id = last_prerender_id();
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* null = NULL;
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url));
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               first_prerender_id);
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               second_prerender_id);
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->config().abandon_time_to_live +
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TimeDelta::FromSeconds(1));
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(first_url));
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates two prerenders, the second one started by the first, both of which
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should be blocked by max_concurrency; abandons both of them and waits to make
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sure both are cleared from the PrerenderLinkManager.
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerClearOnPendingAbandon) {
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(1);
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_LT(prerender_manager()->config().abandon_time_to_live,
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            prerender_manager()->config().time_to_live);
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL first_url("http://www.myexample.com");
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* prerender_contents =
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          first_url, FINAL_STATUS_TIMED_OUT);
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(first_url));
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int first_prerender_id = last_prerender_id();
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int child_id;
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int route_id;
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(prerender_contents->GetChildId(&child_id));
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(prerender_contents->GetRouteId(&route_id));
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL pending_url("http://www.neverlaunched.com");
14545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_link_manager()->OnAddPrerender(
14555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes,
14565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::Referrer(), kSize, route_id);
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int second_prerender_id = last_prerender_id();
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* null = NULL;
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url));
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url));
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               first_prerender_id);
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_link_manager()->OnAbandonPrerender(kDefaultChildId,
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               second_prerender_id);
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->config().abandon_time_to_live +
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TimeDelta::FromSeconds(1));
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(first_url));
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url));
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates two prerenders, one of which should be blocked by the
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// max_link_concurrency; uses one after the max wait to launch, and
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ensures the second prerender does not start.
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerWaitToLaunchNotLaunched) {
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(1);
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_LT(prerender_manager()->config().max_wait_to_launch,
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            prerender_manager()->config().time_to_live);
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL first_url("http://www.myexample.com");
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* prerender_contents =
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          first_url, FINAL_STATUS_USED);
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(first_url));
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL second_url("http://www.neverlaunched.com");
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(AddSimplePrerender(second_url));
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsEmptyPrerenderLinkManager());
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* null = NULL;
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url));
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->config().max_wait_to_launch +
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TimeDelta::FromSeconds(1));
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url));
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(prerender_contents,
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            prerender_manager()->FindAndUseEntry(first_url));
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(first_url));
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsEmptyPrerenderLinkManager());
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates two prerenders, one of which should start when the first one expires.
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrerenderTest, LinkManagerExpireRevealingLaunch) {
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetConcurrency(1);
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_LT(prerender_manager()->config().max_wait_to_launch,
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            prerender_manager()->config().time_to_live);
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL first_url("http://www.willexpire.com");
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* first_prerender_contents =
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          first_url, FINAL_STATUS_TIMED_OUT);
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(AddSimplePrerender(first_url));
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(first_prerender_contents,
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            prerender_manager()->FindEntry(first_url));
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Insert the second prerender so it will be still be launchable when the
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // first expires.
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const TimeDelta wait_to_launch_second_prerender =
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->config().time_to_live -
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->config().max_wait_to_launch +
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TimeDelta::FromSeconds(2);
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const TimeDelta wait_for_first_prerender_to_expire =
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->config().time_to_live -
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      wait_to_launch_second_prerender +
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TimeDelta::FromSeconds(1);
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_LT(prerender_manager()->config().time_to_live,
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            wait_to_launch_second_prerender +
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            wait_for_first_prerender_to_expire);
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_GT(prerender_manager()->config().max_wait_to_launch.InSeconds(),
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            wait_for_first_prerender_to_expire.InSeconds());
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(wait_to_launch_second_prerender);
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL second_url("http://www.willlaunch.com");
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DummyPrerenderContents* second_prerender_contents =
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          second_url, FINAL_STATUS_USED);
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(AddSimplePrerender(second_url));
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first prerender is still running, but the second has not yet launched.
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(first_prerender_contents,
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            prerender_manager()->FindEntry(first_url));
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrerenderContents* null = NULL;
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(second_url));
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first prerender should have died, giving life to the second one.
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender_manager()->AdvanceTimeTicks(wait_for_first_prerender_to_expire);
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(null, prerender_manager()->FindEntry(first_url));
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(second_prerender_contents,
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            prerender_manager()->FindAndUseEntry(second_url));
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PrerenderTest, InstantSearchNotAllowedWhenDisabled) {
1565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
1566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "EmbeddedSearch",
1567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "Group82 espv:8 use_cacheable_ntp:1 prefetch_results:1"));
15681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisablePrerender();
1569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(prerender_manager()->AddPrerenderForInstant(
1570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL("http://www.example.com/instant_search"), NULL, gfx::Size()));
1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PrerenderTest, PrerenderContentsForInstantSearch) {
1574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
1575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "EmbeddedSearch",
1576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "Group82 espv:8 use_cacheable_ntp:1 prefetch_results:1"));
1577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL url("http://www.example.com/instant_search");
1578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DummyPrerenderContents* prerender_contents =
1579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      prerender_manager()->CreateNextPrerenderContents(url, ORIGIN_INSTANT,
1580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                       FINAL_STATUS_USED);
1581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<PrerenderHandle> prerender_handle(
1582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      prerender_manager()->AddPrerenderForInstant(url, NULL, kSize));
1583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CHECK(prerender_handle.get());
1584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(prerender_handle->IsPrerendering());
1585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(prerender_contents->prerendering_has_started());
1586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(prerender_contents, prerender_handle->contents());
1587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin());
1588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url));
1589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(prerender_handle->IsPrerendering());
1590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace prerender
1593