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