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" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/timer/mock_timer.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/timer/timer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/browser_thread_impl.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_message_filter.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_request_info_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/resource_messages.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/resource_context.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/resource_controller.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/resource_throttle.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/process_type.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/mock_render_process_host.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_browser_context.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/test/test_web_contents.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/host_port_pair.h" 270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/http/http_server_properties_impl.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_test_util.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/events/latency_info.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestRequestFactory; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kChildId = 30; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kRouteId = 75; 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kChildId2 = 43; 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kRouteId2 = 67; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kBackgroundChildId = 35; 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kBackgroundRouteId = 43; 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kBackgroundChildId2 = 54; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kBackgroundRouteId2 = 82; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestRequest : public ResourceController { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest(scoped_ptr<ResourceThrottle> throttle, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : started_(false), 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle_(throttle.Pass()), 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_request_(url_request.Pass()) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle_->set_controller_for_testing(this); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~TestRequest() {} 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool started() const { return started_; } 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Start() { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool deferred = false; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle_->WillStartRequest(&deferred); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) started_ = !deferred; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void Cancel() OVERRIDE { 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Alert the scheduler that the request can be deleted. 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch throttle_.reset(0); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const net::URLRequest* url_request() const { return url_request_.get(); } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ResourceController interface: 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelAndIgnore() OVERRIDE {} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelWithError(int error_code) OVERRIDE {} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Resume() OVERRIDE { started_ = true; } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool started_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceThrottle> throttle_; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request_; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CancelingTestRequest : public TestRequest { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelingTestRequest(scoped_ptr<ResourceThrottle> throttle, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request) 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : TestRequest(throttle.Pass(), url_request.Pass()) {} 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_to_cancel_ = request_to_cancel.Pass(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Resume() OVERRIDE { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest::Resume(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_to_cancel_.reset(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request_to_cancel_; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeResourceContext : public ResourceContext { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual net::HostResolver* GetHostResolver() OVERRIDE { return NULL; } 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual net::URLRequestContext* GetRequestContext() OVERRIDE { return NULL; } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeResourceMessageFilter : public ResourceMessageFilter { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeResourceMessageFilter(int child_id) 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : ResourceMessageFilter( 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) child_id, 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PROCESS_TYPE_RENDERER, 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NULL /* appcache_service */, 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NULL /* blob_storage_context */, 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NULL /* file_system_context */, 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL /* service_worker_context */, 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&FakeResourceMessageFilter::GetContexts, 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Unretained(this))) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeResourceMessageFilter() {} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void GetContexts(const ResourceHostMsg_Request& request, 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceContext** resource_context, 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::URLRequestContext** request_context) { 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *resource_context = &context_; 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *request_context = NULL; 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeResourceContext context_; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceSchedulerTest : public testing::Test { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceSchedulerTest() 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : next_request_id_(0), 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_thread_(BrowserThread::UI, &message_loop_), 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) io_thread_(BrowserThread::IO, &message_loop_), 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mock_timer_(new base::MockTimer(true, true)) { 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.set_timer_for_testing(scoped_ptr<base::Timer>(mock_timer_)); 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(aiolos): Remove when throttling and coalescing have both landed. 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* should_coalesce */); 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId, kRouteId, true); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId, kBackgroundRouteId, false); 154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch context_.set_http_server_properties(http_server_properties_.GetWeakPtr()); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ResourceSchedulerTest() { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnClientDeleted(kChildId, kRouteId); 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId, kBackgroundRouteId); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute( 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* url, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority, 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int child_id, 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int route_id, 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_async) { 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request( 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context_.CreateRequest(GURL(url), priority, NULL, NULL)); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceRequestInfoImpl* info = new ResourceRequestInfoImpl( 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PROCESS_TYPE_RENDERER, // process_type 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch child_id, // child_id 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch route_id, // route_id 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, // origin_pid 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++next_request_id_, // request_id 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MSG_ROUTING_NONE, // render_frame_id 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, // is_main_frame 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, // parent_is_main_frame 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, // parent_render_frame_id 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RESOURCE_TYPE_SUB_RESOURCE, // resource_type 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK, // transition_type 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, // should_replace_current_entry 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, // is_download 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, // is_stream 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, // allow_download 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, // has_user_gesture 1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) false, // enable_load_timing 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebReferrerPolicyDefault, // referrer_policy 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebPageVisibilityStateVisible, // visibility_state 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NULL, // context 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::WeakPtr<ResourceMessageFilter>(), // filter 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch is_async); // is_async 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info->AssociateWithRequest(url_request.get()); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url_request.Pass(); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> NewURLRequest(const char* url, 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority) { 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NewURLRequestWithChildAndRoute( 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, priority, kChildId, kRouteId, true); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest* NewRequestWithRoute(const char* url, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::RequestPriority priority, 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int route_id) { 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NewRequestWithChildAndRoute(url, priority, route_id, kChildId); 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestRequest* NewRequestWithChildAndRoute(const char* url, 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::RequestPriority priority, 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int child_id, 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int route_id) { 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetNewTestRequest(url, priority, child_id, route_id, true); 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestRequest* NewRequest(const char* url, net::RequestPriority priority) { 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NewRequestWithChildAndRoute(url, priority, kChildId, kRouteId); 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestRequest* NewBackgroundRequest(const char* url, 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::RequestPriority priority) { 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NewRequestWithChildAndRoute( 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, priority, kBackgroundChildId, kBackgroundRouteId); 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestRequest* NewSyncRequest(const char* url, net::RequestPriority priority) { 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NewSyncRequestWithChildAndRoute(url, priority, kChildId, kRouteId); 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestRequest* NewBackgroundSyncRequest(const char* url, 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::RequestPriority priority) { 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NewSyncRequestWithChildAndRoute( 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, priority, kBackgroundChildId, kBackgroundRouteId); 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestRequest* NewSyncRequestWithChildAndRoute(const char* url, 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::RequestPriority priority, 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int child_id, 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int route_id) { 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetNewTestRequest(url, priority, child_id, route_id, false); 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestRequest* GetNewTestRequest(const char* url, 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::RequestPriority priority, 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int child_id, 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int route_id, 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_async) { 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<net::URLRequest> url_request(NewURLRequestWithChildAndRoute( 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, priority, child_id, route_id, is_async)); 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ResourceThrottle> throttle( 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.ScheduleRequest(child_id, route_id, url_request.get())); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request->Start(); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return request; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ChangeRequestPriority(TestRequest* request, 259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net::RequestPriority new_priority, 260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int intra_priority = 0) { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeResourceMessageFilter> filter( 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FakeResourceMessageFilter(kChildId)); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request->url_request()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GlobalRequestID& id = info->GetGlobalRequestID(); 266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority, 267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch intra_priority); 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rdh_.OnMessageReceived(msg, filter.get()); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void FireCoalescingTimer() { 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mock_timer_->Fire(); 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_request_id_; 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopForIO message_loop_; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThreadImpl ui_thread_; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThreadImpl io_thread_; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceDispatcherHostImpl rdh_; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceScheduler scheduler_; 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MockTimer* mock_timer_; 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::HttpServerPropertiesImpl http_server_properties_; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContext context_; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, OneIsolatedLowRequest) { 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOWEST)); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilIdle) { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low->started()); 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch high.reset(); 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) { 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low->started()); 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) high.reset(); 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scheduler_.OnWillInsertBody(kChildId, kRouteId); 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(ResourceSchedulerTest, OneLowLoadsUntilCriticalComplete) { 31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 31803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(high->started()); 32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(low->started()); 32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(low2->started()); 32203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(low2->started()); 32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) high.reset(); 32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(low2->started()); 32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) http_server_properties_.SetSupportsSpdy( 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::HostPortPair("spdyhost", 443), true); 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> low_spdy( 333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewRequest("https://spdyhost/low", net::LOWEST)); 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(high->started()); 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(low_spdy->started()); 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(low->started()); 339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scheduler_.OnWillInsertBody(kChildId, kRouteId); 34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) high.reset(); 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, NavigationResetsState) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnNavigate(kChildId, kRouteId); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low->started()); 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) { 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int route_id = 0; // Indicates a background request. 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequestWithRoute("http://host/1", 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::LOWEST, route_id)); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ResourceSchedulerTest, StartMultipleLowRequestsWhenIdle) { 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high1(NewRequest("http://host/high1", net::HIGHEST)); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high2(NewRequest("http://host/high2", net::HIGHEST)); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high1->started()); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high2->started()); 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low->started()); 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high1.reset(); 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(low2->started()); 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high2.reset(); 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(low2->started()); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST)); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequest> url_request( 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NewURLRequest("http://host/low2", net::LOWEST)); 384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ResourceThrottle> throttle( 385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.ScheduleRequest(kChildId, kRouteId, url_request.get())); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest( 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throttle.Pass(), url_request.Pass())); 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) low2->Start(); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST)); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) low2->set_request_to_cancel(low3.Pass()); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST)); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(low2->started()); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high.reset(); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low1->started()); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low2->started()); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(low4->started()); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LimitedNumberOfDelayableRequestsInFlight) { 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only load low priority resources if there's a body. 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Throw in one high priority request to make sure that's not a factor. 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(high->started()); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kMaxNumDelayableRequestsPerHost = 6; 412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedVector<TestRequest> lows_singlehost; 413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Queue up to the per-host limit (we subtract the current high-pri request). 414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerHost - 1; ++i) { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_singlehost.push_back(NewRequest(url.c_str(), net::LOWEST)); 417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(lows_singlehost[i]->started()); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> second_last_singlehost(NewRequest("http://host/last", 421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> last_singlehost(NewRequest("http://host/s_last", 423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(second_last_singlehost->started()); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high.reset(); 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(second_last_singlehost->started()); 428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(last_singlehost->started()); 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_singlehost.erase(lows_singlehost.begin()); 430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(last_singlehost->started()); 431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Queue more requests from different hosts until we reach the total limit. 433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int expected_slots_left = 434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) kMaxNumDelayableRequestsPerClient - kMaxNumDelayableRequestsPerHost; 435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_GT(expected_slots_left, 0); 436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedVector<TestRequest> lows_differenthosts; 437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < expected_slots_left; ++i) { 438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string url = "http://host" + base::IntToString(i) + "/low"; 439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lows_differenthosts.push_back(NewRequest(url.c_str(), net::LOWEST)); 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(lows_differenthosts[i]->started()); 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestRequest> last_differenthost(NewRequest("http://host_new/last", 444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::LOWEST)); 445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(last_differenthost->started()); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, RaisePriorityAndStart) { 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/req", net::LOWEST)); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::HIGHEST); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, RaisePriorityInQueue) { 461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::LOWEST); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) { 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 48203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) high.reset(); 48303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(request->started()); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LowerPriority) { 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::IDLE); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // 2 fewer filler requests: 1 for the "low" dummy at the start, and 1 for the 504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // one at the end, which will be tested. 505eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const int kNumFillerRequests = kMaxNumDelayableRequestsPerClient - 2; 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (int i = 0; i < kNumFillerRequests; ++i) { 508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string url = "http://host" + base::IntToString(i) + "/low"; 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 51303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) high.reset(); 51403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(idle->started()); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) { 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummies to enforce scheduling. 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<TestRequest> lows; 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) { 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string url = "http://host/low" + base::IntToString(i); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::IDLE); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChangeRequestPriority(request.get(), net::LOWEST); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_.OnWillInsertBody(kChildId, kRouteId); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(request->started()); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(idle->started()); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) { 550c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Dummies to enforce scheduling. 551c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ScopedVector<TestRequest> lows; 556c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) { 557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch string url = "http://host/low" + base::IntToString(i); 558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch lows.push_back(NewRequest(url.c_str(), net::IDLE)); 559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 561c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); 562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(request->started()); 563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ChangeRequestPriority(request.get(), net::IDLE, 1); 565c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(request->started()); 566c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scheduler_.OnWillInsertBody(kChildId, kRouteId); 56803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) high.reset(); 569c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(request->started()); 570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { 5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Dummies to enforce scheduling. 5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRequest> request( 5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NewRequest("chrome-extension://req", net::LOWEST)); 5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(request->started()); 5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 582116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, ActiveLoadingSyncSchedulesImmediately) { 583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Dummies to enforce scheduling. 589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewSyncRequest("http://host/req", net::LOWEST)); 594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 597116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, UnthrottledSyncSchedulesImmediately) { 598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Dummies to enforce scheduling. 606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundSyncRequest("http://host/req", net::LOWEST)); 611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) { 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(request->started()); 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scheduler_.OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId); 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(request->started()); 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestRequest> after(NewRequest("http://host/after", net::IDLE)); 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(after->started()); 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { 6295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scheduler_.OnWillInsertBody(kChildId, kRouteId); 6305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. 6315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestRequest> low1_spdy( 6335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NewRequest("http://spdyhost1:8080/low", net::LOWEST)); 6345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Cancel a request after we learn the server supports SPDY. 6355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ScopedVector<TestRequest> lows; 6365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) { 6375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu string url = "http://host" + base::IntToString(i) + "/low"; 6385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu lows.push_back(NewRequest(url.c_str(), net::LOWEST)); 6395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 6405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestRequest> low1(NewRequest("http://host/low", net::LOWEST)); 6415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(low1->started()); 6425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu http_server_properties_.SetSupportsSpdy( 6435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::HostPortPair("spdyhost1", 8080), true); 6445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu low1_spdy.reset(); 6455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(low1->started()); 6465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu low1.reset(); 6485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestRequest> low2_spdy( 6495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NewRequest("http://spdyhost2:8080/low", net::IDLE)); 6505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Reprioritize a request after we learn the server supports SPDY. 6515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(low2_spdy->started()); 6525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu http_server_properties_.SetSupportsSpdy( 6535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::HostPortPair("spdyhost2", 8080), true); 6545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ChangeRequestPriority(low2_spdy.get(), net::LOWEST); 6555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); 6565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(low2->started()); 6575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 6585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 659116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, ThrottledClientCreation) { 660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.should_throttle()); 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 672116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, ActiveClientThrottleUpdateOnLoadingChange) { 673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 681116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); 682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 685116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 686116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, CoalesceBackgroundClientOnLoadCompletion) { 687116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 688116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true /* should_coalesce */); 689116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 690116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, true); 694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::COALESCED, 699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 703116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, UnthrottleBackgroundClientOnLoadingStarted) { 704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true /* should_coalesce */); 706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 707116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, true); 709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::COALESCED, 710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, false); 715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 720116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, OneRequestPerThrottledClient) { 721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 732116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/req", net::IDLE)); 733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 734116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(high->started()); 735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(request->started()); 736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 737116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 738116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, UnthrottleNewlyVisibleClient) { 739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 745116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 746116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 747116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/req", net::IDLE)); 749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(request->started()); 750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 751116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kBackgroundChildId, kBackgroundRouteId, true); 752116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 755116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 756116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 758116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, UnthrottleNewlyAudibleClient) { 759116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 761116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 762116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 763116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/req", net::IDLE)); 769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(request->started()); 770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kBackgroundChildId, kBackgroundRouteId, true); 772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 778116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, VisibleClientStillUnthrottledOnAudabilityChange) { 779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); 789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, false); 796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 803116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, AudibleClientStillUnthrottledOnVisabilityChange) { 804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 806116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); 809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, true); 816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 818116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 827116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 828116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 829116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 830116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, ThrottledClientStartsNextHighestPriorityRequest) { 831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 833116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/req", net::IDLE)); 836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Lower priority request started first to test request prioritizaton. 837116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low( 838116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::IDLE)); 839116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 841116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 842116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(low->started()); 843116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(high->started()); 844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // request->CancelRequest(); 846116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request->Cancel(); 847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(high->started()); 848116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(low->started()); 849116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 851116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, ThrottledSpdyProxySchedulesImmediately) { 852116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 853116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 854116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 855116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 857116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 858116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 859116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 861116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/req", net::IDLE)); 862116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 863116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(request->started()); 864116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId, 866116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId); 867116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 868116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 869116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> after( 870116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/after", net::IDLE)); 871116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(after->started()); 872116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 873116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 874116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, CoalescedClientIssuesNoRequests) { 875116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 876116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true /* should_coalesce */); 877116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 879116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, true); 880116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::COALESCED, 881116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 882116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 884116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 885116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 886116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/req", net::IDLE)); 887116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 888116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(high->started()); 889116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(request->started()); 890116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 891116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId, 892116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId); 893116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(high->started()); 894116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 895116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> after( 896116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/after", net::HIGHEST)); 897116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(after->started()); 898116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 899116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 900116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, CoalescedSpdyProxyWaits) { 901116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 902116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true /* should_coalesce */); 903116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 904116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 905116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, true); 906116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::COALESCED, 907116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 908116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 909116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 910116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 911116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 912116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/req", net::IDLE)); 913116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 914116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(request->started()); 915116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 916116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId, 917116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId); 918116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(request->started()); 919116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 920116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> after( 921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/after", net::IDLE)); 922116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(after->started()); 923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 925116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, ThrottledNonHTTPSchedulesImmediately) { 926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Dummies to enforce scheduling. 930116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 932116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low( 933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/low", net::LOWEST)); 934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 935116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("chrome-extension://req", net::LOWEST)); 937116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 938116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(low->started()); 939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 941116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, CoalescedNonHTTPSchedulesImmediately) { 942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 943116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true /* should_coalesce */); 944116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 945116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 946116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, true); 947116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::COALESCED, 948116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 949116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 950116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Dummies to enforce scheduling. 951116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 952116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 953116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low( 954116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/low", net::LOWEST)); 955116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 956116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 957116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("chrome-extension://req", net::LOWEST)); 958116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 959116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(low->started()); 960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 961116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 962116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, ThrottledSyncSchedulesImmediately) { 963116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 965116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Dummies to enforce scheduling. 967116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 968116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 969116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low( 970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/low", net::LOWEST)); 971116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 972116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 973116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundSyncRequest("http://host/req", net::LOWEST)); 974116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(low->started()); 976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 977116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 978116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, CoalescedSyncSchedulesImmediately) { 979116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 980116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true /* should_coalesce */); 981116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 982116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 983116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, true); 984116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::COALESCED, 985116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 986116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 987116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Dummies to enforce scheduling. 988116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 989116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 990116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low( 991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/low", net::LOWEST)); 992116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 993116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> request( 994116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundSyncRequest("http://host/req", net::LOWEST)); 995116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(request->started()); 996116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(low->started()); 997116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(high->started()); 998116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 999116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1000116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, AllBackgroundClientsUnthrottle) { 1001116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 1004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1006116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1007116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1008116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1011116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 1012116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1013116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 1020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1021116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1022116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); 1027116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1028116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1030116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1032116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 1034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, true); 1036116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1043116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, 1044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnloadedClientVisibilityChangedCorrectlyUnthrottles) { 1045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1046116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1047116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, false); 10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); 1051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible, 3 hidden 1055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 visible, 2 hidden 1068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); 1069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1072116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1075116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1076116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1077116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible, 3 hidden 1082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false); 1083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1090116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1093116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1094116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1095116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1096116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1097116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1098116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1099116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, 1100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnloadedClientAudibilityChangedCorrectlyUnthrottles) { 1101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 11041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, false); 11051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 1109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); 1110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 audible, 3 hidden 1112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 audible, 2 hidden 1125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); 1126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 audible, 3 hidden 1139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false); 1140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1156116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, 1157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LoadedClientVisibilityChangedCorrectlyUnthrottles) { 1158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 11611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, false); 11621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); 1164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible, 3 hidden 1167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 visible, 2 hidden 1180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); 1181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible, 3 hidden 1194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false); 1195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1211116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, 1212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LoadedClientAudibilityChangedCorrectlyUnthrottles) { 1213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 12161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, false); 12171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); 1219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 1222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); 1223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 audible, 3 hidden 1224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 audible, 2 hidden 1237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); 1238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 audible, 3 hidden 1251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false); 1252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1268116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, UnloadedClientBecomesHiddenCorrectlyUnthrottles) { 1269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 12721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, true); 12731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 visible, 2 hidden 1278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible, 3 hidden 1291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false); 1292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 0 visible, 4 hidden 1305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 1306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible, 3 hidden 1319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, true); 1320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1336116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, UnloadedClientBecomesSilentCorrectlyUnthrottles) { 1337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, false); 13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); 1345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 1346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); 1347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 audible, 2 hidden 1348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 audible, 3 hidden 1361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false); 1362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 0 audible, 4 hidden 1375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, false); 1376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 audible, 3 hidden 1389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); 1390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1406116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, LoadedClientBecomesHiddenCorrectlyThrottles) { 1407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, true); 14111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); 1415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 visible, 2 hidden 1416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible, 3 hidden 1429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false); 1430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 0 visible, 4 hidden 1443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 1444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible, 3 hidden 1457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); 1458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1474116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, LoadedClientBecomesSilentCorrectlyThrottles) { 1475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 14781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, false); 14791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); 1483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 1484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); 1485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); 1486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 audible, 2 hidden 1487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 audible, 3 hidden 1500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false); 1501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 0 audible, 4 hidden 1514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId, kRouteId, false); 1515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 audible, 3 hidden 1528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); 1529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1545116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, HiddenLoadedChangesCorrectlyStayThrottled) { 1546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 15491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, true); 15501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible and 2 hidden loading, 1 visible loaded 1553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 1554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1564116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded 1567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible loading, 1 visible and 2 hidden loaded 1582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId, kBackgroundRouteId, true); 1584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded 1597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1615116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, PartialVisibleClientLoadedDoesNotUnthrottle) { 1616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 16191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, true); 16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1621116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 visible loading, 1 hidden loading, 1 hidden loaded 1623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading 1638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 1639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 visible loading, 1 hidden loading, 1 hidden loaded 1652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); 1653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1669116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, FullVisibleLoadedCorrectlyUnthrottle) { 1670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 16731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, true); 16741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading 1677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); 1680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1681116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1685116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1686116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1687116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1688116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1689116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1690116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> high( 1693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/high", net::HIGHEST)); 1694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TestRequest> low( 1695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NewBackgroundRequest("http://host/low", net::LOWEST)); 1696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(high->started()); 1698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(low->started()); 1699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 2 visible loaded, 1 hidden loading, 1 hidden loaded 1701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 1702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1707116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // kBackgroundClientId unthrottling should unthrottle it's request. 1714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(low->started()); 1715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading 1717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); 1718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1732116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1734116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceSchedulerTest, 1735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ActiveAndLoadingClientDeletedCorrectlyUnthrottle) { 1736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): remove when throttling and coalescing have both landed 1737116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 1738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* should_coalesce */); 17391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kChildId2, kRouteId2, true); 17401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 1741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading 1743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged( 1744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundChildId2, kBackgroundRouteId2, true); 1745116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 1746116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1747116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1751116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1752116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1755116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1756116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); 1757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible loaded, 1 hidden loading, 1 hidden loaded 1759116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kChildId2, kRouteId2); 1760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(scheduler_.active_clients_loaded()); 1761116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1762116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1763116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 1768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading 1771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); 1772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(scheduler_.active_clients_loaded()); 1773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId, 1775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId)); 1776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::THROTTLED, 1777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kBackgroundChildId2, 1778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundRouteId2)); 1779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 1780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 1781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 1783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, CoalescedClientCreationStartsTimer) { 17865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 17875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 17885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 17895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 17905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 17915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 17925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 17935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 17945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 17955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 17965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 17975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 17985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 17995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, ActiveLoadingClientLoadedAndHiddenStartsTimer) { 18005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 18015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 18025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 18045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 18055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::THROTTLED, 18065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 18115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 18125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 18135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 18145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 18195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 18205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 18215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 18225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 18255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 18265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, ActiveLoadingClientHiddenAndLoadedStartsTimer) { 18285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 18295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 18305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 18315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 18325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::THROTTLED, 18335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); 18385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 18395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 18405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 18435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 18445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 18475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kChildId, kRouteId)); 18485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 18495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 18525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 18535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, CoalescedClientBecomesAudibleStopsTimer) { 18555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 18565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 18575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 18585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 18605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 18615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 18625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 18655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnAudibilityChanged(kBackgroundChildId, kBackgroundRouteId, true); 18675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 18685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 18725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LastCoalescedClientDeletionStopsTimer) { 18745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 18755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 18761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 18775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 18795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 18815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 18825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 18835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 18845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 18855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 18865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId2, kBackgroundRouteId2, true); 18875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 18885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId2, 18895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId2)); 18905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 18915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnClientDeleted(kBackgroundChildId, kBackgroundRouteId); 18935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 18945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 18965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 18975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // To avoid errors on test tear down. 18991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId, kBackgroundRouteId, false); 19005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 19015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LastCoalescedClientStartsLoadingStopsTimer) { 19035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 19045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 19051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 19065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 19085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 19115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 19125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 19135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 19145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId2, kBackgroundRouteId2, true); 19165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 19175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId2, 19185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId2)); 19195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 19205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, false); 19235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 19245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId2, kBackgroundRouteId2, false); 19275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This is needed to avoid errors on test tear down. 19305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 19315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 19325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, LastCoalescedClientBecomesVisibleStopsTimer) { 19345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 19355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 19361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false); 19375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 19395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 19425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 19435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 19445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 19455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId2, kBackgroundRouteId2, true); 19475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 19485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId2, 19495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId2)); 19505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 19515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnVisibilityChanged(kBackgroundChildId, kBackgroundRouteId, true); 19535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 19545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnVisibilityChanged( 19565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId2, kBackgroundRouteId2, true); 19575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // To avoid errors on test tear down. 19605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); 19615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 19625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, 19645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CoalescedClientBecomesLoadingAndVisibleStopsTimer) { 19655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 19665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 19675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 19685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 19715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 19725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 19735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 19745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(mock_timer_->IsRunning()); 19755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, false); 19785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::UNTHROTTLED, 19795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 19805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 19815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnVisibilityChanged(kBackgroundChildId, kBackgroundRouteId, true); 19845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, 19855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 19865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 19875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(mock_timer_->IsRunning()); 19885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 19895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 19905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, CoalescedRequestsIssueOnTimer) { 19915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 19925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 19935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 19945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 19955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 19965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 19975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 19985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 19995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(scheduler_.active_clients_loaded()); 20005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> high( 20025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/high", net::HIGHEST)); 20035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> low( 20045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/low", net::LOWEST)); 20055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(high->started()); 20065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low->started()); 20075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FireCoalescingTimer(); 20095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(high->started()); 20115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(low->started()); 20125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 20135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, CoalescedRequestsUnthrottleCorrectlyOnTimer) { 20155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 20165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 20175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 20185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 20195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 20205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 20215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 20225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 20235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(scheduler_.active_clients_loaded()); 20245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> high( 20265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/high", net::HIGHEST)); 20275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> high2( 20285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/high", net::HIGHEST)); 20295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> high3( 20305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/high", net::HIGHEST)); 20315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> high4( 20325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/high", net::HIGHEST)); 20335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> low( 20345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/low", net::LOWEST)); 20355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> low2( 20365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/low", net::LOWEST)); 20375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> low3( 20385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/low", net::LOWEST)); 20395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> low4( 20405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/low", net::LOWEST)); 20415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) http_server_properties_.SetSupportsSpdy(net::HostPortPair("spdyhost", 443), 20435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true); 20445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> low_spdy( 20455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("https://spdyhost/low", net::LOW)); 20465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> sync_request( 20475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundSyncRequest("http://host/req", net::LOW)); 20485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> non_http_request( 20495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("chrome-extension://req", net::LOW)); 20505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Sync requests should issue immediately. 20525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(sync_request->started()); 20535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Non-http(s) requests should issue immediately. 20545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(non_http_request->started()); 20555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Nothing else should issue without a timer fire. 20565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(high->started()); 20575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(high2->started()); 20585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(high3->started()); 20595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(high4->started()); 20605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low->started()); 20615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low2->started()); 20625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low3->started()); 20635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low4->started()); 20645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low_spdy->started()); 20655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FireCoalescingTimer(); 20675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // All high priority requests should issue. 20695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(high->started()); 20705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(high2->started()); 20715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(high3->started()); 20725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(high4->started()); 20735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // There should only be one net::LOWEST priority request issued with 20745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // non-delayable requests in flight. 20755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(low->started()); 20765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low2->started()); 20775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low3->started()); 20785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low4->started()); 20795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Spdy-Enable requests should issue regardless of priority. 20805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(low_spdy->started()); 20815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 20825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ResourceSchedulerTest, CoalescedRequestsWaitForNextTimer) { 20845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, 20855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* should_coalesce */); 20865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); 20875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.OnLoadingStateChanged( 20885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundChildId, kBackgroundRouteId, true); 20895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ResourceScheduler::COALESCED, 20915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler_.GetClientStateForTesting(kBackgroundChildId, 20925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kBackgroundRouteId)); 20935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(scheduler_.active_clients_loaded()); 20945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> high( 20965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/high", net::HIGHEST)); 20975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(high->started()); 20985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FireCoalescingTimer(); 21005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 21015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> high2( 21025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/high2", net::HIGHEST)); 21035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestRequest> low( 21045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NewBackgroundRequest("http://host/low", net::LOWEST)); 21055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 21065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(high->started()); 21075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(high2->started()); 21085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(low->started()); 21095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 21105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FireCoalescingTimer(); 21115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 21125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(high->started()); 21135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(high2->started()); 21145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(low->started()); 21155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 21165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 21171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourceSchedulerTest, GetVisualSignalFromRenderViewHost) { 21181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<MockRenderProcessHostFactory> render_process_host_factory; 21191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<TestBrowserContext> browser_context; 21201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<TestWebContents> web_contents_1; 21211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<TestWebContents> web_contents_2; 21221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_process_host_factory.reset(new MockRenderProcessHostFactory()); 21241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_context.reset(new TestBrowserContext()); 21251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<SiteInstance> site_instance_1 = 21261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SiteInstance::Create(browser_context.get()); 21271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<SiteInstance> site_instance_2 = 21281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SiteInstance::Create(browser_context.get()); 21291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SiteInstanceImpl::set_render_process_host_factory( 21301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_process_host_factory.get()); 21311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents_1.reset( 21331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWebContents::Create(browser_context.get(), site_instance_1.get())); 21341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents_2.reset( 21351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestWebContents::Create(browser_context.get(), site_instance_2.get())); 21361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 21371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderViewHostImpl* rvh1 = web_contents_1->GetRenderViewHost(); 21391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderViewHostImpl* rvh2 = web_contents_2->GetRenderViewHost(); 21401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourceScheduler* scheduler = ResourceDispatcherHostImpl::Get()->scheduler(); 21411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check initial visibility is set correctly. 21431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(), 21441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh1->GetRoutingID()), 21451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !rvh1->is_hidden()); 21461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(), 21471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh1->GetRoutingID()), 21481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !rvh2->is_hidden()); 21491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 1 visible, 1 hidden 21511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh1->WasShown(ui::LatencyInfo()); 21521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh2->WasHidden(); 21531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 21541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(), 21561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh1->GetRoutingID())); 21571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(), 21581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh2->GetRoutingID())); 21591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Flip the visibility and check again. 21611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh1->WasHidden(); 21621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh2->WasShown(ui::LatencyInfo()); 21631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 21641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(), 21661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh1->GetRoutingID())); 21671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(), 21681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rvh2->GetRoutingID())); 21691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Clean up. 21701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents_1.reset(); 21711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents_2.reset(); 21721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 21731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_context.reset(); 21751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_process_host_factory.reset(); 21761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 21771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // unnamed namespace 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 2181