1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/loader/resource_scheduler.h"
7 #include "base/memory/scoped_vector.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/run_loop.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "base/timer/mock_timer.h"
12 #include "base/timer/timer.h"
13 #include "content/browser/browser_thread_impl.h"
14 #include "content/browser/loader/resource_dispatcher_host_impl.h"
15 #include "content/browser/loader/resource_message_filter.h"
16 #include "content/browser/loader/resource_request_info_impl.h"
17 #include "content/common/resource_messages.h"
18 #include "content/public/browser/resource_context.h"
19 #include "content/public/browser/resource_controller.h"
20 #include "content/public/browser/resource_throttle.h"
21 #include "content/public/common/process_type.h"
22 #include "content/public/common/resource_type.h"
23 #include "content/public/test/mock_render_process_host.h"
24 #include "content/public/test/test_browser_context.h"
25 #include "content/test/test_web_contents.h"
26 #include "net/base/host_port_pair.h"
27 #include "net/base/request_priority.h"
28 #include "net/http/http_server_properties_impl.h"
29 #include "net/url_request/url_request.h"
30 #include "net/url_request/url_request_test_util.h"
31 #include "testing/gtest/include/gtest/gtest.h"
32 #include "ui/events/latency_info.h"
38 class TestRequestFactory;
40 const int kChildId = 30;
41 const int kRouteId = 75;
42 const int kChildId2 = 43;
43 const int kRouteId2 = 67;
44 const int kBackgroundChildId = 35;
45 const int kBackgroundRouteId = 43;
46 const int kBackgroundChildId2 = 54;
47 const int kBackgroundRouteId2 = 82;
49 class TestRequest : public ResourceController {
51 TestRequest(scoped_ptr<ResourceThrottle> throttle,
52 scoped_ptr<net::URLRequest> url_request)
54 throttle_(throttle.Pass()),
55 url_request_(url_request.Pass()) {
56 throttle_->set_controller_for_testing(this);
58 virtual ~TestRequest() {}
60 bool started() const { return started_; }
63 bool deferred = false;
64 throttle_->WillStartRequest(&deferred);
68 virtual void Cancel() OVERRIDE {
69 // Alert the scheduler that the request can be deleted.
73 const net::URLRequest* url_request() const { return url_request_.get(); }
76 // ResourceController interface:
77 virtual void CancelAndIgnore() OVERRIDE {}
78 virtual void CancelWithError(int error_code) OVERRIDE {}
79 virtual void Resume() OVERRIDE { started_ = true; }
83 scoped_ptr<ResourceThrottle> throttle_;
84 scoped_ptr<net::URLRequest> url_request_;
87 class CancelingTestRequest : public TestRequest {
89 CancelingTestRequest(scoped_ptr<ResourceThrottle> throttle,
90 scoped_ptr<net::URLRequest> url_request)
91 : TestRequest(throttle.Pass(), url_request.Pass()) {}
93 void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) {
94 request_to_cancel_ = request_to_cancel.Pass();
98 virtual void Resume() OVERRIDE {
99 TestRequest::Resume();
100 request_to_cancel_.reset();
103 scoped_ptr<TestRequest> request_to_cancel_;
106 class FakeResourceContext : public ResourceContext {
108 virtual net::HostResolver* GetHostResolver() OVERRIDE { return NULL; }
109 virtual net::URLRequestContext* GetRequestContext() OVERRIDE { return NULL; }
112 class FakeResourceMessageFilter : public ResourceMessageFilter {
114 FakeResourceMessageFilter(int child_id)
115 : ResourceMessageFilter(
117 PROCESS_TYPE_RENDERER,
118 NULL /* appcache_service */,
119 NULL /* blob_storage_context */,
120 NULL /* file_system_context */,
121 NULL /* service_worker_context */,
122 base::Bind(&FakeResourceMessageFilter::GetContexts,
123 base::Unretained(this))) {
127 virtual ~FakeResourceMessageFilter() {}
129 void GetContexts(const ResourceHostMsg_Request& request,
130 ResourceContext** resource_context,
131 net::URLRequestContext** request_context) {
132 *resource_context = &context_;
133 *request_context = NULL;
136 FakeResourceContext context_;
139 class ResourceSchedulerTest : public testing::Test {
141 ResourceSchedulerTest()
142 : next_request_id_(0),
143 ui_thread_(BrowserThread::UI, &message_loop_),
144 io_thread_(BrowserThread::IO, &message_loop_),
145 mock_timer_(new base::MockTimer(true, true)) {
146 scheduler_.set_timer_for_testing(scoped_ptr<base::Timer>(mock_timer_));
148 // TODO(aiolos): Remove when throttling and coalescing have both landed.
149 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
150 false /* should_coalesce */);
152 scheduler_.OnClientCreated(kChildId, kRouteId, true);
153 scheduler_.OnClientCreated(kBackgroundChildId, kBackgroundRouteId, false);
154 context_.set_http_server_properties(http_server_properties_.GetWeakPtr());
157 virtual ~ResourceSchedulerTest() {
158 scheduler_.OnClientDeleted(kChildId, kRouteId);
159 scheduler_.OnClientDeleted(kBackgroundChildId, kBackgroundRouteId);
162 scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute(
164 net::RequestPriority priority,
168 scoped_ptr<net::URLRequest> url_request(
169 context_.CreateRequest(GURL(url), priority, NULL, NULL));
170 ResourceRequestInfoImpl* info = new ResourceRequestInfoImpl(
171 PROCESS_TYPE_RENDERER, // process_type
172 child_id, // child_id
173 route_id, // route_id
175 ++next_request_id_, // request_id
176 MSG_ROUTING_NONE, // render_frame_id
177 false, // is_main_frame
178 false, // parent_is_main_frame
179 0, // parent_render_frame_id
180 RESOURCE_TYPE_SUB_RESOURCE, // resource_type
181 ui::PAGE_TRANSITION_LINK, // transition_type
182 false, // should_replace_current_entry
183 false, // is_download
185 true, // allow_download
186 false, // has_user_gesture
187 false, // enable_load_timing
188 blink::WebReferrerPolicyDefault, // referrer_policy
189 blink::WebPageVisibilityStateVisible, // visibility_state
191 base::WeakPtr<ResourceMessageFilter>(), // filter
192 is_async); // is_async
193 info->AssociateWithRequest(url_request.get());
194 return url_request.Pass();
197 scoped_ptr<net::URLRequest> NewURLRequest(const char* url,
198 net::RequestPriority priority) {
199 return NewURLRequestWithChildAndRoute(
200 url, priority, kChildId, kRouteId, true);
203 TestRequest* NewRequestWithRoute(const char* url,
204 net::RequestPriority priority,
206 return NewRequestWithChildAndRoute(url, priority, route_id, kChildId);
209 TestRequest* NewRequestWithChildAndRoute(const char* url,
210 net::RequestPriority priority,
213 return GetNewTestRequest(url, priority, child_id, route_id, true);
216 TestRequest* NewRequest(const char* url, net::RequestPriority priority) {
217 return NewRequestWithChildAndRoute(url, priority, kChildId, kRouteId);
220 TestRequest* NewBackgroundRequest(const char* url,
221 net::RequestPriority priority) {
222 return NewRequestWithChildAndRoute(
223 url, priority, kBackgroundChildId, kBackgroundRouteId);
226 TestRequest* NewSyncRequest(const char* url, net::RequestPriority priority) {
227 return NewSyncRequestWithChildAndRoute(url, priority, kChildId, kRouteId);
230 TestRequest* NewBackgroundSyncRequest(const char* url,
231 net::RequestPriority priority) {
232 return NewSyncRequestWithChildAndRoute(
233 url, priority, kBackgroundChildId, kBackgroundRouteId);
236 TestRequest* NewSyncRequestWithChildAndRoute(const char* url,
237 net::RequestPriority priority,
240 return GetNewTestRequest(url, priority, child_id, route_id, false);
243 TestRequest* GetNewTestRequest(const char* url,
244 net::RequestPriority priority,
248 scoped_ptr<net::URLRequest> url_request(NewURLRequestWithChildAndRoute(
249 url, priority, child_id, route_id, is_async));
250 scoped_ptr<ResourceThrottle> throttle(
251 scheduler_.ScheduleRequest(child_id, route_id, url_request.get()));
252 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass());
258 void ChangeRequestPriority(TestRequest* request,
259 net::RequestPriority new_priority,
260 int intra_priority = 0) {
261 scoped_refptr<FakeResourceMessageFilter> filter(
262 new FakeResourceMessageFilter(kChildId));
263 const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(
264 request->url_request());
265 const GlobalRequestID& id = info->GetGlobalRequestID();
266 ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority,
268 rdh_.OnMessageReceived(msg, filter.get());
271 void FireCoalescingTimer() {
272 EXPECT_TRUE(mock_timer_->IsRunning());
276 int next_request_id_;
277 base::MessageLoopForIO message_loop_;
278 BrowserThreadImpl ui_thread_;
279 BrowserThreadImpl io_thread_;
280 ResourceDispatcherHostImpl rdh_;
281 ResourceScheduler scheduler_;
282 base::MockTimer* mock_timer_;
283 net::HttpServerPropertiesImpl http_server_properties_;
284 net::TestURLRequestContext context_;
287 TEST_F(ResourceSchedulerTest, OneIsolatedLowRequest) {
288 scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOWEST));
289 EXPECT_TRUE(request->started());
292 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilIdle) {
293 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
294 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
295 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST));
296 EXPECT_TRUE(high->started());
297 EXPECT_TRUE(low->started());
298 EXPECT_FALSE(low2->started());
300 EXPECT_TRUE(low2->started());
303 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) {
304 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
305 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
306 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST));
307 EXPECT_TRUE(high->started());
308 EXPECT_TRUE(low->started());
309 EXPECT_FALSE(low2->started());
311 scheduler_.OnWillInsertBody(kChildId, kRouteId);
312 EXPECT_TRUE(low2->started());
315 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilCriticalComplete) {
316 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
317 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
318 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST));
319 EXPECT_TRUE(high->started());
320 EXPECT_TRUE(low->started());
321 EXPECT_FALSE(low2->started());
322 scheduler_.OnWillInsertBody(kChildId, kRouteId);
323 EXPECT_FALSE(low2->started());
325 EXPECT_TRUE(low2->started());
328 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) {
329 http_server_properties_.SetSupportsSpdy(
330 net::HostPortPair("spdyhost", 443), true);
331 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
332 scoped_ptr<TestRequest> low_spdy(
333 NewRequest("https://spdyhost/low", net::LOWEST));
334 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
335 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST));
336 EXPECT_TRUE(high->started());
337 EXPECT_TRUE(low_spdy->started());
338 EXPECT_TRUE(low->started());
339 EXPECT_FALSE(low2->started());
340 scheduler_.OnWillInsertBody(kChildId, kRouteId);
342 EXPECT_TRUE(low2->started());
345 TEST_F(ResourceSchedulerTest, NavigationResetsState) {
346 scheduler_.OnWillInsertBody(kChildId, kRouteId);
347 scheduler_.OnNavigate(kChildId, kRouteId);
348 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
349 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
350 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST));
351 EXPECT_TRUE(high->started());
352 EXPECT_TRUE(low->started());
353 EXPECT_FALSE(low2->started());
356 TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) {
357 const int route_id = 0; // Indicates a background request.
358 scoped_ptr<TestRequest> request(NewRequestWithRoute("http://host/1",
359 net::LOWEST, route_id));
360 EXPECT_TRUE(request->started());
363 TEST_F(ResourceSchedulerTest, StartMultipleLowRequestsWhenIdle) {
364 scoped_ptr<TestRequest> high1(NewRequest("http://host/high1", net::HIGHEST));
365 scoped_ptr<TestRequest> high2(NewRequest("http://host/high2", net::HIGHEST));
366 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
367 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST));
368 EXPECT_TRUE(high1->started());
369 EXPECT_TRUE(high2->started());
370 EXPECT_TRUE(low->started());
371 EXPECT_FALSE(low2->started());
373 EXPECT_FALSE(low2->started());
375 EXPECT_TRUE(low2->started());
378 TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) {
379 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
380 scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST));
382 scoped_ptr<net::URLRequest> url_request(
383 NewURLRequest("http://host/low2", net::LOWEST));
384 scoped_ptr<ResourceThrottle> throttle(
385 scheduler_.ScheduleRequest(kChildId, kRouteId, url_request.get()));
386 scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest(
387 throttle.Pass(), url_request.Pass()));
390 scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST));
391 low2->set_request_to_cancel(low3.Pass());
392 scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST));
394 EXPECT_TRUE(high->started());
395 EXPECT_FALSE(low2->started());
397 EXPECT_TRUE(low1->started());
398 EXPECT_TRUE(low2->started());
399 EXPECT_TRUE(low4->started());
402 TEST_F(ResourceSchedulerTest, LimitedNumberOfDelayableRequestsInFlight) {
403 // We only load low priority resources if there's a body.
404 scheduler_.OnWillInsertBody(kChildId, kRouteId);
406 // Throw in one high priority request to make sure that's not a factor.
407 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
408 EXPECT_TRUE(high->started());
410 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc.
411 const int kMaxNumDelayableRequestsPerHost = 6;
412 ScopedVector<TestRequest> lows_singlehost;
413 // Queue up to the per-host limit (we subtract the current high-pri request).
414 for (int i = 0; i < kMaxNumDelayableRequestsPerHost - 1; ++i) {
415 string url = "http://host/low" + base::IntToString(i);
416 lows_singlehost.push_back(NewRequest(url.c_str(), net::LOWEST));
417 EXPECT_TRUE(lows_singlehost[i]->started());
420 scoped_ptr<TestRequest> second_last_singlehost(NewRequest("http://host/last",
422 scoped_ptr<TestRequest> last_singlehost(NewRequest("http://host/s_last",
425 EXPECT_FALSE(second_last_singlehost->started());
427 EXPECT_TRUE(second_last_singlehost->started());
428 EXPECT_FALSE(last_singlehost->started());
429 lows_singlehost.erase(lows_singlehost.begin());
430 EXPECT_TRUE(last_singlehost->started());
432 // Queue more requests from different hosts until we reach the total limit.
433 int expected_slots_left =
434 kMaxNumDelayableRequestsPerClient - kMaxNumDelayableRequestsPerHost;
435 EXPECT_GT(expected_slots_left, 0);
436 ScopedVector<TestRequest> lows_differenthosts;
437 for (int i = 0; i < expected_slots_left; ++i) {
438 string url = "http://host" + base::IntToString(i) + "/low";
439 lows_differenthosts.push_back(NewRequest(url.c_str(), net::LOWEST));
440 EXPECT_TRUE(lows_differenthosts[i]->started());
443 scoped_ptr<TestRequest> last_differenthost(NewRequest("http://host_new/last",
445 EXPECT_FALSE(last_differenthost->started());
448 TEST_F(ResourceSchedulerTest, RaisePriorityAndStart) {
449 // Dummies to enforce scheduling.
450 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
451 scoped_ptr<TestRequest> low(NewRequest("http://host/req", net::LOWEST));
453 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST));
454 EXPECT_FALSE(request->started());
456 ChangeRequestPriority(request.get(), net::HIGHEST);
457 EXPECT_TRUE(request->started());
460 TEST_F(ResourceSchedulerTest, RaisePriorityInQueue) {
461 // Dummies to enforce scheduling.
462 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
463 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
465 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE));
466 scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE));
467 EXPECT_FALSE(request->started());
468 EXPECT_FALSE(idle->started());
470 ChangeRequestPriority(request.get(), net::LOWEST);
471 EXPECT_FALSE(request->started());
472 EXPECT_FALSE(idle->started());
474 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc.
475 ScopedVector<TestRequest> lows;
476 for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) {
477 string url = "http://host/low" + base::IntToString(i);
478 lows.push_back(NewRequest(url.c_str(), net::LOWEST));
481 scheduler_.OnWillInsertBody(kChildId, kRouteId);
484 EXPECT_TRUE(request->started());
485 EXPECT_FALSE(idle->started());
488 TEST_F(ResourceSchedulerTest, LowerPriority) {
489 // Dummies to enforce scheduling.
490 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
491 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
493 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST));
494 scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE));
495 EXPECT_FALSE(request->started());
496 EXPECT_FALSE(idle->started());
498 ChangeRequestPriority(request.get(), net::IDLE);
499 EXPECT_FALSE(request->started());
500 EXPECT_FALSE(idle->started());
502 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc.
503 // 2 fewer filler requests: 1 for the "low" dummy at the start, and 1 for the
504 // one at the end, which will be tested.
505 const int kNumFillerRequests = kMaxNumDelayableRequestsPerClient - 2;
506 ScopedVector<TestRequest> lows;
507 for (int i = 0; i < kNumFillerRequests; ++i) {
508 string url = "http://host" + base::IntToString(i) + "/low";
509 lows.push_back(NewRequest(url.c_str(), net::LOWEST));
512 scheduler_.OnWillInsertBody(kChildId, kRouteId);
515 EXPECT_FALSE(request->started());
516 EXPECT_TRUE(idle->started());
519 TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) {
520 // Dummies to enforce scheduling.
521 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
522 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
524 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST));
525 scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE));
526 EXPECT_FALSE(request->started());
527 EXPECT_FALSE(idle->started());
529 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc.
530 ScopedVector<TestRequest> lows;
531 for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) {
532 string url = "http://host/low" + base::IntToString(i);
533 lows.push_back(NewRequest(url.c_str(), net::LOWEST));
536 ChangeRequestPriority(request.get(), net::IDLE);
537 EXPECT_FALSE(request->started());
538 EXPECT_FALSE(idle->started());
540 ChangeRequestPriority(request.get(), net::LOWEST);
541 EXPECT_FALSE(request->started());
542 EXPECT_FALSE(idle->started());
544 scheduler_.OnWillInsertBody(kChildId, kRouteId);
545 EXPECT_FALSE(request->started());
546 EXPECT_FALSE(idle->started());
549 TEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) {
550 // Dummies to enforce scheduling.
551 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
552 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
554 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc.
555 ScopedVector<TestRequest> lows;
556 for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) {
557 string url = "http://host/low" + base::IntToString(i);
558 lows.push_back(NewRequest(url.c_str(), net::IDLE));
561 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE));
562 EXPECT_FALSE(request->started());
564 ChangeRequestPriority(request.get(), net::IDLE, 1);
565 EXPECT_FALSE(request->started());
567 scheduler_.OnWillInsertBody(kChildId, kRouteId);
569 EXPECT_TRUE(request->started());
572 TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) {
573 // Dummies to enforce scheduling.
574 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
575 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
577 scoped_ptr<TestRequest> request(
578 NewRequest("chrome-extension://req", net::LOWEST));
579 EXPECT_TRUE(request->started());
582 TEST_F(ResourceSchedulerTest, ActiveLoadingSyncSchedulesImmediately) {
583 // TODO(aiolos): remove when throttling and coalescing have both landed
584 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
585 false /* should_coalesce */);
586 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
587 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
588 // Dummies to enforce scheduling.
589 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
590 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
592 scoped_ptr<TestRequest> request(
593 NewSyncRequest("http://host/req", net::LOWEST));
594 EXPECT_TRUE(request->started());
597 TEST_F(ResourceSchedulerTest, UnthrottledSyncSchedulesImmediately) {
598 // TODO(aiolos): remove when throttling and coalescing have both landed
599 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
600 false /* should_coalesce */);
601 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
602 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
603 scheduler_.GetClientStateForTesting(kBackgroundChildId,
604 kBackgroundRouteId));
605 // Dummies to enforce scheduling.
606 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
607 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
609 scoped_ptr<TestRequest> request(
610 NewBackgroundSyncRequest("http://host/req", net::LOWEST));
611 EXPECT_TRUE(request->started());
614 TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) {
615 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
616 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST));
618 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE));
619 EXPECT_FALSE(request->started());
621 scheduler_.OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId);
622 EXPECT_TRUE(request->started());
624 scoped_ptr<TestRequest> after(NewRequest("http://host/after", net::IDLE));
625 EXPECT_TRUE(after->started());
628 TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) {
629 scheduler_.OnWillInsertBody(kChildId, kRouteId);
630 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc.
632 scoped_ptr<TestRequest> low1_spdy(
633 NewRequest("http://spdyhost1:8080/low", net::LOWEST));
634 // Cancel a request after we learn the server supports SPDY.
635 ScopedVector<TestRequest> lows;
636 for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) {
637 string url = "http://host" + base::IntToString(i) + "/low";
638 lows.push_back(NewRequest(url.c_str(), net::LOWEST));
640 scoped_ptr<TestRequest> low1(NewRequest("http://host/low", net::LOWEST));
641 EXPECT_FALSE(low1->started());
642 http_server_properties_.SetSupportsSpdy(
643 net::HostPortPair("spdyhost1", 8080), true);
645 EXPECT_TRUE(low1->started());
648 scoped_ptr<TestRequest> low2_spdy(
649 NewRequest("http://spdyhost2:8080/low", net::IDLE));
650 // Reprioritize a request after we learn the server supports SPDY.
651 EXPECT_TRUE(low2_spdy->started());
652 http_server_properties_.SetSupportsSpdy(
653 net::HostPortPair("spdyhost2", 8080), true);
654 ChangeRequestPriority(low2_spdy.get(), net::LOWEST);
655 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST));
656 EXPECT_TRUE(low2->started());
659 TEST_F(ResourceSchedulerTest, ThrottledClientCreation) {
660 // TODO(aiolos): remove when throttling and coalescing have both landed
661 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
662 false /* should_coalesce */);
663 EXPECT_TRUE(scheduler_.should_throttle());
664 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
666 EXPECT_EQ(ResourceScheduler::THROTTLED,
667 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
668 kBackgroundRouteId2));
669 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
672 TEST_F(ResourceSchedulerTest, ActiveClientThrottleUpdateOnLoadingChange) {
673 // TODO(aiolos): remove when throttling and coalescing have both landed
674 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
675 false /* should_coalesce */);
676 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
677 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
678 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
679 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
680 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
681 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
682 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
683 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
686 TEST_F(ResourceSchedulerTest, CoalesceBackgroundClientOnLoadCompletion) {
687 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
688 true /* should_coalesce */);
689 EXPECT_EQ(ResourceScheduler::THROTTLED,
690 scheduler_.GetClientStateForTesting(kBackgroundChildId,
691 kBackgroundRouteId));
692 scheduler_.OnLoadingStateChanged(
693 kBackgroundChildId, kBackgroundRouteId, true);
694 EXPECT_EQ(ResourceScheduler::THROTTLED,
695 scheduler_.GetClientStateForTesting(kBackgroundChildId,
696 kBackgroundRouteId));
697 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
698 EXPECT_EQ(ResourceScheduler::COALESCED,
699 scheduler_.GetClientStateForTesting(kBackgroundChildId,
700 kBackgroundRouteId));
703 TEST_F(ResourceSchedulerTest, UnthrottleBackgroundClientOnLoadingStarted) {
704 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
705 true /* should_coalesce */);
706 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
707 scheduler_.OnLoadingStateChanged(
708 kBackgroundChildId, kBackgroundRouteId, true);
709 EXPECT_EQ(ResourceScheduler::COALESCED,
710 scheduler_.GetClientStateForTesting(kBackgroundChildId,
711 kBackgroundRouteId));
713 scheduler_.OnLoadingStateChanged(
714 kBackgroundChildId, kBackgroundRouteId, false);
715 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
716 scheduler_.GetClientStateForTesting(kBackgroundChildId,
717 kBackgroundRouteId));
720 TEST_F(ResourceSchedulerTest, OneRequestPerThrottledClient) {
721 // TODO(aiolos): remove when throttling and coalescing have both landed
722 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
723 false /* should_coalesce */);
724 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
725 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
726 EXPECT_EQ(ResourceScheduler::THROTTLED,
727 scheduler_.GetClientStateForTesting(kBackgroundChildId,
728 kBackgroundRouteId));
729 scoped_ptr<TestRequest> high(
730 NewBackgroundRequest("http://host/high", net::HIGHEST));
731 scoped_ptr<TestRequest> request(
732 NewBackgroundRequest("http://host/req", net::IDLE));
734 EXPECT_TRUE(high->started());
735 EXPECT_FALSE(request->started());
738 TEST_F(ResourceSchedulerTest, UnthrottleNewlyVisibleClient) {
739 // TODO(aiolos): remove when throttling and coalescing have both landed
740 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
741 false /* should_coalesce */);
742 EXPECT_EQ(ResourceScheduler::THROTTLED,
743 scheduler_.GetClientStateForTesting(kBackgroundChildId,
744 kBackgroundRouteId));
745 scoped_ptr<TestRequest> high(
746 NewBackgroundRequest("http://host/high", net::HIGHEST));
747 scoped_ptr<TestRequest> request(
748 NewBackgroundRequest("http://host/req", net::IDLE));
749 EXPECT_FALSE(request->started());
751 scheduler_.OnVisibilityChanged(kBackgroundChildId, kBackgroundRouteId, true);
752 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
753 scheduler_.GetClientStateForTesting(kBackgroundChildId,
754 kBackgroundRouteId));
755 EXPECT_TRUE(request->started());
758 TEST_F(ResourceSchedulerTest, UnthrottleNewlyAudibleClient) {
759 // TODO(aiolos): remove when throttling and coalescing have both landed
760 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
761 false /* should_coalesce */);
762 EXPECT_EQ(ResourceScheduler::THROTTLED,
763 scheduler_.GetClientStateForTesting(kBackgroundChildId,
764 kBackgroundRouteId));
765 scoped_ptr<TestRequest> high(
766 NewBackgroundRequest("http://host/high", net::HIGHEST));
767 scoped_ptr<TestRequest> request(
768 NewBackgroundRequest("http://host/req", net::IDLE));
769 EXPECT_FALSE(request->started());
771 scheduler_.OnAudibilityChanged(kBackgroundChildId, kBackgroundRouteId, true);
772 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
773 scheduler_.GetClientStateForTesting(kBackgroundChildId,
774 kBackgroundRouteId));
775 EXPECT_TRUE(request->started());
778 TEST_F(ResourceSchedulerTest, VisibleClientStillUnthrottledOnAudabilityChange) {
779 // TODO(aiolos): remove when throttling and coalescing have both landed
780 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
781 false /* should_coalesce */);
782 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
783 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
784 EXPECT_EQ(ResourceScheduler::THROTTLED,
785 scheduler_.GetClientStateForTesting(kBackgroundChildId,
786 kBackgroundRouteId));
788 scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
789 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
790 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
791 EXPECT_EQ(ResourceScheduler::THROTTLED,
792 scheduler_.GetClientStateForTesting(kBackgroundChildId,
793 kBackgroundRouteId));
795 scheduler_.OnAudibilityChanged(kChildId, kRouteId, false);
796 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
797 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
798 EXPECT_EQ(ResourceScheduler::THROTTLED,
799 scheduler_.GetClientStateForTesting(kBackgroundChildId,
800 kBackgroundRouteId));
803 TEST_F(ResourceSchedulerTest, AudibleClientStillUnthrottledOnVisabilityChange) {
804 // TODO(aiolos): remove when throttling and coalescing have both landed
805 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
806 false /* should_coalesce */);
807 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
808 scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
809 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
810 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
811 EXPECT_EQ(ResourceScheduler::THROTTLED,
812 scheduler_.GetClientStateForTesting(kBackgroundChildId,
813 kBackgroundRouteId));
815 scheduler_.OnVisibilityChanged(kChildId, kRouteId, true);
816 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
817 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
818 EXPECT_EQ(ResourceScheduler::THROTTLED,
819 scheduler_.GetClientStateForTesting(kBackgroundChildId,
820 kBackgroundRouteId));
822 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
823 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
824 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
825 EXPECT_EQ(ResourceScheduler::THROTTLED,
826 scheduler_.GetClientStateForTesting(kBackgroundChildId,
827 kBackgroundRouteId));
830 TEST_F(ResourceSchedulerTest, ThrottledClientStartsNextHighestPriorityRequest) {
831 // TODO(aiolos): remove when throttling and coalescing have both landed
832 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
833 false /* should_coalesce */);
834 scoped_ptr<TestRequest> request(
835 NewBackgroundRequest("http://host/req", net::IDLE));
836 // Lower priority request started first to test request prioritizaton.
837 scoped_ptr<TestRequest> low(
838 NewBackgroundRequest("http://host/high", net::IDLE));
839 scoped_ptr<TestRequest> high(
840 NewBackgroundRequest("http://host/high", net::HIGHEST));
842 EXPECT_FALSE(low->started());
843 EXPECT_FALSE(high->started());
845 // request->CancelRequest();
847 EXPECT_TRUE(high->started());
848 EXPECT_FALSE(low->started());
851 TEST_F(ResourceSchedulerTest, ThrottledSpdyProxySchedulesImmediately) {
852 // TODO(aiolos): remove when throttling and coalescing have both landed
853 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
854 false /* should_coalesce */);
855 EXPECT_EQ(ResourceScheduler::THROTTLED,
856 scheduler_.GetClientStateForTesting(kBackgroundChildId,
857 kBackgroundRouteId));
858 scoped_ptr<TestRequest> high(
859 NewBackgroundRequest("http://host/high", net::HIGHEST));
860 scoped_ptr<TestRequest> request(
861 NewBackgroundRequest("http://host/req", net::IDLE));
863 EXPECT_FALSE(request->started());
865 scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId,
867 EXPECT_TRUE(request->started());
869 scoped_ptr<TestRequest> after(
870 NewBackgroundRequest("http://host/after", net::IDLE));
871 EXPECT_TRUE(after->started());
874 TEST_F(ResourceSchedulerTest, CoalescedClientIssuesNoRequests) {
875 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
876 true /* should_coalesce */);
877 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
878 scheduler_.OnLoadingStateChanged(
879 kBackgroundChildId, kBackgroundRouteId, true);
880 EXPECT_EQ(ResourceScheduler::COALESCED,
881 scheduler_.GetClientStateForTesting(kBackgroundChildId,
882 kBackgroundRouteId));
883 scoped_ptr<TestRequest> high(
884 NewBackgroundRequest("http://host/high", net::HIGHEST));
885 scoped_ptr<TestRequest> request(
886 NewBackgroundRequest("http://host/req", net::IDLE));
888 EXPECT_FALSE(high->started());
889 EXPECT_FALSE(request->started());
891 scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId,
893 EXPECT_FALSE(high->started());
895 scoped_ptr<TestRequest> after(
896 NewBackgroundRequest("http://host/after", net::HIGHEST));
897 EXPECT_FALSE(after->started());
900 TEST_F(ResourceSchedulerTest, CoalescedSpdyProxyWaits) {
901 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
902 true /* should_coalesce */);
903 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
904 scheduler_.OnLoadingStateChanged(
905 kBackgroundChildId, kBackgroundRouteId, true);
906 EXPECT_EQ(ResourceScheduler::COALESCED,
907 scheduler_.GetClientStateForTesting(kBackgroundChildId,
908 kBackgroundRouteId));
909 scoped_ptr<TestRequest> high(
910 NewBackgroundRequest("http://host/high", net::HIGHEST));
911 scoped_ptr<TestRequest> request(
912 NewBackgroundRequest("http://host/req", net::IDLE));
914 EXPECT_FALSE(request->started());
916 scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId,
918 EXPECT_FALSE(request->started());
920 scoped_ptr<TestRequest> after(
921 NewBackgroundRequest("http://host/after", net::IDLE));
922 EXPECT_FALSE(after->started());
925 TEST_F(ResourceSchedulerTest, ThrottledNonHTTPSchedulesImmediately) {
926 // TODO(aiolos): remove when throttling and coalescing have both landed
927 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
928 false /* should_coalesce */);
929 // Dummies to enforce scheduling.
930 scoped_ptr<TestRequest> high(
931 NewBackgroundRequest("http://host/high", net::HIGHEST));
932 scoped_ptr<TestRequest> low(
933 NewBackgroundRequest("http://host/low", net::LOWEST));
935 scoped_ptr<TestRequest> request(
936 NewBackgroundRequest("chrome-extension://req", net::LOWEST));
937 EXPECT_TRUE(request->started());
938 EXPECT_FALSE(low->started());
941 TEST_F(ResourceSchedulerTest, CoalescedNonHTTPSchedulesImmediately) {
942 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
943 true /* should_coalesce */);
944 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
945 scheduler_.OnLoadingStateChanged(
946 kBackgroundChildId, kBackgroundRouteId, true);
947 EXPECT_EQ(ResourceScheduler::COALESCED,
948 scheduler_.GetClientStateForTesting(kBackgroundChildId,
949 kBackgroundRouteId));
950 // Dummies to enforce scheduling.
951 scoped_ptr<TestRequest> high(
952 NewBackgroundRequest("http://host/high", net::HIGHEST));
953 scoped_ptr<TestRequest> low(
954 NewBackgroundRequest("http://host/low", net::LOWEST));
956 scoped_ptr<TestRequest> request(
957 NewBackgroundRequest("chrome-extension://req", net::LOWEST));
958 EXPECT_TRUE(request->started());
959 EXPECT_FALSE(low->started());
962 TEST_F(ResourceSchedulerTest, ThrottledSyncSchedulesImmediately) {
963 // TODO(aiolos): remove when throttling and coalescing have both landed
964 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
965 false /* should_coalesce */);
966 // Dummies to enforce scheduling.
967 scoped_ptr<TestRequest> high(
968 NewBackgroundRequest("http://host/high", net::HIGHEST));
969 scoped_ptr<TestRequest> low(
970 NewBackgroundRequest("http://host/low", net::LOWEST));
972 scoped_ptr<TestRequest> request(
973 NewBackgroundSyncRequest("http://host/req", net::LOWEST));
974 EXPECT_TRUE(request->started());
975 EXPECT_FALSE(low->started());
978 TEST_F(ResourceSchedulerTest, CoalescedSyncSchedulesImmediately) {
979 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
980 true /* should_coalesce */);
981 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
982 scheduler_.OnLoadingStateChanged(
983 kBackgroundChildId, kBackgroundRouteId, true);
984 EXPECT_EQ(ResourceScheduler::COALESCED,
985 scheduler_.GetClientStateForTesting(kBackgroundChildId,
986 kBackgroundRouteId));
987 // Dummies to enforce scheduling.
988 scoped_ptr<TestRequest> high(
989 NewBackgroundRequest("http://host/high", net::HIGHEST));
990 scoped_ptr<TestRequest> low(
991 NewBackgroundRequest("http://host/low", net::LOWEST));
993 scoped_ptr<TestRequest> request(
994 NewBackgroundSyncRequest("http://host/req", net::LOWEST));
995 EXPECT_TRUE(request->started());
996 EXPECT_FALSE(low->started());
997 EXPECT_FALSE(high->started());
1000 TEST_F(ResourceSchedulerTest, AllBackgroundClientsUnthrottle) {
1001 // TODO(aiolos): remove when throttling and coalescing have both landed
1002 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1003 false /* should_coalesce */);
1004 EXPECT_EQ(ResourceScheduler::THROTTLED,
1005 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1006 kBackgroundRouteId));
1007 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1008 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1009 EXPECT_FALSE(scheduler_.active_clients_loaded());
1011 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1012 EXPECT_TRUE(scheduler_.active_clients_loaded());
1013 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1014 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1015 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1016 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1017 kBackgroundRouteId));
1019 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1020 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1021 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1022 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1023 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1024 kBackgroundRouteId));
1026 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
1027 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1028 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1029 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1030 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1031 kBackgroundRouteId));
1033 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1034 scheduler_.OnLoadingStateChanged(
1035 kBackgroundChildId, kBackgroundRouteId, true);
1036 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1037 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1038 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1039 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1040 kBackgroundRouteId));
1043 TEST_F(ResourceSchedulerTest,
1044 UnloadedClientVisibilityChangedCorrectlyUnthrottles) {
1045 // TODO(aiolos): remove when throttling and coalescing have both landed
1046 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1047 false /* should_coalesce */);
1048 scheduler_.OnClientCreated(kChildId2, kRouteId2, false);
1049 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1050 scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
1051 scheduler_.OnLoadingStateChanged(
1052 kBackgroundChildId2, kBackgroundRouteId2, true);
1054 // 1 visible, 3 hidden
1055 EXPECT_FALSE(scheduler_.active_clients_loaded());
1056 EXPECT_EQ(ResourceScheduler::THROTTLED,
1057 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1058 kBackgroundRouteId));
1059 EXPECT_EQ(ResourceScheduler::THROTTLED,
1060 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1061 kBackgroundRouteId2));
1062 EXPECT_EQ(ResourceScheduler::THROTTLED,
1063 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1064 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1065 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1067 // 2 visible, 2 hidden
1068 scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
1069 EXPECT_FALSE(scheduler_.active_clients_loaded());
1070 EXPECT_EQ(ResourceScheduler::THROTTLED,
1071 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1072 kBackgroundRouteId));
1073 EXPECT_EQ(ResourceScheduler::THROTTLED,
1074 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1075 kBackgroundRouteId2));
1076 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1077 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1078 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1079 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1081 // 1 visible, 3 hidden
1082 scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false);
1083 EXPECT_FALSE(scheduler_.active_clients_loaded());
1084 EXPECT_EQ(ResourceScheduler::THROTTLED,
1085 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1086 kBackgroundRouteId));
1087 EXPECT_EQ(ResourceScheduler::THROTTLED,
1088 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1089 kBackgroundRouteId2));
1090 EXPECT_EQ(ResourceScheduler::THROTTLED,
1091 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1092 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1093 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1095 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1096 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1099 TEST_F(ResourceSchedulerTest,
1100 UnloadedClientAudibilityChangedCorrectlyUnthrottles) {
1101 // TODO(aiolos): remove when throttling and coalescing have both landed
1102 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1103 false /* should_coalesce */);
1104 scheduler_.OnClientCreated(kChildId2, kRouteId2, false);
1105 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1106 scheduler_.OnLoadingStateChanged(
1107 kBackgroundChildId2, kBackgroundRouteId2, true);
1108 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1109 scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
1111 // 1 audible, 3 hidden
1112 EXPECT_FALSE(scheduler_.active_clients_loaded());
1113 EXPECT_EQ(ResourceScheduler::THROTTLED,
1114 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1115 kBackgroundRouteId));
1116 EXPECT_EQ(ResourceScheduler::THROTTLED,
1117 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1118 kBackgroundRouteId2));
1119 EXPECT_EQ(ResourceScheduler::THROTTLED,
1120 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1121 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1122 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1124 // 2 audible, 2 hidden
1125 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
1126 EXPECT_FALSE(scheduler_.active_clients_loaded());
1127 EXPECT_EQ(ResourceScheduler::THROTTLED,
1128 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1129 kBackgroundRouteId));
1130 EXPECT_EQ(ResourceScheduler::THROTTLED,
1131 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1132 kBackgroundRouteId2));
1133 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1134 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1135 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1136 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1138 // 1 audible, 3 hidden
1139 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false);
1140 EXPECT_FALSE(scheduler_.active_clients_loaded());
1141 EXPECT_EQ(ResourceScheduler::THROTTLED,
1142 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1143 kBackgroundRouteId));
1144 EXPECT_EQ(ResourceScheduler::THROTTLED,
1145 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1146 kBackgroundRouteId2));
1147 EXPECT_EQ(ResourceScheduler::THROTTLED,
1148 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1149 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1150 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1152 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1153 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1156 TEST_F(ResourceSchedulerTest,
1157 LoadedClientVisibilityChangedCorrectlyUnthrottles) {
1158 // TODO(aiolos): remove when throttling and coalescing have both landed
1159 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1160 false /* should_coalesce */);
1161 scheduler_.OnClientCreated(kChildId2, kRouteId2, false);
1162 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1163 scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
1164 scheduler_.OnLoadingStateChanged(
1165 kBackgroundChildId2, kBackgroundRouteId2, true);
1166 // 1 visible, 3 hidden
1167 EXPECT_FALSE(scheduler_.active_clients_loaded());
1168 EXPECT_EQ(ResourceScheduler::THROTTLED,
1169 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1170 kBackgroundRouteId));
1171 EXPECT_EQ(ResourceScheduler::THROTTLED,
1172 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1173 kBackgroundRouteId2));
1174 EXPECT_EQ(ResourceScheduler::THROTTLED,
1175 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1176 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1177 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1179 // 2 visible, 2 hidden
1180 scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
1181 EXPECT_FALSE(scheduler_.active_clients_loaded());
1182 EXPECT_EQ(ResourceScheduler::THROTTLED,
1183 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1184 kBackgroundRouteId));
1185 EXPECT_EQ(ResourceScheduler::THROTTLED,
1186 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1187 kBackgroundRouteId2));
1188 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1189 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1190 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1191 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1193 // 1 visible, 3 hidden
1194 scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false);
1195 EXPECT_FALSE(scheduler_.active_clients_loaded());
1196 EXPECT_EQ(ResourceScheduler::THROTTLED,
1197 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1198 kBackgroundRouteId));
1199 EXPECT_EQ(ResourceScheduler::THROTTLED,
1200 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1201 kBackgroundRouteId2));
1202 EXPECT_EQ(ResourceScheduler::THROTTLED,
1203 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1204 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1205 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1207 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1208 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1211 TEST_F(ResourceSchedulerTest,
1212 LoadedClientAudibilityChangedCorrectlyUnthrottles) {
1213 // TODO(aiolos): remove when throttling and coalescing have both landed
1214 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1215 false /* should_coalesce */);
1216 scheduler_.OnClientCreated(kChildId2, kRouteId2, false);
1217 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1218 scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
1219 scheduler_.OnLoadingStateChanged(
1220 kBackgroundChildId2, kBackgroundRouteId2, true);
1221 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1222 scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
1223 // 1 audible, 3 hidden
1224 EXPECT_FALSE(scheduler_.active_clients_loaded());
1225 EXPECT_EQ(ResourceScheduler::THROTTLED,
1226 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1227 kBackgroundRouteId));
1228 EXPECT_EQ(ResourceScheduler::THROTTLED,
1229 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1230 kBackgroundRouteId2));
1231 EXPECT_EQ(ResourceScheduler::THROTTLED,
1232 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1233 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1234 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1236 // 2 audible, 2 hidden
1237 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
1238 EXPECT_FALSE(scheduler_.active_clients_loaded());
1239 EXPECT_EQ(ResourceScheduler::THROTTLED,
1240 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1241 kBackgroundRouteId));
1242 EXPECT_EQ(ResourceScheduler::THROTTLED,
1243 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1244 kBackgroundRouteId2));
1245 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1246 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1247 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1248 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1250 // 1 audible, 3 hidden
1251 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false);
1252 EXPECT_FALSE(scheduler_.active_clients_loaded());
1253 EXPECT_EQ(ResourceScheduler::THROTTLED,
1254 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1255 kBackgroundRouteId));
1256 EXPECT_EQ(ResourceScheduler::THROTTLED,
1257 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1258 kBackgroundRouteId2));
1259 EXPECT_EQ(ResourceScheduler::THROTTLED,
1260 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1261 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1262 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1264 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1265 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1268 TEST_F(ResourceSchedulerTest, UnloadedClientBecomesHiddenCorrectlyUnthrottles) {
1269 // TODO(aiolos): remove when throttling and coalescing have both landed
1270 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1271 false /* should_coalesce */);
1272 scheduler_.OnClientCreated(kChildId2, kRouteId2, true);
1273 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1274 scheduler_.OnLoadingStateChanged(
1275 kBackgroundChildId2, kBackgroundRouteId2, true);
1277 // 2 visible, 2 hidden
1278 EXPECT_FALSE(scheduler_.active_clients_loaded());
1279 EXPECT_EQ(ResourceScheduler::THROTTLED,
1280 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1281 kBackgroundRouteId));
1282 EXPECT_EQ(ResourceScheduler::THROTTLED,
1283 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1284 kBackgroundRouteId2));
1285 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1286 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1287 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1288 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1290 // 1 visible, 3 hidden
1291 scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false);
1292 EXPECT_FALSE(scheduler_.active_clients_loaded());
1293 EXPECT_EQ(ResourceScheduler::THROTTLED,
1294 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1295 kBackgroundRouteId));
1296 EXPECT_EQ(ResourceScheduler::THROTTLED,
1297 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1298 kBackgroundRouteId2));
1299 EXPECT_EQ(ResourceScheduler::THROTTLED,
1300 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1301 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1302 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1304 // 0 visible, 4 hidden
1305 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1306 EXPECT_TRUE(scheduler_.active_clients_loaded());
1307 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1308 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1309 kBackgroundRouteId));
1310 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1311 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1312 kBackgroundRouteId2));
1313 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1314 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1315 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1316 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1318 // 1 visible, 3 hidden
1319 scheduler_.OnVisibilityChanged(kChildId, kRouteId, true);
1320 EXPECT_FALSE(scheduler_.active_clients_loaded());
1321 EXPECT_EQ(ResourceScheduler::THROTTLED,
1322 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1323 kBackgroundRouteId));
1324 EXPECT_EQ(ResourceScheduler::THROTTLED,
1325 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1326 kBackgroundRouteId2));
1327 EXPECT_EQ(ResourceScheduler::THROTTLED,
1328 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1329 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1330 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1332 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1333 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1336 TEST_F(ResourceSchedulerTest, UnloadedClientBecomesSilentCorrectlyUnthrottles) {
1337 // TODO(aiolos): remove when throttling and coalescing have both landed
1338 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1339 false /* should_coalesce */);
1340 scheduler_.OnClientCreated(kChildId2, kRouteId2, false);
1341 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1342 scheduler_.OnLoadingStateChanged(
1343 kBackgroundChildId2, kBackgroundRouteId2, true);
1344 scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
1345 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1346 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
1347 // 2 audible, 2 hidden
1348 EXPECT_FALSE(scheduler_.active_clients_loaded());
1349 EXPECT_EQ(ResourceScheduler::THROTTLED,
1350 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1351 kBackgroundRouteId));
1352 EXPECT_EQ(ResourceScheduler::THROTTLED,
1353 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1354 kBackgroundRouteId2));
1355 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1356 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1357 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1358 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1360 // 1 audible, 3 hidden
1361 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false);
1362 EXPECT_FALSE(scheduler_.active_clients_loaded());
1363 EXPECT_EQ(ResourceScheduler::THROTTLED,
1364 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1365 kBackgroundRouteId));
1366 EXPECT_EQ(ResourceScheduler::THROTTLED,
1367 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1368 kBackgroundRouteId2));
1369 EXPECT_EQ(ResourceScheduler::THROTTLED,
1370 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1371 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1372 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1374 // 0 audible, 4 hidden
1375 scheduler_.OnAudibilityChanged(kChildId, kRouteId, false);
1376 EXPECT_TRUE(scheduler_.active_clients_loaded());
1377 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1378 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1379 kBackgroundRouteId));
1380 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1381 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1382 kBackgroundRouteId2));
1383 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1384 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1385 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1386 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1388 // 1 audible, 3 hidden
1389 scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
1390 EXPECT_FALSE(scheduler_.active_clients_loaded());
1391 EXPECT_EQ(ResourceScheduler::THROTTLED,
1392 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1393 kBackgroundRouteId));
1394 EXPECT_EQ(ResourceScheduler::THROTTLED,
1395 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1396 kBackgroundRouteId2));
1397 EXPECT_EQ(ResourceScheduler::THROTTLED,
1398 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1399 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1400 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1402 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1403 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1406 TEST_F(ResourceSchedulerTest, LoadedClientBecomesHiddenCorrectlyThrottles) {
1407 // TODO(aiolos): remove when throttling and coalescing have both landed
1408 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1409 false /* should_coalesce */);
1410 scheduler_.OnClientCreated(kChildId2, kRouteId2, true);
1411 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1412 scheduler_.OnLoadingStateChanged(
1413 kBackgroundChildId2, kBackgroundRouteId2, true);
1414 scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
1415 // 2 visible, 2 hidden
1416 EXPECT_FALSE(scheduler_.active_clients_loaded());
1417 EXPECT_EQ(ResourceScheduler::THROTTLED,
1418 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1419 kBackgroundRouteId));
1420 EXPECT_EQ(ResourceScheduler::THROTTLED,
1421 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1422 kBackgroundRouteId2));
1423 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1424 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1425 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1426 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1428 // 1 visible, 3 hidden
1429 scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false);
1430 EXPECT_FALSE(scheduler_.active_clients_loaded());
1431 EXPECT_EQ(ResourceScheduler::THROTTLED,
1432 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1433 kBackgroundRouteId));
1434 EXPECT_EQ(ResourceScheduler::THROTTLED,
1435 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1436 kBackgroundRouteId2));
1437 EXPECT_EQ(ResourceScheduler::THROTTLED,
1438 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1439 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1440 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1442 // 0 visible, 4 hidden
1443 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1444 EXPECT_TRUE(scheduler_.active_clients_loaded());
1445 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1446 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1447 kBackgroundRouteId));
1448 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1449 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1450 kBackgroundRouteId2));
1451 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1452 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1453 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1454 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1456 // 1 visible, 3 hidden
1457 scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true);
1458 EXPECT_TRUE(scheduler_.active_clients_loaded());
1459 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1460 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1461 kBackgroundRouteId));
1462 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1463 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1464 kBackgroundRouteId2));
1465 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1466 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1467 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1468 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1470 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1471 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1474 TEST_F(ResourceSchedulerTest, LoadedClientBecomesSilentCorrectlyThrottles) {
1475 // TODO(aiolos): remove when throttling and coalescing have both landed
1476 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1477 false /* should_coalesce */);
1478 scheduler_.OnClientCreated(kChildId2, kRouteId2, false);
1479 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1480 scheduler_.OnLoadingStateChanged(
1481 kBackgroundChildId2, kBackgroundRouteId2, true);
1482 scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
1483 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1484 scheduler_.OnAudibilityChanged(kChildId, kRouteId, true);
1485 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
1486 // 2 audible, 2 hidden
1487 EXPECT_FALSE(scheduler_.active_clients_loaded());
1488 EXPECT_EQ(ResourceScheduler::THROTTLED,
1489 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1490 kBackgroundRouteId));
1491 EXPECT_EQ(ResourceScheduler::THROTTLED,
1492 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1493 kBackgroundRouteId2));
1494 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1495 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1496 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1497 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1499 // 1 audible, 3 hidden
1500 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false);
1501 EXPECT_FALSE(scheduler_.active_clients_loaded());
1502 EXPECT_EQ(ResourceScheduler::THROTTLED,
1503 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1504 kBackgroundRouteId));
1505 EXPECT_EQ(ResourceScheduler::THROTTLED,
1506 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1507 kBackgroundRouteId2));
1508 EXPECT_EQ(ResourceScheduler::THROTTLED,
1509 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1510 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1511 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1513 // 0 audible, 4 hidden
1514 scheduler_.OnAudibilityChanged(kChildId, kRouteId, false);
1515 EXPECT_TRUE(scheduler_.active_clients_loaded());
1516 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1517 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1518 kBackgroundRouteId));
1519 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1520 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1521 kBackgroundRouteId2));
1522 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1523 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1524 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1525 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1527 // 1 audible, 3 hidden
1528 scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true);
1529 EXPECT_TRUE(scheduler_.active_clients_loaded());
1530 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1531 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1532 kBackgroundRouteId));
1533 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1534 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1535 kBackgroundRouteId2));
1536 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1537 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1538 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1539 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1541 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1542 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1545 TEST_F(ResourceSchedulerTest, HiddenLoadedChangesCorrectlyStayThrottled) {
1546 // TODO(aiolos): remove when throttling and coalescing have both landed
1547 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1548 false /* should_coalesce */);
1549 scheduler_.OnClientCreated(kChildId2, kRouteId2, true);
1550 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1552 // 1 visible and 2 hidden loading, 1 visible loaded
1553 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1554 EXPECT_FALSE(scheduler_.active_clients_loaded());
1555 EXPECT_EQ(ResourceScheduler::THROTTLED,
1556 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1557 kBackgroundRouteId));
1558 EXPECT_EQ(ResourceScheduler::THROTTLED,
1559 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1560 kBackgroundRouteId2));
1561 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1562 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1563 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1564 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1566 // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded
1567 scheduler_.OnLoadingStateChanged(
1568 kBackgroundChildId2, kBackgroundRouteId2, true);
1569 EXPECT_FALSE(scheduler_.active_clients_loaded());
1570 EXPECT_EQ(ResourceScheduler::THROTTLED,
1571 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1572 kBackgroundRouteId));
1573 EXPECT_EQ(ResourceScheduler::THROTTLED,
1574 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1575 kBackgroundRouteId2));
1576 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1577 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1578 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1579 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1581 // 1 visible loading, 1 visible and 2 hidden loaded
1582 scheduler_.OnLoadingStateChanged(
1583 kBackgroundChildId, kBackgroundRouteId, true);
1584 EXPECT_FALSE(scheduler_.active_clients_loaded());
1585 EXPECT_EQ(ResourceScheduler::THROTTLED,
1586 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1587 kBackgroundRouteId));
1588 EXPECT_EQ(ResourceScheduler::THROTTLED,
1589 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1590 kBackgroundRouteId2));
1591 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1592 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1593 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1594 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1596 // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded
1597 scheduler_.OnLoadingStateChanged(
1598 kBackgroundChildId2, kBackgroundRouteId2, true);
1599 EXPECT_FALSE(scheduler_.active_clients_loaded());
1600 EXPECT_EQ(ResourceScheduler::THROTTLED,
1601 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1602 kBackgroundRouteId));
1603 EXPECT_EQ(ResourceScheduler::THROTTLED,
1604 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1605 kBackgroundRouteId2));
1606 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1607 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1608 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1609 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1611 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1612 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1615 TEST_F(ResourceSchedulerTest, PartialVisibleClientLoadedDoesNotUnthrottle) {
1616 // TODO(aiolos): remove when throttling and coalescing have both landed
1617 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1618 false /* should_coalesce */);
1619 scheduler_.OnClientCreated(kChildId2, kRouteId2, true);
1620 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1622 // 2 visible loading, 1 hidden loading, 1 hidden loaded
1623 scheduler_.OnLoadingStateChanged(
1624 kBackgroundChildId2, kBackgroundRouteId2, true);
1625 EXPECT_FALSE(scheduler_.active_clients_loaded());
1626 EXPECT_EQ(ResourceScheduler::THROTTLED,
1627 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1628 kBackgroundRouteId));
1629 EXPECT_EQ(ResourceScheduler::THROTTLED,
1630 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1631 kBackgroundRouteId2));
1632 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1633 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1634 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1635 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1637 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1638 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1639 EXPECT_FALSE(scheduler_.active_clients_loaded());
1640 EXPECT_EQ(ResourceScheduler::THROTTLED,
1641 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1642 kBackgroundRouteId));
1643 EXPECT_EQ(ResourceScheduler::THROTTLED,
1644 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1645 kBackgroundRouteId2));
1646 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1647 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1648 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1649 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1651 // 2 visible loading, 1 hidden loading, 1 hidden loaded
1652 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
1653 EXPECT_FALSE(scheduler_.active_clients_loaded());
1654 EXPECT_EQ(ResourceScheduler::THROTTLED,
1655 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1656 kBackgroundRouteId));
1657 EXPECT_EQ(ResourceScheduler::THROTTLED,
1658 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1659 kBackgroundRouteId2));
1660 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1661 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1662 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1663 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1665 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1666 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1669 TEST_F(ResourceSchedulerTest, FullVisibleLoadedCorrectlyUnthrottle) {
1670 // TODO(aiolos): remove when throttling and coalescing have both landed
1671 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1672 false /* should_coalesce */);
1673 scheduler_.OnClientCreated(kChildId2, kRouteId2, true);
1674 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1676 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1677 scheduler_.OnLoadingStateChanged(
1678 kBackgroundChildId2, kBackgroundRouteId2, true);
1679 scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true);
1680 EXPECT_FALSE(scheduler_.active_clients_loaded());
1681 EXPECT_EQ(ResourceScheduler::THROTTLED,
1682 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1683 kBackgroundRouteId));
1684 EXPECT_EQ(ResourceScheduler::THROTTLED,
1685 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1686 kBackgroundRouteId2));
1687 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1688 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1689 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1690 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1692 scoped_ptr<TestRequest> high(
1693 NewBackgroundRequest("http://host/high", net::HIGHEST));
1694 scoped_ptr<TestRequest> low(
1695 NewBackgroundRequest("http://host/low", net::LOWEST));
1697 EXPECT_TRUE(high->started());
1698 EXPECT_FALSE(low->started());
1700 // 2 visible loaded, 1 hidden loading, 1 hidden loaded
1701 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1702 EXPECT_TRUE(scheduler_.active_clients_loaded());
1703 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1704 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1705 kBackgroundRouteId));
1706 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1707 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1708 kBackgroundRouteId2));
1709 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1710 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1711 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1712 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1713 // kBackgroundClientId unthrottling should unthrottle it's request.
1714 EXPECT_TRUE(low->started());
1716 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1717 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
1718 EXPECT_FALSE(scheduler_.active_clients_loaded());
1719 EXPECT_EQ(ResourceScheduler::THROTTLED,
1720 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1721 kBackgroundRouteId));
1722 EXPECT_EQ(ResourceScheduler::THROTTLED,
1723 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1724 kBackgroundRouteId2));
1725 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1726 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1727 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1728 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1730 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1731 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1734 TEST_F(ResourceSchedulerTest,
1735 ActiveAndLoadingClientDeletedCorrectlyUnthrottle) {
1736 // TODO(aiolos): remove when throttling and coalescing have both landed
1737 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1738 false /* should_coalesce */);
1739 scheduler_.OnClientCreated(kChildId2, kRouteId2, true);
1740 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1742 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1743 scheduler_.OnLoadingStateChanged(
1744 kBackgroundChildId2, kBackgroundRouteId2, true);
1745 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1746 EXPECT_FALSE(scheduler_.active_clients_loaded());
1747 EXPECT_EQ(ResourceScheduler::THROTTLED,
1748 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1749 kBackgroundRouteId));
1750 EXPECT_EQ(ResourceScheduler::THROTTLED,
1751 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1752 kBackgroundRouteId2));
1753 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1754 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1755 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1756 scheduler_.GetClientStateForTesting(kChildId2, kRouteId2));
1758 // 1 visible loaded, 1 hidden loading, 1 hidden loaded
1759 scheduler_.OnClientDeleted(kChildId2, kRouteId2);
1760 EXPECT_TRUE(scheduler_.active_clients_loaded());
1761 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1762 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1763 kBackgroundRouteId));
1764 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1765 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1766 kBackgroundRouteId2));
1767 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1768 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1770 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1771 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false);
1772 EXPECT_FALSE(scheduler_.active_clients_loaded());
1773 EXPECT_EQ(ResourceScheduler::THROTTLED,
1774 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1775 kBackgroundRouteId));
1776 EXPECT_EQ(ResourceScheduler::THROTTLED,
1777 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1778 kBackgroundRouteId2));
1779 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1780 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1782 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1785 TEST_F(ResourceSchedulerTest, CoalescedClientCreationStartsTimer) {
1786 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1787 true /* should_coalesce */);
1788 EXPECT_FALSE(mock_timer_->IsRunning());
1789 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1790 EXPECT_FALSE(mock_timer_->IsRunning());
1791 scheduler_.OnLoadingStateChanged(
1792 kBackgroundChildId, kBackgroundRouteId, true);
1793 EXPECT_EQ(ResourceScheduler::COALESCED,
1794 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1795 kBackgroundRouteId));
1796 EXPECT_TRUE(mock_timer_->IsRunning());
1799 TEST_F(ResourceSchedulerTest, ActiveLoadingClientLoadedAndHiddenStartsTimer) {
1800 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1801 true /* should_coalesce */);
1802 EXPECT_FALSE(mock_timer_->IsRunning());
1803 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1804 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1805 EXPECT_EQ(ResourceScheduler::THROTTLED,
1806 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1807 kBackgroundRouteId));
1808 EXPECT_FALSE(mock_timer_->IsRunning());
1810 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1811 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1812 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1813 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1814 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1815 kBackgroundRouteId));
1816 EXPECT_FALSE(mock_timer_->IsRunning());
1818 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1819 EXPECT_EQ(ResourceScheduler::COALESCED,
1820 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1821 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1822 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1823 kBackgroundRouteId));
1824 EXPECT_TRUE(mock_timer_->IsRunning());
1827 TEST_F(ResourceSchedulerTest, ActiveLoadingClientHiddenAndLoadedStartsTimer) {
1828 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1829 true /* should_coalesce */);
1830 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1831 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1832 EXPECT_EQ(ResourceScheduler::THROTTLED,
1833 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1834 kBackgroundRouteId));
1835 EXPECT_FALSE(mock_timer_->IsRunning());
1837 scheduler_.OnVisibilityChanged(kChildId, kRouteId, false);
1838 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1839 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1840 EXPECT_FALSE(mock_timer_->IsRunning());
1842 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1843 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1844 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1845 kBackgroundRouteId));
1846 EXPECT_EQ(ResourceScheduler::COALESCED,
1847 scheduler_.GetClientStateForTesting(kChildId, kRouteId));
1848 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1849 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1850 kBackgroundRouteId));
1851 EXPECT_TRUE(mock_timer_->IsRunning());
1854 TEST_F(ResourceSchedulerTest, CoalescedClientBecomesAudibleStopsTimer) {
1855 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1856 true /* should_coalesce */);
1857 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1858 EXPECT_FALSE(mock_timer_->IsRunning());
1859 scheduler_.OnLoadingStateChanged(
1860 kBackgroundChildId, kBackgroundRouteId, true);
1861 EXPECT_EQ(ResourceScheduler::COALESCED,
1862 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1863 kBackgroundRouteId));
1864 EXPECT_TRUE(mock_timer_->IsRunning());
1866 scheduler_.OnAudibilityChanged(kBackgroundChildId, kBackgroundRouteId, true);
1867 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1868 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1869 kBackgroundRouteId));
1870 EXPECT_FALSE(mock_timer_->IsRunning());
1873 TEST_F(ResourceSchedulerTest, LastCoalescedClientDeletionStopsTimer) {
1874 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1875 true /* should_coalesce */);
1876 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1877 EXPECT_FALSE(mock_timer_->IsRunning());
1878 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1879 EXPECT_FALSE(mock_timer_->IsRunning());
1880 scheduler_.OnLoadingStateChanged(
1881 kBackgroundChildId, kBackgroundRouteId, true);
1882 EXPECT_EQ(ResourceScheduler::COALESCED,
1883 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1884 kBackgroundRouteId));
1885 scheduler_.OnLoadingStateChanged(
1886 kBackgroundChildId2, kBackgroundRouteId2, true);
1887 EXPECT_EQ(ResourceScheduler::COALESCED,
1888 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1889 kBackgroundRouteId2));
1890 EXPECT_TRUE(mock_timer_->IsRunning());
1892 scheduler_.OnClientDeleted(kBackgroundChildId, kBackgroundRouteId);
1893 EXPECT_TRUE(mock_timer_->IsRunning());
1895 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1896 EXPECT_FALSE(mock_timer_->IsRunning());
1898 // To avoid errors on test tear down.
1899 scheduler_.OnClientCreated(kBackgroundChildId, kBackgroundRouteId, false);
1902 TEST_F(ResourceSchedulerTest, LastCoalescedClientStartsLoadingStopsTimer) {
1903 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1904 true /* should_coalesce */);
1905 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1906 EXPECT_FALSE(mock_timer_->IsRunning());
1907 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1908 EXPECT_FALSE(mock_timer_->IsRunning());
1909 scheduler_.OnLoadingStateChanged(
1910 kBackgroundChildId, kBackgroundRouteId, true);
1911 EXPECT_EQ(ResourceScheduler::COALESCED,
1912 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1913 kBackgroundRouteId));
1914 scheduler_.OnLoadingStateChanged(
1915 kBackgroundChildId2, kBackgroundRouteId2, true);
1916 EXPECT_EQ(ResourceScheduler::COALESCED,
1917 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1918 kBackgroundRouteId2));
1919 EXPECT_TRUE(mock_timer_->IsRunning());
1921 scheduler_.OnLoadingStateChanged(
1922 kBackgroundChildId, kBackgroundRouteId, false);
1923 EXPECT_TRUE(mock_timer_->IsRunning());
1925 scheduler_.OnLoadingStateChanged(
1926 kBackgroundChildId2, kBackgroundRouteId2, false);
1927 EXPECT_FALSE(mock_timer_->IsRunning());
1929 // This is needed to avoid errors on test tear down.
1930 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1933 TEST_F(ResourceSchedulerTest, LastCoalescedClientBecomesVisibleStopsTimer) {
1934 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1935 true /* should_coalesce */);
1936 scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2, false);
1937 EXPECT_FALSE(mock_timer_->IsRunning());
1938 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1939 EXPECT_FALSE(mock_timer_->IsRunning());
1940 scheduler_.OnLoadingStateChanged(
1941 kBackgroundChildId, kBackgroundRouteId, true);
1942 EXPECT_EQ(ResourceScheduler::COALESCED,
1943 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1944 kBackgroundRouteId));
1945 scheduler_.OnLoadingStateChanged(
1946 kBackgroundChildId2, kBackgroundRouteId2, true);
1947 EXPECT_EQ(ResourceScheduler::COALESCED,
1948 scheduler_.GetClientStateForTesting(kBackgroundChildId2,
1949 kBackgroundRouteId2));
1950 EXPECT_TRUE(mock_timer_->IsRunning());
1952 scheduler_.OnVisibilityChanged(kBackgroundChildId, kBackgroundRouteId, true);
1953 EXPECT_TRUE(mock_timer_->IsRunning());
1955 scheduler_.OnVisibilityChanged(
1956 kBackgroundChildId2, kBackgroundRouteId2, true);
1957 EXPECT_FALSE(mock_timer_->IsRunning());
1959 // To avoid errors on test tear down.
1960 scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2);
1963 TEST_F(ResourceSchedulerTest,
1964 CoalescedClientBecomesLoadingAndVisibleStopsTimer) {
1965 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1966 true /* should_coalesce */);
1967 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1968 EXPECT_FALSE(mock_timer_->IsRunning());
1969 scheduler_.OnLoadingStateChanged(
1970 kBackgroundChildId, kBackgroundRouteId, true);
1971 EXPECT_EQ(ResourceScheduler::COALESCED,
1972 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1973 kBackgroundRouteId));
1974 EXPECT_TRUE(mock_timer_->IsRunning());
1976 scheduler_.OnLoadingStateChanged(
1977 kBackgroundChildId, kBackgroundRouteId, false);
1978 EXPECT_EQ(ResourceScheduler::UNTHROTTLED,
1979 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1980 kBackgroundRouteId));
1981 EXPECT_FALSE(mock_timer_->IsRunning());
1983 scheduler_.OnVisibilityChanged(kBackgroundChildId, kBackgroundRouteId, true);
1984 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING,
1985 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1986 kBackgroundRouteId));
1987 EXPECT_FALSE(mock_timer_->IsRunning());
1990 TEST_F(ResourceSchedulerTest, CoalescedRequestsIssueOnTimer) {
1991 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
1992 true /* should_coalesce */);
1993 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
1994 scheduler_.OnLoadingStateChanged(
1995 kBackgroundChildId, kBackgroundRouteId, true);
1996 EXPECT_EQ(ResourceScheduler::COALESCED,
1997 scheduler_.GetClientStateForTesting(kBackgroundChildId,
1998 kBackgroundRouteId));
1999 EXPECT_TRUE(scheduler_.active_clients_loaded());
2001 scoped_ptr<TestRequest> high(
2002 NewBackgroundRequest("http://host/high", net::HIGHEST));
2003 scoped_ptr<TestRequest> low(
2004 NewBackgroundRequest("http://host/low", net::LOWEST));
2005 EXPECT_FALSE(high->started());
2006 EXPECT_FALSE(low->started());
2008 FireCoalescingTimer();
2010 EXPECT_TRUE(high->started());
2011 EXPECT_TRUE(low->started());
2014 TEST_F(ResourceSchedulerTest, CoalescedRequestsUnthrottleCorrectlyOnTimer) {
2015 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
2016 true /* should_coalesce */);
2017 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
2018 scheduler_.OnLoadingStateChanged(
2019 kBackgroundChildId, kBackgroundRouteId, true);
2020 EXPECT_EQ(ResourceScheduler::COALESCED,
2021 scheduler_.GetClientStateForTesting(kBackgroundChildId,
2022 kBackgroundRouteId));
2023 EXPECT_TRUE(scheduler_.active_clients_loaded());
2025 scoped_ptr<TestRequest> high(
2026 NewBackgroundRequest("http://host/high", net::HIGHEST));
2027 scoped_ptr<TestRequest> high2(
2028 NewBackgroundRequest("http://host/high", net::HIGHEST));
2029 scoped_ptr<TestRequest> high3(
2030 NewBackgroundRequest("http://host/high", net::HIGHEST));
2031 scoped_ptr<TestRequest> high4(
2032 NewBackgroundRequest("http://host/high", net::HIGHEST));
2033 scoped_ptr<TestRequest> low(
2034 NewBackgroundRequest("http://host/low", net::LOWEST));
2035 scoped_ptr<TestRequest> low2(
2036 NewBackgroundRequest("http://host/low", net::LOWEST));
2037 scoped_ptr<TestRequest> low3(
2038 NewBackgroundRequest("http://host/low", net::LOWEST));
2039 scoped_ptr<TestRequest> low4(
2040 NewBackgroundRequest("http://host/low", net::LOWEST));
2042 http_server_properties_.SetSupportsSpdy(net::HostPortPair("spdyhost", 443),
2044 scoped_ptr<TestRequest> low_spdy(
2045 NewBackgroundRequest("https://spdyhost/low", net::LOW));
2046 scoped_ptr<TestRequest> sync_request(
2047 NewBackgroundSyncRequest("http://host/req", net::LOW));
2048 scoped_ptr<TestRequest> non_http_request(
2049 NewBackgroundRequest("chrome-extension://req", net::LOW));
2051 // Sync requests should issue immediately.
2052 EXPECT_TRUE(sync_request->started());
2053 // Non-http(s) requests should issue immediately.
2054 EXPECT_TRUE(non_http_request->started());
2055 // Nothing else should issue without a timer fire.
2056 EXPECT_FALSE(high->started());
2057 EXPECT_FALSE(high2->started());
2058 EXPECT_FALSE(high3->started());
2059 EXPECT_FALSE(high4->started());
2060 EXPECT_FALSE(low->started());
2061 EXPECT_FALSE(low2->started());
2062 EXPECT_FALSE(low3->started());
2063 EXPECT_FALSE(low4->started());
2064 EXPECT_FALSE(low_spdy->started());
2066 FireCoalescingTimer();
2068 // All high priority requests should issue.
2069 EXPECT_TRUE(high->started());
2070 EXPECT_TRUE(high2->started());
2071 EXPECT_TRUE(high3->started());
2072 EXPECT_TRUE(high4->started());
2073 // There should only be one net::LOWEST priority request issued with
2074 // non-delayable requests in flight.
2075 EXPECT_TRUE(low->started());
2076 EXPECT_FALSE(low2->started());
2077 EXPECT_FALSE(low3->started());
2078 EXPECT_FALSE(low4->started());
2079 // Spdy-Enable requests should issue regardless of priority.
2080 EXPECT_TRUE(low_spdy->started());
2083 TEST_F(ResourceSchedulerTest, CoalescedRequestsWaitForNextTimer) {
2084 scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */,
2085 true /* should_coalesce */);
2086 scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true);
2087 scheduler_.OnLoadingStateChanged(
2088 kBackgroundChildId, kBackgroundRouteId, true);
2090 EXPECT_EQ(ResourceScheduler::COALESCED,
2091 scheduler_.GetClientStateForTesting(kBackgroundChildId,
2092 kBackgroundRouteId));
2093 EXPECT_TRUE(scheduler_.active_clients_loaded());
2095 scoped_ptr<TestRequest> high(
2096 NewBackgroundRequest("http://host/high", net::HIGHEST));
2097 EXPECT_FALSE(high->started());
2099 FireCoalescingTimer();
2101 scoped_ptr<TestRequest> high2(
2102 NewBackgroundRequest("http://host/high2", net::HIGHEST));
2103 scoped_ptr<TestRequest> low(
2104 NewBackgroundRequest("http://host/low", net::LOWEST));
2106 EXPECT_TRUE(high->started());
2107 EXPECT_FALSE(high2->started());
2108 EXPECT_FALSE(low->started());
2110 FireCoalescingTimer();
2112 EXPECT_TRUE(high->started());
2113 EXPECT_TRUE(high2->started());
2114 EXPECT_TRUE(low->started());
2117 TEST_F(ResourceSchedulerTest, GetVisualSignalFromRenderViewHost) {
2118 scoped_ptr<MockRenderProcessHostFactory> render_process_host_factory;
2119 scoped_ptr<TestBrowserContext> browser_context;
2120 scoped_ptr<TestWebContents> web_contents_1;
2121 scoped_ptr<TestWebContents> web_contents_2;
2123 render_process_host_factory.reset(new MockRenderProcessHostFactory());
2124 browser_context.reset(new TestBrowserContext());
2125 scoped_refptr<SiteInstance> site_instance_1 =
2126 SiteInstance::Create(browser_context.get());
2127 scoped_refptr<SiteInstance> site_instance_2 =
2128 SiteInstance::Create(browser_context.get());
2129 SiteInstanceImpl::set_render_process_host_factory(
2130 render_process_host_factory.get());
2132 web_contents_1.reset(
2133 TestWebContents::Create(browser_context.get(), site_instance_1.get()));
2134 web_contents_2.reset(
2135 TestWebContents::Create(browser_context.get(), site_instance_2.get()));
2136 base::RunLoop().RunUntilIdle();
2138 RenderViewHostImpl* rvh1 = web_contents_1->GetRenderViewHost();
2139 RenderViewHostImpl* rvh2 = web_contents_2->GetRenderViewHost();
2140 ResourceScheduler* scheduler = ResourceDispatcherHostImpl::Get()->scheduler();
2142 // Check initial visibility is set correctly.
2143 EXPECT_EQ(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(),
2144 rvh1->GetRoutingID()),
2145 !rvh1->is_hidden());
2146 EXPECT_EQ(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(),
2147 rvh1->GetRoutingID()),
2148 !rvh2->is_hidden());
2150 // 1 visible, 1 hidden
2151 rvh1->WasShown(ui::LatencyInfo());
2153 base::RunLoop().RunUntilIdle();
2155 EXPECT_TRUE(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(),
2156 rvh1->GetRoutingID()));
2157 EXPECT_FALSE(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(),
2158 rvh2->GetRoutingID()));
2160 // Flip the visibility and check again.
2162 rvh2->WasShown(ui::LatencyInfo());
2163 base::RunLoop().RunUntilIdle();
2165 EXPECT_FALSE(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(),
2166 rvh1->GetRoutingID()));
2167 EXPECT_TRUE(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(),
2168 rvh2->GetRoutingID()));
2170 web_contents_1.reset();
2171 web_contents_2.reset();
2172 base::RunLoop().RunUntilIdle();
2174 browser_context.reset();
2175 render_process_host_factory.reset();
2178 } // unnamed namespace
2180 } // namespace content