resource_scheduler_unittest.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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 */, 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL /* service_worker_context */, 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&FakeResourceMessageFilter::GetContexts, 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Unretained(this))) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeResourceMessageFilter() {} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void GetContexts(const ResourceHostMsg_Request& request, 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceContext** resource_context, 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::URLRequestContext** request_context) { 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *resource_context = &context_; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *request_context = NULL; 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeResourceContext context_; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceSchedulerTest : public testing::Test { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceSchedulerTest() 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : next_request_id_(0), 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( 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context_.CreateRequest(GURL(url), priority, NULL, 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 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MSG_ROUTING_NONE, // render_frame_id 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, // is_main_frame 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, // parent_is_main_frame 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, // parent_render_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 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebReferrerPolicyDefault, // referrer_policy 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebPageVisibilityStateVisible, // visibility_state 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, // context 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::WeakPtr<ResourceMessageFilter>(), // filter 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true); // is_async 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info->AssociateWithRequest(url_request.get()); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url_request.Pass(); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> NewURLRequest(const char* url, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NewURLRequestWithRoute(url, priority, kRouteId); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest* NewRequestWithRoute(const char* url, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int route_id) { 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request( 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NewURLRequestWithRoute(url, priority, route_id)); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kChildId, route_id, url_request.get())); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request->Start(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return request; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest* NewRequest(const char* url, net::RequestPriority priority) { 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NewRequestWithRoute(url, priority, kRouteId); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ChangeRequestPriority(TestRequest* request, 192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net::RequestPriority new_priority, 193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int intra_priority = 0) { 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeResourceMessageFilter> filter( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FakeResourceMessageFilter(kChildId)); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request->url_request()); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GlobalRequestID& id = info->GetGlobalRequestID(); 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority, 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch intra_priority); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ok = false; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rdh_.OnMessageReceived(msg, filter.get(), &ok); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ok); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_request_id_; 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopForIO message_loop_; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThreadImpl ui_thread_; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThreadImpl io_thread_; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceDispatcherHostImpl rdh_; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceScheduler scheduler_; 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::HttpServerPropertiesImpl http_server_properties_; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContext context_; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, OneIsolatedLowRequest) { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOWEST)); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilIdle) { 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low->started()); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch high.reset(); 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low->started()); 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scheduler_.OnWillInsertBody(kChildId, kRouteId); 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) http_server_properties_.SetSupportsSpdy( 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::HostPortPair("spdyhost", 443), true); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> low_spdy( 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NewRequest("https://spdyhost/high", net::LOWEST)); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(high->started()); 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(low_spdy->started()); 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(low->started()); 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scheduler_.OnWillInsertBody(kChildId, kRouteId); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, NavigationResetsState) { 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnNavigate(kChildId, kRouteId); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low->started()); 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int route_id = 0; // Indicates a background request. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequestWithRoute("http://host/1", 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::LOWEST, route_id)); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, StartMultipleLowRequestsWhenIdle) { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high1(NewRequest("http://host/high1", net::HIGHEST)); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high2(NewRequest("http://host/high2", net::HIGHEST)); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high1->started()); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high2->started()); 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low->started()); 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high1.reset(); 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high2.reset(); 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST)); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request( 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NewURLRequest("http://host/low2", net::LOWEST)); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest( 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kChildId, kRouteId, url_request.get())); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest( 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle.Pass(), url_request.Pass())); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) low2->Start(); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST)); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) low2->set_request_to_cancel(low3.Pass()); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST)); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(low2->started()); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high.reset(); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low1->started()); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low2->started()); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low4->started()); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LimitedNumberOfDelayableRequestsInFlight) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only load low priority resources if there's a body. 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Throw in one high priority request to make sure that's not a factor. 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kMaxNumDelayableRequestsPerHost = 6; 326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedVector<TestRequest> lows_singlehost; 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Queue up to the per-host limit (we subtract the current high-pri request). 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerHost - 1; ++i) { 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_singlehost.push_back(NewRequest(url.c_str(), net::LOWEST)); 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(lows_singlehost[i]->started()); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> second_last_singlehost(NewRequest("http://host/last", 335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> last_singlehost(NewRequest("http://host/s_last", 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(second_last_singlehost->started()); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high.reset(); 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(second_last_singlehost->started()); 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(last_singlehost->started()); 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_singlehost.erase(lows_singlehost.begin()); 344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(last_singlehost->started()); 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Queue more requests from different hosts until we reach the total limit. 347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int expected_slots_left = 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) kMaxNumDelayableRequestsPerClient - kMaxNumDelayableRequestsPerHost; 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_GT(expected_slots_left, 0); 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedVector<TestRequest> lows_differenthosts; 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < expected_slots_left; ++i) { 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string url = "http://host" + base::IntToString(i) + "/low"; 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_differenthosts.push_back(NewRequest(url.c_str(), net::LOWEST)); 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(lows_differenthosts[i]->started()); 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> last_differenthost(NewRequest("http://host_new/last", 358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(last_differenthost->started()); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, RaisePriorityAndStart) { 363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/req", net::LOWEST)); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::HIGHEST); 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, RaisePriorityInQueue) { 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::LOWEST); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) { 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LowerPriority) { 401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::IDLE); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // 2 fewer filler requests: 1 for the "low" dummy at the start, and 1 for the 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // one at the end, which will be tested. 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const int kNumFillerRequests = kMaxNumDelayableRequestsPerClient - 2; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (int i = 0; i < kNumFillerRequests; ++i) { 420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string url = "http://host" + base::IntToString(i) + "/low"; 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(idle->started()); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) { 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) { 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::IDLE); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::LOWEST); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) { 460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Dummies to enforce scheduling. 461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); 463c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ScopedVector<TestRequest> lows; 466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) { 467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch string url = "http://host/low" + base::IntToString(i); 468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch lows.push_back(NewRequest(url.c_str(), net::IDLE)); 469c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); 472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(request->started()); 473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ChangeRequestPriority(request.get(), net::IDLE, 1); 475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(request->started()); 476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scheduler_.OnWillInsertBody(kChildId, kRouteId); 478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(request->started()); 479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { 4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Dummies to enforce scheduling. 4831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 4841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); 4851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRequest> request( 4871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NewRequest("chrome-extension://req", net::LOWEST)); 4881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(request->started()); 4891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) { 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(request->started()); 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scheduler_.OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId); 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(request->started()); 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestRequest> after(NewRequest("http://host/after", net::IDLE)); 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(after->started()); 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { 5065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scheduler_.OnWillInsertBody(kChildId, kRouteId); 5075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 5085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestRequest> low1_spdy( 5105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NewRequest("http://spdyhost1:8080/low", net::LOWEST)); 5115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Cancel a request after we learn the server supports SPDY. 5125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ScopedVector<TestRequest> lows; 5135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) { 5145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu string url = "http://host" + base::IntToString(i) + "/low"; 5155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 5165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 5175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestRequest> low1(NewRequest("http://host/low", net::LOWEST)); 5185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(low1->started()); 5195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu http_server_properties_.SetSupportsSpdy( 5205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::HostPortPair("spdyhost1", 8080), true); 5215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu low1_spdy.reset(); 5225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(low1->started()); 5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu low1.reset(); 5255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestRequest> low2_spdy( 5265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NewRequest("http://spdyhost2:8080/low", net::IDLE)); 5275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Reprioritize a request after we learn the server supports SPDY. 5285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(low2_spdy->started()); 5295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu http_server_properties_.SetSupportsSpdy( 5305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::HostPortPair("spdyhost2", 8080), true); 5315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ChangeRequestPriority(low2_spdy.get(), net::LOWEST); 5325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 5335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(low2->started()); 5345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // unnamed namespace 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 539