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