resource_scheduler_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_scheduler.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/browser_thread_impl.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_message_filter.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_request_info_impl.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/resource_messages.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/resource_context.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/resource_controller.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/resource_throttle.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/process_type.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/host_port_pair.h" 200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/http/http_server_properties_impl.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_test_util.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/common/resource_type.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestRequestFactory; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kChildId = 30; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kRouteId = 75; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestRequest : public ResourceController { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest(scoped_ptr<ResourceThrottle> throttle, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : started_(false), 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle_(throttle.Pass()), 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_request_(url_request.Pass()) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle_->set_controller_for_testing(this); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool started() const { return started_; } 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Start() { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool deferred = false; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle_->WillStartRequest(&deferred); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_ = !deferred; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const net::URLRequest* url_request() const { return url_request_.get(); } 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ResourceController interface: 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Cancel() OVERRIDE {} 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelAndIgnore() OVERRIDE {} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelWithError(int error_code) OVERRIDE {} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Resume() OVERRIDE { started_ = true; } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool started_; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceThrottle> throttle_; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request_; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CancelingTestRequest : public TestRequest { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelingTestRequest(scoped_ptr<ResourceThrottle> throttle, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TestRequest(throttle.Pass(), url_request.Pass()) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_to_cancel_ = request_to_cancel.Pass(); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Resume() OVERRIDE { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest::Resume(); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_to_cancel_.reset(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request_to_cancel_; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeResourceContext : public ResourceContext { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual net::HostResolver* GetHostResolver() OVERRIDE { return NULL; } 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual net::URLRequestContext* GetRequestContext() OVERRIDE { return NULL; } 933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual bool AllowMicAccess(const GURL& origin) OVERRIDE { return false; } 943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual bool AllowCameraAccess(const GURL& origin) OVERRIDE { return false; } 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeResourceMessageFilter : public ResourceMessageFilter { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeResourceMessageFilter(int child_id) 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : ResourceMessageFilter( 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) child_id, 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PROCESS_TYPE_RENDERER, 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NULL /* appcache_service */, 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NULL /* blob_storage_context */, 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NULL /* file_system_context */, 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&FakeResourceMessageFilter::GetContexts, 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Unretained(this))) { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeResourceMessageFilter() {} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void GetContexts(const ResourceHostMsg_Request& request, 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceContext** resource_context, 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::URLRequestContext** request_context) { 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *resource_context = &context_; 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *request_context = NULL; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeResourceContext context_; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceSchedulerTest : public testing::Test { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceSchedulerTest() 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : next_request_id_(0), 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_(base::MessageLoop::TYPE_IO), 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_thread_(BrowserThread::UI, &message_loop_), 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) io_thread_(BrowserThread::IO, &message_loop_) { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnClientCreated(kChildId, kRouteId); 131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch context_.set_http_server_properties(http_server_properties_.GetWeakPtr()); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ResourceSchedulerTest() { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnClientDeleted(kChildId, kRouteId); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> NewURLRequestWithRoute( 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* url, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int route_id) { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request( 1430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) context_.CreateRequest(GURL(url), priority, NULL)); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceRequestInfoImpl* info = new ResourceRequestInfoImpl( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PROCESS_TYPE_RENDERER, // process_type 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kChildId, // child_id 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) route_id, // route_id 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, // origin_pid 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++next_request_id_, // request_id 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, // is_main_frame 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, // frame_id 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, // parent_is_main_frame 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, // parent_frame_id 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType::SUB_RESOURCE, // resource_type 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PAGE_TRANSITION_LINK, // transition_type 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, // should_replace_current_entry 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, // is_download 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, // is_stream 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, // allow_download 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, // has_user_gesture 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebReferrerPolicyDefault, // referrer_policy 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, // context 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::WeakPtr<ResourceMessageFilter>(), // filter 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true); // is_async 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info->AssociateWithRequest(url_request.get()); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url_request.Pass(); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> NewURLRequest(const char* url, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority) { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NewURLRequestWithRoute(url, priority, kRouteId); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest* NewRequestWithRoute(const char* url, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int route_id) { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request( 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NewURLRequestWithRoute(url, priority, route_id)); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest( 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kChildId, route_id, url_request.get())); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request->Start(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return request; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest* NewRequest(const char* url, net::RequestPriority priority) { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NewRequestWithRoute(url, priority, kRouteId); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ChangeRequestPriority(TestRequest* request, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority new_priority) { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeResourceMessageFilter> filter( 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FakeResourceMessageFilter(kChildId)); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request->url_request()); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GlobalRequestID& id = info->GetGlobalRequestID(); 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ok = false; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rdh_.OnMessageReceived(msg, filter.get(), &ok); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ok); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_request_id_; 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThreadImpl ui_thread_; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThreadImpl io_thread_; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceDispatcherHostImpl rdh_; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceScheduler scheduler_; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::HttpServerPropertiesImpl http_server_properties_; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContext context_; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, OneIsolatedLowRequest) { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOWEST)); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilIdle) { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low->started()); 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch high.reset(); 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) { 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low->started()); 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scheduler_.OnWillInsertBody(kChildId, kRouteId); 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) http_server_properties_.SetSupportsSpdy( 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::HostPortPair("spdyhost", 443), true); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> low_spdy( 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NewRequest("https://spdyhost/high", net::LOWEST)); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(high->started()); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(low_spdy->started()); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(low->started()); 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scheduler_.OnWillInsertBody(kChildId, kRouteId); 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, NavigationResetsState) { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnNavigate(kChildId, kRouteId); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low->started()); 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int route_id = 0; // Indicates a background request. 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequestWithRoute("http://host/1", 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::LOWEST, route_id)); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, StartMultipleLowRequestsWhenIdle) { 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high1(NewRequest("http://host/high1", net::HIGHEST)); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high2(NewRequest("http://host/high2", net::HIGHEST)); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high1->started()); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high2->started()); 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low->started()); 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high1.reset(); 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high2.reset(); 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST)); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request( 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NewURLRequest("http://host/low2", net::LOWEST)); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest( 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kChildId, kRouteId, url_request.get())); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest( 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle.Pass(), url_request.Pass())); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) low2->Start(); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST)); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) low2->set_request_to_cancel(low3.Pass()); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST)); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(low2->started()); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high.reset(); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low1->started()); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low2->started()); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low4->started()); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LimitedNumberOfDelayableRequestsInFlight) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only load low priority resources if there's a body. 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Throw in one high priority request to make sure that's not a factor. 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kMaxNumDelayableRequestsPerHost = 6; 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedVector<TestRequest> lows_singlehost; 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Queue up to the per-host limit (we subtract the current high-pri request). 325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerHost - 1; ++i) { 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_singlehost.push_back(NewRequest(url.c_str(), net::LOWEST)); 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(lows_singlehost[i]->started()); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> second_last_singlehost(NewRequest("http://host/last", 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> last_singlehost(NewRequest("http://host/s_last", 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(second_last_singlehost->started()); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high.reset(); 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(second_last_singlehost->started()); 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(last_singlehost->started()); 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_singlehost.erase(lows_singlehost.begin()); 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(last_singlehost->started()); 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Queue more requests from different hosts until we reach the total limit. 344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int expected_slots_left = 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) kMaxNumDelayableRequestsPerClient - kMaxNumDelayableRequestsPerHost; 346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_GT(expected_slots_left, 0); 347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedVector<TestRequest> lows_differenthosts; 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < expected_slots_left; ++i) { 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string url = "http://host" + base::IntToString(i) + "/low"; 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_differenthosts.push_back(NewRequest(url.c_str(), net::LOWEST)); 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(lows_differenthosts[i]->started()); 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> last_differenthost(NewRequest("http://host_new/last", 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(last_differenthost->started()); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, RaisePriorityAndStart) { 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/req", net::LOWEST)); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::HIGHEST); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, RaisePriorityInQueue) { 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::LOWEST); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) { 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LowerPriority) { 398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::IDLE); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // 2 fewer filler requests: 1 for the "low" dummy at the start, and 1 for the 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // one at the end, which will be tested. 414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const int kNumFillerRequests = kMaxNumDelayableRequestsPerClient - 2; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (int i = 0; i < kNumFillerRequests; ++i) { 417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string url = "http://host" + base::IntToString(i) + "/low"; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(idle->started()); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) { 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::IDLE); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::LOWEST); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { 4571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Dummies to enforce scheduling. 4581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 4591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); 4601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRequest> request( 4621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NewRequest("chrome-extension://req", net::LOWEST)); 4631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(request->started()); 4641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // unnamed namespace 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 469