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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/resource_prefetcher.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/resource_prefetcher_manager.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Eq;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Property;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace predictors {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wrapper over the ResourcePrefetcher that stubs out the StartURLRequest call
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// since we do not want to do network fetches in this unittest.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestResourcePrefetcher : public ResourcePrefetcher {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestResourcePrefetcher(ResourcePrefetcher::Delegate* delegate,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const ResourcePrefetchPredictorConfig& config,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const NavigationID& navigation_id,
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         PrefetchKeyType key_type,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         scoped_ptr<RequestVector> requests)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : ResourcePrefetcher(delegate, config, navigation_id,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           key_type, requests.Pass()) { }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestResourcePrefetcher() { }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(StartURLRequest, void(net::URLRequest* request));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadFullResponse(net::URLRequest* request) OVERRIDE {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinishRequest(request, Request::PREFETCH_STATUS_FROM_CACHE);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestResourcePrefetcher);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delegate for ResourcePrefetcher.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestResourcePrefetcherDelegate : public ResourcePrefetcher::Delegate {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit TestResourcePrefetcherDelegate(base::MessageLoop* loop)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : request_context_getter_(new net::TestURLRequestContextGetter(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          loop->message_loop_proxy())) { }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~TestResourcePrefetcherDelegate() { }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return request_context_getter_->GetURLRequestContext();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(ResourcePrefetcherFinished,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(ResourcePrefetcher* prefetcher,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ResourcePrefetcher::RequestVector* requests));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestResourcePrefetcherDelegate);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following unittest tests most of the ResourcePrefetcher except for:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1. Call to ReadFullResponse. There does not seem to be a good way to test the
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    function in a unittest, and probably requires a browser_test.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2. Setting of the Prefetch status for cache vs non cache.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourcePrefetcherTest : public testing::Test {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourcePrefetcherTest();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ResourcePrefetcherTest();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ResourcePrefetcher::Request Request;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddStartUrlRequestExpectation(const std::string& url) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*prefetcher_,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                StartURLRequest(Property(&net::URLRequest::original_url,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Eq(GURL(url)))));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckPrefetcherState(size_t inflight, size_t queue, size_t host) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(prefetcher_->inflight_requests_.size(), inflight);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(prefetcher_->request_queue_.size(), queue);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(prefetcher_->host_inflight_counts_.size(), host);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequest* GetInFlightRequest(const std::string& url_str) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(url_str);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::list<Request*>::const_iterator it =
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         prefetcher_->request_queue_.begin();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != prefetcher_->request_queue_.end(); ++it) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE((*it)->resource_url, url);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::map<net::URLRequest*, Request*>::const_iterator it =
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         prefetcher_->inflight_requests_.begin();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != prefetcher_->inflight_requests_.end(); ++it) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it->first->original_url() == url)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return it->first;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(false) << "Infligh request not found: " << url_str;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnReceivedRedirect(const std::string& url) {
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    prefetcher_->OnReceivedRedirect(
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GetInFlightRequest(url), GURL(std::string()), NULL);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAuthRequired(const std::string& url) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefetcher_->OnAuthRequired(GetInFlightRequest(url), NULL);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCertificateRequested(const std::string& url) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefetcher_->OnCertificateRequested(GetInFlightRequest(url), NULL);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSSLCertificateError(const std::string& url) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefetcher_->OnSSLCertificateError(GetInFlightRequest(url),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       net::SSLInfo(), false);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnResponse(const std::string& url) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefetcher_->OnResponseStarted(GetInFlightRequest(url));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop loop_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourcePrefetchPredictorConfig config_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestResourcePrefetcherDelegate prefetcher_delegate_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestResourcePrefetcher> prefetcher_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourcePrefetcherTest);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourcePrefetcherTest::ResourcePrefetcherTest()
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : loop_(base::MessageLoop::TYPE_IO),
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_thread_(content::BrowserThread::IO, &loop_),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefetcher_delegate_(&loop_) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_.max_prefetches_inflight_per_navigation = 5;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_.max_prefetches_inflight_per_host_per_navigation = 2;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourcePrefetcherTest::~ResourcePrefetcherTest() {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourcePrefetcherTest, TestPrefetcherFinishes) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResourcePrefetcher::RequestVector> requests(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ResourcePrefetcher::RequestVector);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.google.com/resource1.html")));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.google.com/resource2.png")));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://yahoo.com/resource1.png")));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://yahoo.com/resource2.png")));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://yahoo.com/resource3.png")));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://m.google.com/resource1.jpg")));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.google.com/resource3.html")));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://m.google.com/resource2.html")));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://m.google.com/resource3.css")));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://m.google.com/resource4.png")));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://yahoo.com/resource4.png")));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://yahoo.com/resource5.png")));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationID navigation_id;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_id.render_process_id = 1;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_id.render_view_id = 2;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_id.main_frame_url = GURL("http://www.google.com");
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed later for comparison.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourcePrefetcher::RequestVector* requests_ptr = requests.get();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetcher_.reset(new TestResourcePrefetcher(&prefetcher_delegate_,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               config_,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               navigation_id,
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               PREFETCH_KEY_TYPE_URL,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               requests.Pass()));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starting the prefetcher maxes out the number of possible requests.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://www.google.com/resource1.html");
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://www.google.com/resource2.png");
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://yahoo.com/resource1.png");
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://yahoo.com/resource2.png");
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://m.google.com/resource1.jpg");
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetcher_->Start();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(5, 7, 3);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://m.google.com/resource2.html");
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://m.google.com/resource1.jpg");
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(5, 6, 3);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://www.google.com/resource3.html");
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnSSLCertificateError("http://www.google.com/resource1.html");
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(5, 5, 3);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://m.google.com/resource3.css");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://m.google.com/resource2.html");
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(5, 4, 3);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://m.google.com/resource4.png");
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnReceivedRedirect("http://www.google.com/resource3.html");
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(5, 3, 3);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://www.google.com/resource2.png");
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(4, 3, 2);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://yahoo.com/resource3.png");
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnReceivedRedirect("http://yahoo.com/resource2.png");
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(4, 2, 2);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://yahoo.com/resource4.png");
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://yahoo.com/resource1.png");
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(4, 1, 2);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://yahoo.com/resource5.png");
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://yahoo.com/resource4.png");
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(4, 0, 2);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://yahoo.com/resource5.png");
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(3, 0, 2);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnCertificateRequested("http://m.google.com/resource4.png");
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(2, 0, 2);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnAuthRequired("http://m.google.com/resource3.css");
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(1, 0, 1);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the final call.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(prefetcher_delegate_,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ResourcePrefetcherFinished(Eq(prefetcher_.get()),
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Eq(requests_ptr)));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://yahoo.com/resource3.png");
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(0, 0, 0);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the prefetch status.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[0]->prefetch_status,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_CERT_ERROR);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[1]->prefetch_status,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_FROM_CACHE);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[2]->prefetch_status,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_FROM_CACHE);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[3]->prefetch_status,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_REDIRECTED);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[4]->prefetch_status,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_FROM_CACHE);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[5]->prefetch_status,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_FROM_CACHE);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[6]->prefetch_status,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_REDIRECTED);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[7]->prefetch_status,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_FROM_CACHE);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[8]->prefetch_status,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_AUTH_REQUIRED);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[9]->prefetch_status,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_CERT_REQUIRED);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[10]->prefetch_status,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_FROM_CACHE);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ((*requests_ptr)[11]->prefetch_status,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Request::PREFETCH_STATUS_FROM_CACHE);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete requests_ptr;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourcePrefetcherTest, TestPrefetcherStopped) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResourcePrefetcher::RequestVector> requests(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ResourcePrefetcher::RequestVector);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.google.com/resource1.html")));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.google.com/resource2.png")));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://yahoo.com/resource1.png")));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://yahoo.com/resource2.png")));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://yahoo.com/resource3.png")));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests->push_back(new ResourcePrefetcher::Request(GURL(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://m.google.com/resource1.jpg")));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationID navigation_id;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_id.render_process_id = 1;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_id.render_view_id = 2;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_id.main_frame_url = GURL("http://www.google.com");
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed later for comparison.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourcePrefetcher::RequestVector* requests_ptr = requests.get();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetcher_.reset(new TestResourcePrefetcher(&prefetcher_delegate_,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               config_,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               navigation_id,
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               PREFETCH_KEY_TYPE_HOST,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               requests.Pass()));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starting the prefetcher maxes out the number of possible requests.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://www.google.com/resource1.html");
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://www.google.com/resource2.png");
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://yahoo.com/resource1.png");
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://yahoo.com/resource2.png");
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddStartUrlRequestExpectation("http://m.google.com/resource1.jpg");
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetcher_->Start();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(5, 1, 3);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://www.google.com/resource1.html");
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(4, 1, 3);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetcher_->Stop();  // No more queueing.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://www.google.com/resource2.png");
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(3, 1, 2);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://yahoo.com/resource1.png");
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(2, 1, 2);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://yahoo.com/resource2.png");
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(1, 1, 1);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the final call.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(prefetcher_delegate_,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ResourcePrefetcherFinished(Eq(prefetcher_.get()),
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Eq(requests_ptr)));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnResponse("http://m.google.com/resource1.jpg");
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckPrefetcherState(0, 1, 0);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete requests_ptr;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace predictors
347