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_render_view_host_factory.h"
26 #include "content/test/test_web_contents.h"
27 #include "net/base/host_port_pair.h"
28 #include "net/base/request_priority.h"
29 #include "net/http/http_server_properties_impl.h"
30 #include "net/url_request/url_request.h"
31 #include "net/url_request/url_request_test_util.h"
32 #include "testing/gtest/include/gtest/gtest.h"
33 #include "ui/events/latency_info.h"
41 class TestRequestFactory
;
43 const int kChildId
= 30;
44 const int kRouteId
= 75;
45 const int kChildId2
= 43;
46 const int kRouteId2
= 67;
47 const int kBackgroundChildId
= 35;
48 const int kBackgroundRouteId
= 43;
49 const int kBackgroundChildId2
= 54;
50 const int kBackgroundRouteId2
= 82;
52 class TestRequest
: public ResourceController
{
54 TestRequest(scoped_ptr
<ResourceThrottle
> throttle
,
55 scoped_ptr
<net::URLRequest
> url_request
)
57 throttle_(throttle
.Pass()),
58 url_request_(url_request
.Pass()) {
59 throttle_
->set_controller_for_testing(this);
61 ~TestRequest() override
{}
63 bool started() const { return started_
; }
66 bool deferred
= false;
67 throttle_
->WillStartRequest(&deferred
);
71 void Cancel() override
{
72 // Alert the scheduler that the request can be deleted.
76 const net::URLRequest
* url_request() const { return url_request_
.get(); }
79 // ResourceController interface:
80 void CancelAndIgnore() override
{}
81 void CancelWithError(int error_code
) override
{}
82 void Resume() override
{ started_
= true; }
86 scoped_ptr
<ResourceThrottle
> throttle_
;
87 scoped_ptr
<net::URLRequest
> url_request_
;
90 class CancelingTestRequest
: public TestRequest
{
92 CancelingTestRequest(scoped_ptr
<ResourceThrottle
> throttle
,
93 scoped_ptr
<net::URLRequest
> url_request
)
94 : TestRequest(throttle
.Pass(), url_request
.Pass()) {}
96 void set_request_to_cancel(scoped_ptr
<TestRequest
> request_to_cancel
) {
97 request_to_cancel_
= request_to_cancel
.Pass();
101 void Resume() override
{
102 TestRequest::Resume();
103 request_to_cancel_
.reset();
106 scoped_ptr
<TestRequest
> request_to_cancel_
;
109 class FakeResourceContext
: public ResourceContext
{
111 net::HostResolver
* GetHostResolver() override
{ return NULL
; }
112 net::URLRequestContext
* GetRequestContext() override
{ return NULL
; }
115 class FakeResourceMessageFilter
: public ResourceMessageFilter
{
117 FakeResourceMessageFilter(int child_id
)
118 : ResourceMessageFilter(
120 PROCESS_TYPE_RENDERER
,
121 NULL
/* appcache_service */,
122 NULL
/* blob_storage_context */,
123 NULL
/* file_system_context */,
124 NULL
/* service_worker_context */,
125 NULL
/* host_zoom_level_context */,
126 base::Bind(&FakeResourceMessageFilter::GetContexts
,
127 base::Unretained(this))) {
131 ~FakeResourceMessageFilter() override
{}
133 void GetContexts(const ResourceHostMsg_Request
& request
,
134 ResourceContext
** resource_context
,
135 net::URLRequestContext
** request_context
) {
136 *resource_context
= &context_
;
137 *request_context
= NULL
;
140 FakeResourceContext context_
;
143 class ResourceSchedulerTest
: public testing::Test
{
145 ResourceSchedulerTest()
146 : next_request_id_(0),
147 ui_thread_(BrowserThread::UI
, &message_loop_
),
148 io_thread_(BrowserThread::IO
, &message_loop_
),
149 mock_timer_(new base::MockTimer(true, true)) {
150 scheduler_
.set_timer_for_testing(scoped_ptr
<base::Timer
>(mock_timer_
));
152 // TODO(aiolos): Remove when throttling and coalescing have both landed.
153 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
154 false /* should_coalesce */);
156 scheduler_
.OnClientCreated(kChildId
, kRouteId
, true, false);
157 scheduler_
.OnClientCreated(
158 kBackgroundChildId
, kBackgroundRouteId
, false, false);
159 context_
.set_http_server_properties(http_server_properties_
.GetWeakPtr());
162 ~ResourceSchedulerTest() override
{
163 scheduler_
.OnClientDeleted(kChildId
, kRouteId
);
164 scheduler_
.OnClientDeleted(kBackgroundChildId
, kBackgroundRouteId
);
167 scoped_ptr
<net::URLRequest
> NewURLRequestWithChildAndRoute(
169 net::RequestPriority priority
,
173 scoped_ptr
<net::URLRequest
> url_request(
174 context_
.CreateRequest(GURL(url
), priority
, NULL
, NULL
));
175 ResourceRequestInfoImpl
* info
= new ResourceRequestInfoImpl(
176 PROCESS_TYPE_RENDERER
, // process_type
177 child_id
, // child_id
178 route_id
, // route_id
180 ++next_request_id_
, // request_id
181 MSG_ROUTING_NONE
, // render_frame_id
182 false, // is_main_frame
183 false, // parent_is_main_frame
184 0, // parent_render_frame_id
185 RESOURCE_TYPE_SUB_RESOURCE
, // resource_type
186 ui::PAGE_TRANSITION_LINK
, // transition_type
187 false, // should_replace_current_entry
188 false, // is_download
190 true, // allow_download
191 false, // has_user_gesture
192 false, // enable_load_timing
193 false, // enable_upload_progress
194 blink::WebReferrerPolicyDefault
, // referrer_policy
195 blink::WebPageVisibilityStateVisible
, // visibility_state
197 base::WeakPtr
<ResourceMessageFilter
>(), // filter
198 is_async
); // is_async
199 info
->AssociateWithRequest(url_request
.get());
200 return url_request
.Pass();
203 scoped_ptr
<net::URLRequest
> NewURLRequest(const char* url
,
204 net::RequestPriority priority
) {
205 return NewURLRequestWithChildAndRoute(
206 url
, priority
, kChildId
, kRouteId
, true);
209 TestRequest
* NewRequestWithRoute(const char* url
,
210 net::RequestPriority priority
,
212 return NewRequestWithChildAndRoute(url
, priority
, route_id
, kChildId
);
215 TestRequest
* NewRequestWithChildAndRoute(const char* url
,
216 net::RequestPriority priority
,
219 return GetNewTestRequest(url
, priority
, child_id
, route_id
, true);
222 TestRequest
* NewRequest(const char* url
, net::RequestPriority priority
) {
223 return NewRequestWithChildAndRoute(url
, priority
, kChildId
, kRouteId
);
226 TestRequest
* NewBackgroundRequest(const char* url
,
227 net::RequestPriority priority
) {
228 return NewRequestWithChildAndRoute(
229 url
, priority
, kBackgroundChildId
, kBackgroundRouteId
);
232 TestRequest
* NewSyncRequest(const char* url
, net::RequestPriority priority
) {
233 return NewSyncRequestWithChildAndRoute(url
, priority
, kChildId
, kRouteId
);
236 TestRequest
* NewBackgroundSyncRequest(const char* url
,
237 net::RequestPriority priority
) {
238 return NewSyncRequestWithChildAndRoute(
239 url
, priority
, kBackgroundChildId
, kBackgroundRouteId
);
242 TestRequest
* NewSyncRequestWithChildAndRoute(const char* url
,
243 net::RequestPriority priority
,
246 return GetNewTestRequest(url
, priority
, child_id
, route_id
, false);
249 TestRequest
* GetNewTestRequest(const char* url
,
250 net::RequestPriority priority
,
254 scoped_ptr
<net::URLRequest
> url_request(NewURLRequestWithChildAndRoute(
255 url
, priority
, child_id
, route_id
, is_async
));
256 scoped_ptr
<ResourceThrottle
> throttle(
257 scheduler_
.ScheduleRequest(child_id
, route_id
, url_request
.get()));
258 TestRequest
* request
= new TestRequest(throttle
.Pass(), url_request
.Pass());
264 void ChangeRequestPriority(TestRequest
* request
,
265 net::RequestPriority new_priority
,
266 int intra_priority
= 0) {
267 scoped_refptr
<FakeResourceMessageFilter
> filter(
268 new FakeResourceMessageFilter(kChildId
));
269 const ResourceRequestInfoImpl
* info
= ResourceRequestInfoImpl::ForRequest(
270 request
->url_request());
271 const GlobalRequestID
& id
= info
->GetGlobalRequestID();
272 ResourceHostMsg_DidChangePriority
msg(id
.request_id
, new_priority
,
274 rdh_
.OnMessageReceived(msg
, filter
.get());
277 void FireCoalescingTimer() {
278 EXPECT_TRUE(mock_timer_
->IsRunning());
282 int next_request_id_
;
283 base::MessageLoopForIO message_loop_
;
284 BrowserThreadImpl ui_thread_
;
285 BrowserThreadImpl io_thread_
;
286 ResourceDispatcherHostImpl rdh_
;
287 ResourceScheduler scheduler_
;
288 base::MockTimer
* mock_timer_
;
289 net::HttpServerPropertiesImpl http_server_properties_
;
290 net::TestURLRequestContext context_
;
293 TEST_F(ResourceSchedulerTest
, OneIsolatedLowRequest
) {
294 scoped_ptr
<TestRequest
> request(NewRequest("http://host/1", net::LOWEST
));
295 EXPECT_TRUE(request
->started());
298 TEST_F(ResourceSchedulerTest
, OneLowLoadsUntilIdle
) {
299 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
300 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
301 scoped_ptr
<TestRequest
> low2(NewRequest("http://host/low", net::LOWEST
));
302 EXPECT_TRUE(high
->started());
303 EXPECT_TRUE(low
->started());
304 EXPECT_FALSE(low2
->started());
306 EXPECT_TRUE(low2
->started());
309 TEST_F(ResourceSchedulerTest
, OneLowLoadsUntilBodyInserted
) {
310 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
311 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
312 scoped_ptr
<TestRequest
> low2(NewRequest("http://host/low", net::LOWEST
));
313 EXPECT_TRUE(high
->started());
314 EXPECT_TRUE(low
->started());
315 EXPECT_FALSE(low2
->started());
317 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
318 EXPECT_TRUE(low2
->started());
321 TEST_F(ResourceSchedulerTest
, OneLowLoadsUntilCriticalComplete
) {
322 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
323 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
324 scoped_ptr
<TestRequest
> low2(NewRequest("http://host/low", net::LOWEST
));
325 EXPECT_TRUE(high
->started());
326 EXPECT_TRUE(low
->started());
327 EXPECT_FALSE(low2
->started());
328 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
329 EXPECT_FALSE(low2
->started());
331 EXPECT_TRUE(low2
->started());
334 TEST_F(ResourceSchedulerTest
, LowDoesNotBlockCriticalComplete
) {
335 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOW
));
336 scoped_ptr
<TestRequest
> lowest(NewRequest("http://host/lowest", net::LOWEST
));
337 scoped_ptr
<TestRequest
> lowest2(
338 NewRequest("http://host/lowest", net::LOWEST
));
339 EXPECT_TRUE(low
->started());
340 EXPECT_TRUE(lowest
->started());
341 EXPECT_FALSE(lowest2
->started());
342 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
343 EXPECT_TRUE(lowest2
->started());
346 TEST_F(ResourceSchedulerTest
, OneLowLoadsUntilBodyInsertedExceptSpdy
) {
347 http_server_properties_
.SetSupportsSpdy(
348 net::HostPortPair("spdyhost", 443), true);
349 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
350 scoped_ptr
<TestRequest
> low_spdy(
351 NewRequest("https://spdyhost/low", net::LOWEST
));
352 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
353 scoped_ptr
<TestRequest
> low2(NewRequest("http://host/low", net::LOWEST
));
354 EXPECT_TRUE(high
->started());
355 EXPECT_TRUE(low_spdy
->started());
356 EXPECT_TRUE(low
->started());
357 EXPECT_FALSE(low2
->started());
358 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
360 EXPECT_TRUE(low2
->started());
363 TEST_F(ResourceSchedulerTest
, NavigationResetsState
) {
364 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
365 scheduler_
.OnNavigate(kChildId
, kRouteId
);
366 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
367 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
368 scoped_ptr
<TestRequest
> low2(NewRequest("http://host/low", net::LOWEST
));
369 EXPECT_TRUE(high
->started());
370 EXPECT_TRUE(low
->started());
371 EXPECT_FALSE(low2
->started());
374 TEST_F(ResourceSchedulerTest
, BackgroundRequestStartsImmediately
) {
375 const int route_id
= 0; // Indicates a background request.
376 scoped_ptr
<TestRequest
> request(NewRequestWithRoute("http://host/1",
377 net::LOWEST
, route_id
));
378 EXPECT_TRUE(request
->started());
381 TEST_F(ResourceSchedulerTest
, StartMultipleLowRequestsWhenIdle
) {
382 scoped_ptr
<TestRequest
> high1(NewRequest("http://host/high1", net::HIGHEST
));
383 scoped_ptr
<TestRequest
> high2(NewRequest("http://host/high2", net::HIGHEST
));
384 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
385 scoped_ptr
<TestRequest
> low2(NewRequest("http://host/low", net::LOWEST
));
386 EXPECT_TRUE(high1
->started());
387 EXPECT_TRUE(high2
->started());
388 EXPECT_TRUE(low
->started());
389 EXPECT_FALSE(low2
->started());
391 EXPECT_FALSE(low2
->started());
393 EXPECT_TRUE(low2
->started());
396 TEST_F(ResourceSchedulerTest
, CancelOtherRequestsWhileResuming
) {
397 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
398 scoped_ptr
<TestRequest
> low1(NewRequest("http://host/low1", net::LOWEST
));
400 scoped_ptr
<net::URLRequest
> url_request(
401 NewURLRequest("http://host/low2", net::LOWEST
));
402 scoped_ptr
<ResourceThrottle
> throttle(
403 scheduler_
.ScheduleRequest(kChildId
, kRouteId
, url_request
.get()));
404 scoped_ptr
<CancelingTestRequest
> low2(new CancelingTestRequest(
405 throttle
.Pass(), url_request
.Pass()));
408 scoped_ptr
<TestRequest
> low3(NewRequest("http://host/low3", net::LOWEST
));
409 low2
->set_request_to_cancel(low3
.Pass());
410 scoped_ptr
<TestRequest
> low4(NewRequest("http://host/low4", net::LOWEST
));
412 EXPECT_TRUE(high
->started());
413 EXPECT_FALSE(low2
->started());
415 EXPECT_TRUE(low1
->started());
416 EXPECT_TRUE(low2
->started());
417 EXPECT_TRUE(low4
->started());
420 TEST_F(ResourceSchedulerTest
, LimitedNumberOfDelayableRequestsInFlight
) {
421 // We only load low priority resources if there's a body.
422 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
424 // Throw in one high priority request to make sure that's not a factor.
425 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
426 EXPECT_TRUE(high
->started());
428 const int kMaxNumDelayableRequestsPerClient
= 10; // Should match the .cc.
429 const int kMaxNumDelayableRequestsPerHost
= 6;
430 ScopedVector
<TestRequest
> lows_singlehost
;
431 // Queue up to the per-host limit (we subtract the current high-pri request).
432 for (int i
= 0; i
< kMaxNumDelayableRequestsPerHost
- 1; ++i
) {
433 string url
= "http://host/low" + base::IntToString(i
);
434 lows_singlehost
.push_back(NewRequest(url
.c_str(), net::LOWEST
));
435 EXPECT_TRUE(lows_singlehost
[i
]->started());
438 scoped_ptr
<TestRequest
> second_last_singlehost(NewRequest("http://host/last",
440 scoped_ptr
<TestRequest
> last_singlehost(NewRequest("http://host/s_last",
443 EXPECT_FALSE(second_last_singlehost
->started());
445 EXPECT_TRUE(second_last_singlehost
->started());
446 EXPECT_FALSE(last_singlehost
->started());
447 lows_singlehost
.erase(lows_singlehost
.begin());
448 EXPECT_TRUE(last_singlehost
->started());
450 // Queue more requests from different hosts until we reach the total limit.
451 int expected_slots_left
=
452 kMaxNumDelayableRequestsPerClient
- kMaxNumDelayableRequestsPerHost
;
453 EXPECT_GT(expected_slots_left
, 0);
454 ScopedVector
<TestRequest
> lows_differenthosts
;
455 for (int i
= 0; i
< expected_slots_left
; ++i
) {
456 string url
= "http://host" + base::IntToString(i
) + "/low";
457 lows_differenthosts
.push_back(NewRequest(url
.c_str(), net::LOWEST
));
458 EXPECT_TRUE(lows_differenthosts
[i
]->started());
461 scoped_ptr
<TestRequest
> last_differenthost(NewRequest("http://host_new/last",
463 EXPECT_FALSE(last_differenthost
->started());
466 TEST_F(ResourceSchedulerTest
, RaisePriorityAndStart
) {
467 // Dummies to enforce scheduling.
468 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
469 scoped_ptr
<TestRequest
> low(NewRequest("http://host/req", net::LOWEST
));
471 scoped_ptr
<TestRequest
> request(NewRequest("http://host/req", net::LOWEST
));
472 EXPECT_FALSE(request
->started());
474 ChangeRequestPriority(request
.get(), net::HIGHEST
);
475 EXPECT_TRUE(request
->started());
478 TEST_F(ResourceSchedulerTest
, RaisePriorityInQueue
) {
479 // Dummies to enforce scheduling.
480 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
481 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
483 scoped_ptr
<TestRequest
> request(NewRequest("http://host/req", net::IDLE
));
484 scoped_ptr
<TestRequest
> idle(NewRequest("http://host/idle", net::IDLE
));
485 EXPECT_FALSE(request
->started());
486 EXPECT_FALSE(idle
->started());
488 ChangeRequestPriority(request
.get(), net::LOWEST
);
489 EXPECT_FALSE(request
->started());
490 EXPECT_FALSE(idle
->started());
492 const int kMaxNumDelayableRequestsPerClient
= 10; // Should match the .cc.
493 ScopedVector
<TestRequest
> lows
;
494 for (int i
= 0; i
< kMaxNumDelayableRequestsPerClient
- 1; ++i
) {
495 string url
= "http://host/low" + base::IntToString(i
);
496 lows
.push_back(NewRequest(url
.c_str(), net::LOWEST
));
499 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
502 EXPECT_TRUE(request
->started());
503 EXPECT_FALSE(idle
->started());
506 TEST_F(ResourceSchedulerTest
, LowerPriority
) {
507 // Dummies to enforce scheduling.
508 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
509 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
511 scoped_ptr
<TestRequest
> request(NewRequest("http://host/req", net::LOWEST
));
512 scoped_ptr
<TestRequest
> idle(NewRequest("http://host/idle", net::IDLE
));
513 EXPECT_FALSE(request
->started());
514 EXPECT_FALSE(idle
->started());
516 ChangeRequestPriority(request
.get(), net::IDLE
);
517 EXPECT_FALSE(request
->started());
518 EXPECT_FALSE(idle
->started());
520 const int kMaxNumDelayableRequestsPerClient
= 10; // Should match the .cc.
521 // 2 fewer filler requests: 1 for the "low" dummy at the start, and 1 for the
522 // one at the end, which will be tested.
523 const int kNumFillerRequests
= kMaxNumDelayableRequestsPerClient
- 2;
524 ScopedVector
<TestRequest
> lows
;
525 for (int i
= 0; i
< kNumFillerRequests
; ++i
) {
526 string url
= "http://host" + base::IntToString(i
) + "/low";
527 lows
.push_back(NewRequest(url
.c_str(), net::LOWEST
));
530 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
533 EXPECT_FALSE(request
->started());
534 EXPECT_TRUE(idle
->started());
537 TEST_F(ResourceSchedulerTest
, ReprioritizedRequestGoesToBackOfQueue
) {
538 // Dummies to enforce scheduling.
539 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
540 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
542 scoped_ptr
<TestRequest
> request(NewRequest("http://host/req", net::LOWEST
));
543 scoped_ptr
<TestRequest
> idle(NewRequest("http://host/idle", net::IDLE
));
544 EXPECT_FALSE(request
->started());
545 EXPECT_FALSE(idle
->started());
547 const int kMaxNumDelayableRequestsPerClient
= 10; // Should match the .cc.
548 ScopedVector
<TestRequest
> lows
;
549 for (int i
= 0; i
< kMaxNumDelayableRequestsPerClient
; ++i
) {
550 string url
= "http://host/low" + base::IntToString(i
);
551 lows
.push_back(NewRequest(url
.c_str(), net::LOWEST
));
554 ChangeRequestPriority(request
.get(), net::IDLE
);
555 EXPECT_FALSE(request
->started());
556 EXPECT_FALSE(idle
->started());
558 ChangeRequestPriority(request
.get(), net::LOWEST
);
559 EXPECT_FALSE(request
->started());
560 EXPECT_FALSE(idle
->started());
562 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
563 EXPECT_FALSE(request
->started());
564 EXPECT_FALSE(idle
->started());
567 TEST_F(ResourceSchedulerTest
, HigherIntraPriorityGoesToFrontOfQueue
) {
568 // Dummies to enforce scheduling.
569 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
570 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
572 const int kMaxNumDelayableRequestsPerClient
= 10; // Should match the .cc.
573 ScopedVector
<TestRequest
> lows
;
574 for (int i
= 0; i
< kMaxNumDelayableRequestsPerClient
; ++i
) {
575 string url
= "http://host/low" + base::IntToString(i
);
576 lows
.push_back(NewRequest(url
.c_str(), net::IDLE
));
579 scoped_ptr
<TestRequest
> request(NewRequest("http://host/req", net::IDLE
));
580 EXPECT_FALSE(request
->started());
582 ChangeRequestPriority(request
.get(), net::IDLE
, 1);
583 EXPECT_FALSE(request
->started());
585 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
587 EXPECT_TRUE(request
->started());
590 TEST_F(ResourceSchedulerTest
, NonHTTPSchedulesImmediately
) {
591 // Dummies to enforce scheduling.
592 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
593 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
595 scoped_ptr
<TestRequest
> request(
596 NewRequest("chrome-extension://req", net::LOWEST
));
597 EXPECT_TRUE(request
->started());
600 TEST_F(ResourceSchedulerTest
, ActiveLoadingSyncSchedulesImmediately
) {
601 // TODO(aiolos): remove when throttling and coalescing have both landed
602 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
603 false /* should_coalesce */);
604 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
605 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
606 // Dummies to enforce scheduling.
607 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
608 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
610 scoped_ptr
<TestRequest
> request(
611 NewSyncRequest("http://host/req", net::LOWEST
));
612 EXPECT_TRUE(request
->started());
615 TEST_F(ResourceSchedulerTest
, UnthrottledSyncSchedulesImmediately
) {
616 // TODO(aiolos): remove when throttling and coalescing have both landed
617 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
618 false /* should_coalesce */);
619 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
620 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
621 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
622 kBackgroundRouteId
));
623 // Dummies to enforce scheduling.
624 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
625 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
627 scoped_ptr
<TestRequest
> request(
628 NewBackgroundSyncRequest("http://host/req", net::LOWEST
));
629 EXPECT_TRUE(request
->started());
632 TEST_F(ResourceSchedulerTest
, SpdyProxySchedulesImmediately
) {
633 scoped_ptr
<TestRequest
> high(NewRequest("http://host/high", net::HIGHEST
));
634 scoped_ptr
<TestRequest
> low(NewRequest("http://host/low", net::LOWEST
));
636 scoped_ptr
<TestRequest
> request(NewRequest("http://host/req", net::IDLE
));
637 EXPECT_FALSE(request
->started());
639 scheduler_
.OnReceivedSpdyProxiedHttpResponse(kChildId
, kRouteId
);
640 EXPECT_TRUE(request
->started());
642 scoped_ptr
<TestRequest
> after(NewRequest("http://host/after", net::IDLE
));
643 EXPECT_TRUE(after
->started());
646 TEST_F(ResourceSchedulerTest
, NewSpdyHostInDelayableRequests
) {
647 scheduler_
.OnWillInsertBody(kChildId
, kRouteId
);
648 const int kMaxNumDelayableRequestsPerClient
= 10; // Should match the .cc.
650 scoped_ptr
<TestRequest
> low1_spdy(
651 NewRequest("http://spdyhost1:8080/low", net::LOWEST
));
652 // Cancel a request after we learn the server supports SPDY.
653 ScopedVector
<TestRequest
> lows
;
654 for (int i
= 0; i
< kMaxNumDelayableRequestsPerClient
- 1; ++i
) {
655 string url
= "http://host" + base::IntToString(i
) + "/low";
656 lows
.push_back(NewRequest(url
.c_str(), net::LOWEST
));
658 scoped_ptr
<TestRequest
> low1(NewRequest("http://host/low", net::LOWEST
));
659 EXPECT_FALSE(low1
->started());
660 http_server_properties_
.SetSupportsSpdy(
661 net::HostPortPair("spdyhost1", 8080), true);
663 EXPECT_TRUE(low1
->started());
666 scoped_ptr
<TestRequest
> low2_spdy(
667 NewRequest("http://spdyhost2:8080/low", net::IDLE
));
668 // Reprioritize a request after we learn the server supports SPDY.
669 EXPECT_TRUE(low2_spdy
->started());
670 http_server_properties_
.SetSupportsSpdy(
671 net::HostPortPair("spdyhost2", 8080), true);
672 ChangeRequestPriority(low2_spdy
.get(), net::LOWEST
);
673 scoped_ptr
<TestRequest
> low2(NewRequest("http://host/low", net::LOWEST
));
674 EXPECT_TRUE(low2
->started());
677 TEST_F(ResourceSchedulerTest
, ThrottledClientCreation
) {
678 // TODO(aiolos): remove when throttling and coalescing have both landed
679 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
680 false /* should_coalesce */);
681 EXPECT_TRUE(scheduler_
.should_throttle());
682 scheduler_
.OnClientCreated(
683 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
685 EXPECT_EQ(ResourceScheduler::THROTTLED
,
686 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
687 kBackgroundRouteId2
));
688 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
691 TEST_F(ResourceSchedulerTest
, ActiveClientThrottleUpdateOnLoadingChange
) {
692 // TODO(aiolos): remove when throttling and coalescing have both landed
693 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
694 false /* should_coalesce */);
695 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
696 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
697 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
698 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
699 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
700 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, false);
701 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
702 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
705 TEST_F(ResourceSchedulerTest
, CoalesceBackgroundClientOnLoadCompletion
) {
706 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
707 true /* should_coalesce */);
708 EXPECT_EQ(ResourceScheduler::THROTTLED
,
709 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
710 kBackgroundRouteId
));
711 scheduler_
.OnLoadingStateChanged(
712 kBackgroundChildId
, kBackgroundRouteId
, true);
713 EXPECT_EQ(ResourceScheduler::THROTTLED
,
714 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
715 kBackgroundRouteId
));
716 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
717 EXPECT_EQ(ResourceScheduler::COALESCED
,
718 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
719 kBackgroundRouteId
));
722 TEST_F(ResourceSchedulerTest
, UnthrottleBackgroundClientOnLoadingStarted
) {
723 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
724 true /* should_coalesce */);
725 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
726 scheduler_
.OnLoadingStateChanged(
727 kBackgroundChildId
, kBackgroundRouteId
, true);
728 EXPECT_EQ(ResourceScheduler::COALESCED
,
729 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
730 kBackgroundRouteId
));
732 scheduler_
.OnLoadingStateChanged(
733 kBackgroundChildId
, kBackgroundRouteId
, false);
734 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
735 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
736 kBackgroundRouteId
));
739 TEST_F(ResourceSchedulerTest
, OneRequestPerThrottledClient
) {
740 // TODO(aiolos): remove when throttling and coalescing have both landed
741 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
742 false /* should_coalesce */);
743 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
744 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
745 EXPECT_EQ(ResourceScheduler::THROTTLED
,
746 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
747 kBackgroundRouteId
));
748 scoped_ptr
<TestRequest
> high(
749 NewBackgroundRequest("http://host/high", net::HIGHEST
));
750 scoped_ptr
<TestRequest
> request(
751 NewBackgroundRequest("http://host/req", net::IDLE
));
753 EXPECT_TRUE(high
->started());
754 EXPECT_FALSE(request
->started());
757 TEST_F(ResourceSchedulerTest
, UnthrottleNewlyVisibleClient
) {
758 // TODO(aiolos): remove when throttling and coalescing have both landed
759 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
760 false /* should_coalesce */);
761 EXPECT_EQ(ResourceScheduler::THROTTLED
,
762 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
763 kBackgroundRouteId
));
764 scoped_ptr
<TestRequest
> high(
765 NewBackgroundRequest("http://host/high", net::HIGHEST
));
766 scoped_ptr
<TestRequest
> request(
767 NewBackgroundRequest("http://host/req", net::IDLE
));
768 EXPECT_FALSE(request
->started());
770 scheduler_
.OnVisibilityChanged(kBackgroundChildId
, kBackgroundRouteId
, true);
771 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
772 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
773 kBackgroundRouteId
));
774 EXPECT_TRUE(request
->started());
777 TEST_F(ResourceSchedulerTest
, UnthrottleNewlyAudibleClient
) {
778 // TODO(aiolos): remove when throttling and coalescing have both landed
779 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
780 false /* should_coalesce */);
781 EXPECT_EQ(ResourceScheduler::THROTTLED
,
782 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
783 kBackgroundRouteId
));
784 scoped_ptr
<TestRequest
> high(
785 NewBackgroundRequest("http://host/high", net::HIGHEST
));
786 scoped_ptr
<TestRequest
> request(
787 NewBackgroundRequest("http://host/req", net::IDLE
));
788 EXPECT_FALSE(request
->started());
790 scheduler_
.OnAudibilityChanged(kBackgroundChildId
, kBackgroundRouteId
, true);
791 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
792 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
793 kBackgroundRouteId
));
794 EXPECT_TRUE(request
->started());
797 TEST_F(ResourceSchedulerTest
, VisibleClientStillUnthrottledOnAudabilityChange
) {
798 // TODO(aiolos): remove when throttling and coalescing have both landed
799 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
800 false /* should_coalesce */);
801 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
802 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
803 EXPECT_EQ(ResourceScheduler::THROTTLED
,
804 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
805 kBackgroundRouteId
));
807 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, true);
808 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
809 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
810 EXPECT_EQ(ResourceScheduler::THROTTLED
,
811 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
812 kBackgroundRouteId
));
814 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, false);
815 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
816 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
817 EXPECT_EQ(ResourceScheduler::THROTTLED
,
818 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
819 kBackgroundRouteId
));
822 TEST_F(ResourceSchedulerTest
, AudibleClientStillUnthrottledOnVisabilityChange
) {
823 // TODO(aiolos): remove when throttling and coalescing have both landed
824 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
825 false /* should_coalesce */);
826 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
827 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, true);
828 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
829 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
830 EXPECT_EQ(ResourceScheduler::THROTTLED
,
831 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
832 kBackgroundRouteId
));
834 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, true);
835 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
836 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
837 EXPECT_EQ(ResourceScheduler::THROTTLED
,
838 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
839 kBackgroundRouteId
));
841 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
842 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
843 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
844 EXPECT_EQ(ResourceScheduler::THROTTLED
,
845 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
846 kBackgroundRouteId
));
849 TEST_F(ResourceSchedulerTest
, ThrottledClientStartsNextHighestPriorityRequest
) {
850 // TODO(aiolos): remove when throttling and coalescing have both landed
851 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
852 false /* should_coalesce */);
853 scoped_ptr
<TestRequest
> request(
854 NewBackgroundRequest("http://host/req", net::IDLE
));
855 // Lower priority request started first to test request prioritizaton.
856 scoped_ptr
<TestRequest
> low(
857 NewBackgroundRequest("http://host/high", net::IDLE
));
858 scoped_ptr
<TestRequest
> high(
859 NewBackgroundRequest("http://host/high", net::HIGHEST
));
861 EXPECT_FALSE(low
->started());
862 EXPECT_FALSE(high
->started());
864 // request->CancelRequest();
866 EXPECT_TRUE(high
->started());
867 EXPECT_FALSE(low
->started());
870 TEST_F(ResourceSchedulerTest
, ThrottledSpdyProxySchedulesImmediately
) {
871 // TODO(aiolos): remove when throttling and coalescing have both landed
872 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
873 false /* should_coalesce */);
874 EXPECT_EQ(ResourceScheduler::THROTTLED
,
875 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
876 kBackgroundRouteId
));
877 scoped_ptr
<TestRequest
> high(
878 NewBackgroundRequest("http://host/high", net::HIGHEST
));
879 scoped_ptr
<TestRequest
> request(
880 NewBackgroundRequest("http://host/req", net::IDLE
));
882 EXPECT_FALSE(request
->started());
884 scheduler_
.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId
,
886 EXPECT_TRUE(request
->started());
888 scoped_ptr
<TestRequest
> after(
889 NewBackgroundRequest("http://host/after", net::IDLE
));
890 EXPECT_TRUE(after
->started());
893 TEST_F(ResourceSchedulerTest
, CoalescedClientIssuesNoRequests
) {
894 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
895 true /* should_coalesce */);
896 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
897 scheduler_
.OnLoadingStateChanged(
898 kBackgroundChildId
, kBackgroundRouteId
, true);
899 EXPECT_EQ(ResourceScheduler::COALESCED
,
900 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
901 kBackgroundRouteId
));
902 scoped_ptr
<TestRequest
> high(
903 NewBackgroundRequest("http://host/high", net::HIGHEST
));
904 scoped_ptr
<TestRequest
> request(
905 NewBackgroundRequest("http://host/req", net::IDLE
));
907 EXPECT_FALSE(high
->started());
908 EXPECT_FALSE(request
->started());
910 scheduler_
.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId
,
912 EXPECT_FALSE(high
->started());
914 scoped_ptr
<TestRequest
> after(
915 NewBackgroundRequest("http://host/after", net::HIGHEST
));
916 EXPECT_FALSE(after
->started());
919 TEST_F(ResourceSchedulerTest
, CoalescedSpdyProxyWaits
) {
920 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
921 true /* should_coalesce */);
922 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
923 scheduler_
.OnLoadingStateChanged(
924 kBackgroundChildId
, kBackgroundRouteId
, true);
925 EXPECT_EQ(ResourceScheduler::COALESCED
,
926 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
927 kBackgroundRouteId
));
928 scoped_ptr
<TestRequest
> high(
929 NewBackgroundRequest("http://host/high", net::HIGHEST
));
930 scoped_ptr
<TestRequest
> request(
931 NewBackgroundRequest("http://host/req", net::IDLE
));
933 EXPECT_FALSE(request
->started());
935 scheduler_
.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId
,
937 EXPECT_FALSE(request
->started());
939 scoped_ptr
<TestRequest
> after(
940 NewBackgroundRequest("http://host/after", net::IDLE
));
941 EXPECT_FALSE(after
->started());
944 TEST_F(ResourceSchedulerTest
, ThrottledNonHTTPSchedulesImmediately
) {
945 // TODO(aiolos): remove when throttling and coalescing have both landed
946 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
947 false /* should_coalesce */);
948 // Dummies to enforce scheduling.
949 scoped_ptr
<TestRequest
> high(
950 NewBackgroundRequest("http://host/high", net::HIGHEST
));
951 scoped_ptr
<TestRequest
> low(
952 NewBackgroundRequest("http://host/low", net::LOWEST
));
954 scoped_ptr
<TestRequest
> request(
955 NewBackgroundRequest("chrome-extension://req", net::LOWEST
));
956 EXPECT_TRUE(request
->started());
957 EXPECT_FALSE(low
->started());
960 TEST_F(ResourceSchedulerTest
, CoalescedNonHTTPSchedulesImmediately
) {
961 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
962 true /* should_coalesce */);
963 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
964 scheduler_
.OnLoadingStateChanged(
965 kBackgroundChildId
, kBackgroundRouteId
, true);
966 EXPECT_EQ(ResourceScheduler::COALESCED
,
967 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
968 kBackgroundRouteId
));
969 // Dummies to enforce scheduling.
970 scoped_ptr
<TestRequest
> high(
971 NewBackgroundRequest("http://host/high", net::HIGHEST
));
972 scoped_ptr
<TestRequest
> low(
973 NewBackgroundRequest("http://host/low", net::LOWEST
));
975 scoped_ptr
<TestRequest
> request(
976 NewBackgroundRequest("chrome-extension://req", net::LOWEST
));
977 EXPECT_TRUE(request
->started());
978 EXPECT_FALSE(low
->started());
981 TEST_F(ResourceSchedulerTest
, ThrottledSyncSchedulesImmediately
) {
982 // TODO(aiolos): remove when throttling and coalescing have both landed
983 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
984 false /* should_coalesce */);
985 // Dummies to enforce scheduling.
986 scoped_ptr
<TestRequest
> high(
987 NewBackgroundRequest("http://host/high", net::HIGHEST
));
988 scoped_ptr
<TestRequest
> low(
989 NewBackgroundRequest("http://host/low", net::LOWEST
));
991 scoped_ptr
<TestRequest
> request(
992 NewBackgroundSyncRequest("http://host/req", net::LOWEST
));
993 EXPECT_TRUE(request
->started());
994 EXPECT_FALSE(low
->started());
997 TEST_F(ResourceSchedulerTest
, CoalescedSyncSchedulesImmediately
) {
998 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
999 true /* should_coalesce */);
1000 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1001 scheduler_
.OnLoadingStateChanged(
1002 kBackgroundChildId
, kBackgroundRouteId
, true);
1003 EXPECT_EQ(ResourceScheduler::COALESCED
,
1004 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1005 kBackgroundRouteId
));
1006 // Dummies to enforce scheduling.
1007 scoped_ptr
<TestRequest
> high(
1008 NewBackgroundRequest("http://host/high", net::HIGHEST
));
1009 scoped_ptr
<TestRequest
> low(
1010 NewBackgroundRequest("http://host/low", net::LOWEST
));
1012 scoped_ptr
<TestRequest
> request(
1013 NewBackgroundSyncRequest("http://host/req", net::LOWEST
));
1014 EXPECT_TRUE(request
->started());
1015 EXPECT_FALSE(low
->started());
1016 EXPECT_FALSE(high
->started());
1019 TEST_F(ResourceSchedulerTest
, AllBackgroundClientsUnthrottle
) {
1020 // TODO(aiolos): remove when throttling and coalescing have both landed
1021 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1022 false /* should_coalesce */);
1023 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1024 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1025 kBackgroundRouteId
));
1026 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1027 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1028 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1030 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1031 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1032 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1033 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1034 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1035 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1036 kBackgroundRouteId
));
1038 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1039 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1040 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1041 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1042 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1043 kBackgroundRouteId
));
1045 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, false);
1046 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1047 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1048 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1049 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1050 kBackgroundRouteId
));
1052 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1053 scheduler_
.OnLoadingStateChanged(
1054 kBackgroundChildId
, kBackgroundRouteId
, true);
1055 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1056 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1057 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1058 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1059 kBackgroundRouteId
));
1062 TEST_F(ResourceSchedulerTest
,
1063 UnloadedClientVisibilityChangedCorrectlyUnthrottles
) {
1064 // TODO(aiolos): remove when throttling and coalescing have both landed
1065 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1066 false /* should_coalesce */);
1067 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, false, false);
1068 scheduler_
.OnClientCreated(
1069 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1070 scheduler_
.OnLoadingStateChanged(kChildId2
, kRouteId2
, true);
1071 scheduler_
.OnLoadingStateChanged(
1072 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1074 // 1 visible, 3 hidden
1075 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1076 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1077 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1078 kBackgroundRouteId
));
1079 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1080 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1081 kBackgroundRouteId2
));
1082 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1083 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1084 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1085 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1087 // 2 visible, 2 hidden
1088 scheduler_
.OnVisibilityChanged(kChildId2
, kRouteId2
, true);
1089 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1090 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1091 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1092 kBackgroundRouteId
));
1093 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1094 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1095 kBackgroundRouteId2
));
1096 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1097 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1098 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1099 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1101 // 1 visible, 3 hidden
1102 scheduler_
.OnVisibilityChanged(kChildId2
, kRouteId2
, false);
1103 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1104 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1105 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1106 kBackgroundRouteId
));
1107 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1108 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1109 kBackgroundRouteId2
));
1110 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1111 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1112 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1113 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1115 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1116 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1119 TEST_F(ResourceSchedulerTest
,
1120 UnloadedClientAudibilityChangedCorrectlyUnthrottles
) {
1121 // TODO(aiolos): remove when throttling and coalescing have both landed
1122 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1123 false /* should_coalesce */);
1124 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, false, false);
1125 scheduler_
.OnClientCreated(
1126 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1127 scheduler_
.OnLoadingStateChanged(
1128 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1129 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1130 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, true);
1132 // 1 audible, 3 hidden
1133 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1134 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1135 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1136 kBackgroundRouteId
));
1137 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1138 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1139 kBackgroundRouteId2
));
1140 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1141 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1142 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1143 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1145 // 2 audible, 2 hidden
1146 scheduler_
.OnAudibilityChanged(kChildId2
, kRouteId2
, true);
1147 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1148 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1149 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1150 kBackgroundRouteId
));
1151 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1152 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1153 kBackgroundRouteId2
));
1154 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1155 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1156 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1157 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1159 // 1 audible, 3 hidden
1160 scheduler_
.OnAudibilityChanged(kChildId2
, kRouteId2
, false);
1161 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1162 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1163 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1164 kBackgroundRouteId
));
1165 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1166 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1167 kBackgroundRouteId2
));
1168 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1169 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1170 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1171 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1173 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1174 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1177 TEST_F(ResourceSchedulerTest
,
1178 LoadedClientVisibilityChangedCorrectlyUnthrottles
) {
1179 // TODO(aiolos): remove when throttling and coalescing have both landed
1180 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1181 false /* should_coalesce */);
1182 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, false, false);
1183 scheduler_
.OnClientCreated(
1184 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1185 scheduler_
.OnLoadingStateChanged(kChildId2
, kRouteId2
, true);
1186 scheduler_
.OnLoadingStateChanged(
1187 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1188 // 1 visible, 3 hidden
1189 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1190 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1191 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1192 kBackgroundRouteId
));
1193 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1194 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1195 kBackgroundRouteId2
));
1196 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1197 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1198 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1199 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1201 // 2 visible, 2 hidden
1202 scheduler_
.OnVisibilityChanged(kChildId2
, kRouteId2
, true);
1203 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1204 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1205 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1206 kBackgroundRouteId
));
1207 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1208 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1209 kBackgroundRouteId2
));
1210 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1211 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1212 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1213 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1215 // 1 visible, 3 hidden
1216 scheduler_
.OnVisibilityChanged(kChildId2
, kRouteId2
, false);
1217 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1218 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1219 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1220 kBackgroundRouteId
));
1221 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1222 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1223 kBackgroundRouteId2
));
1224 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1225 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1226 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1227 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1229 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1230 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1233 TEST_F(ResourceSchedulerTest
,
1234 LoadedClientAudibilityChangedCorrectlyUnthrottles
) {
1235 // TODO(aiolos): remove when throttling and coalescing have both landed
1236 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1237 false /* should_coalesce */);
1238 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, false, false);
1239 scheduler_
.OnClientCreated(
1240 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1241 scheduler_
.OnLoadingStateChanged(kChildId2
, kRouteId2
, true);
1242 scheduler_
.OnLoadingStateChanged(
1243 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1244 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1245 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, true);
1246 // 1 audible, 3 hidden
1247 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1248 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1249 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1250 kBackgroundRouteId
));
1251 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1252 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1253 kBackgroundRouteId2
));
1254 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1255 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1256 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1257 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1259 // 2 audible, 2 hidden
1260 scheduler_
.OnAudibilityChanged(kChildId2
, kRouteId2
, true);
1261 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1262 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1263 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1264 kBackgroundRouteId
));
1265 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1266 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1267 kBackgroundRouteId2
));
1268 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1269 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1270 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1271 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1273 // 1 audible, 3 hidden
1274 scheduler_
.OnAudibilityChanged(kChildId2
, kRouteId2
, false);
1275 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1276 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1277 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1278 kBackgroundRouteId
));
1279 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1280 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1281 kBackgroundRouteId2
));
1282 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1283 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1284 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1285 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1287 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1288 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1291 TEST_F(ResourceSchedulerTest
, UnloadedClientBecomesHiddenCorrectlyUnthrottles
) {
1292 // TODO(aiolos): remove when throttling and coalescing have both landed
1293 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1294 false /* should_coalesce */);
1295 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, true, false);
1296 scheduler_
.OnClientCreated(
1297 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1298 scheduler_
.OnLoadingStateChanged(
1299 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1301 // 2 visible, 2 hidden
1302 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1303 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1304 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1305 kBackgroundRouteId
));
1306 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1307 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1308 kBackgroundRouteId2
));
1309 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1310 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1311 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1312 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1314 // 1 visible, 3 hidden
1315 scheduler_
.OnVisibilityChanged(kChildId2
, kRouteId2
, false);
1316 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1317 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1318 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1319 kBackgroundRouteId
));
1320 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1321 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1322 kBackgroundRouteId2
));
1323 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1324 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1325 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1326 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1328 // 0 visible, 4 hidden
1329 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1330 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1331 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1332 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1333 kBackgroundRouteId
));
1334 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1335 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1336 kBackgroundRouteId2
));
1337 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1338 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1339 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1340 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1342 // 1 visible, 3 hidden
1343 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, true);
1344 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1345 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1346 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1347 kBackgroundRouteId
));
1348 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1349 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1350 kBackgroundRouteId2
));
1351 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1352 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1353 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1354 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1356 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1357 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1360 TEST_F(ResourceSchedulerTest
, UnloadedClientBecomesSilentCorrectlyUnthrottles
) {
1361 // TODO(aiolos): remove when throttling and coalescing have both landed
1362 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1363 false /* should_coalesce */);
1364 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, false, true);
1365 scheduler_
.OnClientCreated(
1366 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1367 scheduler_
.OnLoadingStateChanged(
1368 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1369 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, true);
1370 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1371 // 2 audible, 2 hidden
1372 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1373 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1374 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1375 kBackgroundRouteId
));
1376 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1377 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1378 kBackgroundRouteId2
));
1379 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1380 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1381 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1382 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1384 // 1 audible, 3 hidden
1385 scheduler_
.OnAudibilityChanged(kChildId2
, kRouteId2
, false);
1386 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1387 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1388 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1389 kBackgroundRouteId
));
1390 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1391 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1392 kBackgroundRouteId2
));
1393 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1394 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1395 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1396 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1398 // 0 audible, 4 hidden
1399 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, false);
1400 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1401 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1402 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1403 kBackgroundRouteId
));
1404 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1405 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1406 kBackgroundRouteId2
));
1407 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1408 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1409 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1410 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1412 // 1 audible, 3 hidden
1413 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, true);
1414 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1415 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1416 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1417 kBackgroundRouteId
));
1418 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1419 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1420 kBackgroundRouteId2
));
1421 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1422 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1423 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1424 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1426 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1427 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1430 TEST_F(ResourceSchedulerTest
, LoadedClientBecomesHiddenCorrectlyThrottles
) {
1431 // TODO(aiolos): remove when throttling and coalescing have both landed
1432 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1433 false /* should_coalesce */);
1434 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, true, false);
1435 scheduler_
.OnClientCreated(
1436 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1437 scheduler_
.OnLoadingStateChanged(
1438 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1439 scheduler_
.OnLoadingStateChanged(kChildId2
, kRouteId2
, true);
1440 // 2 visible, 2 hidden
1441 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1442 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1443 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1444 kBackgroundRouteId
));
1445 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1446 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1447 kBackgroundRouteId2
));
1448 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1449 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1450 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1451 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1453 // 1 visible, 3 hidden
1454 scheduler_
.OnVisibilityChanged(kChildId2
, kRouteId2
, false);
1455 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1456 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1457 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1458 kBackgroundRouteId
));
1459 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1460 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1461 kBackgroundRouteId2
));
1462 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1463 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1464 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1465 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1467 // 0 visible, 4 hidden
1468 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1469 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1470 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1471 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1472 kBackgroundRouteId
));
1473 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1474 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1475 kBackgroundRouteId2
));
1476 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1477 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1478 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1479 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1481 // 1 visible, 3 hidden
1482 scheduler_
.OnVisibilityChanged(kChildId2
, kRouteId2
, true);
1483 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1484 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1485 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1486 kBackgroundRouteId
));
1487 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1488 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1489 kBackgroundRouteId2
));
1490 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1491 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1492 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1493 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1495 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1496 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1499 TEST_F(ResourceSchedulerTest
, LoadedClientBecomesSilentCorrectlyThrottles
) {
1500 // TODO(aiolos): remove when throttling and coalescing have both landed
1501 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1502 false /* should_coalesce */);
1503 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, false, true);
1504 scheduler_
.OnClientCreated(
1505 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1506 scheduler_
.OnLoadingStateChanged(
1507 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1508 scheduler_
.OnLoadingStateChanged(kChildId2
, kRouteId2
, true);
1509 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1510 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, true);
1511 // 2 audible, 2 hidden
1512 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1513 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1514 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1515 kBackgroundRouteId
));
1516 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1517 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1518 kBackgroundRouteId2
));
1519 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1520 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1521 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1522 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1524 // 1 audible, 3 hidden
1525 scheduler_
.OnAudibilityChanged(kChildId2
, kRouteId2
, false);
1526 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1527 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1528 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1529 kBackgroundRouteId
));
1530 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1531 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1532 kBackgroundRouteId2
));
1533 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1534 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1535 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1536 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1538 // 0 audible, 4 hidden
1539 scheduler_
.OnAudibilityChanged(kChildId
, kRouteId
, false);
1540 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1541 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1542 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1543 kBackgroundRouteId
));
1544 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1545 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1546 kBackgroundRouteId2
));
1547 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1548 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1549 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1550 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1552 // 1 audible, 3 hidden
1553 scheduler_
.OnAudibilityChanged(kChildId2
, kRouteId2
, true);
1554 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1555 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1556 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1557 kBackgroundRouteId
));
1558 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1559 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1560 kBackgroundRouteId2
));
1561 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1562 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1563 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1564 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1566 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1567 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1570 TEST_F(ResourceSchedulerTest
, HiddenLoadedChangesCorrectlyStayThrottled
) {
1571 // TODO(aiolos): remove when throttling and coalescing have both landed
1572 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1573 false /* should_coalesce */);
1574 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, true, false);
1575 scheduler_
.OnClientCreated(
1576 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1578 // 1 visible and 2 hidden loading, 1 visible loaded
1579 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1580 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1581 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1582 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1583 kBackgroundRouteId
));
1584 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1585 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1586 kBackgroundRouteId2
));
1587 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1588 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1589 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1590 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1592 // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded
1593 scheduler_
.OnLoadingStateChanged(
1594 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1595 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1596 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1597 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1598 kBackgroundRouteId
));
1599 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1600 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1601 kBackgroundRouteId2
));
1602 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1603 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1604 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1605 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1607 // 1 visible loading, 1 visible and 2 hidden loaded
1608 scheduler_
.OnLoadingStateChanged(
1609 kBackgroundChildId
, kBackgroundRouteId
, true);
1610 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1611 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1612 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1613 kBackgroundRouteId
));
1614 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1615 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1616 kBackgroundRouteId2
));
1617 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1618 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1619 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1620 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1622 // 1 visible and 1 hidden loading, 1 visible and 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::UNTHROTTLED
,
1635 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1637 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1638 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1641 TEST_F(ResourceSchedulerTest
, PartialVisibleClientLoadedDoesNotUnthrottle
) {
1642 // TODO(aiolos): remove when throttling and coalescing have both landed
1643 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1644 false /* should_coalesce */);
1645 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, true, false);
1646 scheduler_
.OnClientCreated(
1647 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1649 // 2 visible loading, 1 hidden loading, 1 hidden loaded
1650 scheduler_
.OnLoadingStateChanged(
1651 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1652 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1653 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1654 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1655 kBackgroundRouteId
));
1656 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1657 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1658 kBackgroundRouteId2
));
1659 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1660 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1661 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1662 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1664 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1665 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1666 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1667 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1668 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1669 kBackgroundRouteId
));
1670 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1671 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1672 kBackgroundRouteId2
));
1673 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1674 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1675 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1676 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1678 // 2 visible loading, 1 hidden loading, 1 hidden loaded
1679 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, false);
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::ACTIVE_AND_LOADING
,
1688 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1689 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1690 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1692 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1693 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1696 TEST_F(ResourceSchedulerTest
, FullVisibleLoadedCorrectlyUnthrottle
) {
1697 // TODO(aiolos): remove when throttling and coalescing have both landed
1698 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1699 false /* should_coalesce */);
1700 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, true, false);
1701 scheduler_
.OnClientCreated(
1702 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1704 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1705 scheduler_
.OnLoadingStateChanged(
1706 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1707 scheduler_
.OnLoadingStateChanged(kChildId2
, kRouteId2
, true);
1708 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1709 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1710 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1711 kBackgroundRouteId
));
1712 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1713 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1714 kBackgroundRouteId2
));
1715 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1716 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1717 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1718 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1720 scoped_ptr
<TestRequest
> high(
1721 NewBackgroundRequest("http://host/high", net::HIGHEST
));
1722 scoped_ptr
<TestRequest
> low(
1723 NewBackgroundRequest("http://host/low", net::LOWEST
));
1725 EXPECT_TRUE(high
->started());
1726 EXPECT_FALSE(low
->started());
1728 // 2 visible loaded, 1 hidden loading, 1 hidden loaded
1729 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1730 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1731 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1732 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1733 kBackgroundRouteId
));
1734 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1735 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1736 kBackgroundRouteId2
));
1737 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1738 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1739 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1740 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1741 // kBackgroundClientId unthrottling should unthrottle it's request.
1742 EXPECT_TRUE(low
->started());
1744 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1745 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, false);
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(kChildId2
, kRouteId2
));
1755 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1756 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1758 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1759 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1762 TEST_F(ResourceSchedulerTest
,
1763 ActiveAndLoadingClientDeletedCorrectlyUnthrottle
) {
1764 // TODO(aiolos): remove when throttling and coalescing have both landed
1765 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1766 false /* should_coalesce */);
1767 scheduler_
.OnClientCreated(kChildId2
, kRouteId2
, true, false);
1768 scheduler_
.OnClientCreated(
1769 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1771 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1772 scheduler_
.OnLoadingStateChanged(
1773 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1774 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1775 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1776 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1777 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1778 kBackgroundRouteId
));
1779 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1780 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1781 kBackgroundRouteId2
));
1782 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1783 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1784 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1785 scheduler_
.GetClientStateForTesting(kChildId2
, kRouteId2
));
1787 // 1 visible loaded, 1 hidden loading, 1 hidden loaded
1788 scheduler_
.OnClientDeleted(kChildId2
, kRouteId2
);
1789 EXPECT_TRUE(scheduler_
.active_clients_loaded());
1790 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1791 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1792 kBackgroundRouteId
));
1793 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1794 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1795 kBackgroundRouteId2
));
1796 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1797 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1799 // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading
1800 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, false);
1801 EXPECT_FALSE(scheduler_
.active_clients_loaded());
1802 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1803 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1804 kBackgroundRouteId
));
1805 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1806 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1807 kBackgroundRouteId2
));
1808 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1809 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1811 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1814 TEST_F(ResourceSchedulerTest
, CoalescedClientCreationStartsTimer
) {
1815 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1816 true /* should_coalesce */);
1817 EXPECT_FALSE(mock_timer_
->IsRunning());
1818 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1819 EXPECT_FALSE(mock_timer_
->IsRunning());
1820 scheduler_
.OnLoadingStateChanged(
1821 kBackgroundChildId
, kBackgroundRouteId
, true);
1822 EXPECT_EQ(ResourceScheduler::COALESCED
,
1823 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1824 kBackgroundRouteId
));
1825 EXPECT_TRUE(mock_timer_
->IsRunning());
1828 TEST_F(ResourceSchedulerTest
, ActiveLoadingClientLoadedAndHiddenStartsTimer
) {
1829 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1830 true /* should_coalesce */);
1831 EXPECT_FALSE(mock_timer_
->IsRunning());
1832 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1833 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1834 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1835 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1836 kBackgroundRouteId
));
1837 EXPECT_FALSE(mock_timer_
->IsRunning());
1839 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1840 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1841 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1842 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1843 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1844 kBackgroundRouteId
));
1845 EXPECT_FALSE(mock_timer_
->IsRunning());
1847 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1848 EXPECT_EQ(ResourceScheduler::COALESCED
,
1849 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1850 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1851 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1852 kBackgroundRouteId
));
1853 EXPECT_TRUE(mock_timer_
->IsRunning());
1856 TEST_F(ResourceSchedulerTest
, ActiveLoadingClientHiddenAndLoadedStartsTimer
) {
1857 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1858 true /* should_coalesce */);
1859 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
1860 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1861 EXPECT_EQ(ResourceScheduler::THROTTLED
,
1862 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1863 kBackgroundRouteId
));
1864 EXPECT_FALSE(mock_timer_
->IsRunning());
1866 scheduler_
.OnVisibilityChanged(kChildId
, kRouteId
, false);
1867 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1868 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1869 EXPECT_FALSE(mock_timer_
->IsRunning());
1871 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1872 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1873 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1874 kBackgroundRouteId
));
1875 EXPECT_EQ(ResourceScheduler::COALESCED
,
1876 scheduler_
.GetClientStateForTesting(kChildId
, kRouteId
));
1877 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1878 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1879 kBackgroundRouteId
));
1880 EXPECT_TRUE(mock_timer_
->IsRunning());
1883 TEST_F(ResourceSchedulerTest
, CoalescedClientBecomesAudibleStopsTimer
) {
1884 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1885 true /* should_coalesce */);
1886 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1887 EXPECT_FALSE(mock_timer_
->IsRunning());
1888 scheduler_
.OnLoadingStateChanged(
1889 kBackgroundChildId
, kBackgroundRouteId
, true);
1890 EXPECT_EQ(ResourceScheduler::COALESCED
,
1891 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1892 kBackgroundRouteId
));
1893 EXPECT_TRUE(mock_timer_
->IsRunning());
1895 scheduler_
.OnAudibilityChanged(kBackgroundChildId
, kBackgroundRouteId
, true);
1896 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
1897 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1898 kBackgroundRouteId
));
1899 EXPECT_FALSE(mock_timer_
->IsRunning());
1902 TEST_F(ResourceSchedulerTest
, LastCoalescedClientDeletionStopsTimer
) {
1903 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1904 true /* should_coalesce */);
1905 scheduler_
.OnClientCreated(
1906 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1907 EXPECT_FALSE(mock_timer_
->IsRunning());
1908 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1909 EXPECT_FALSE(mock_timer_
->IsRunning());
1910 scheduler_
.OnLoadingStateChanged(
1911 kBackgroundChildId
, kBackgroundRouteId
, true);
1912 EXPECT_EQ(ResourceScheduler::COALESCED
,
1913 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1914 kBackgroundRouteId
));
1915 scheduler_
.OnLoadingStateChanged(
1916 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1917 EXPECT_EQ(ResourceScheduler::COALESCED
,
1918 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1919 kBackgroundRouteId2
));
1920 EXPECT_TRUE(mock_timer_
->IsRunning());
1922 scheduler_
.OnClientDeleted(kBackgroundChildId
, kBackgroundRouteId
);
1923 EXPECT_TRUE(mock_timer_
->IsRunning());
1925 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1926 EXPECT_FALSE(mock_timer_
->IsRunning());
1928 // To avoid errors on test tear down.
1929 scheduler_
.OnClientCreated(
1930 kBackgroundChildId
, kBackgroundRouteId
, false, false);
1933 TEST_F(ResourceSchedulerTest
, LastCoalescedClientStartsLoadingStopsTimer
) {
1934 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1935 true /* should_coalesce */);
1936 scheduler_
.OnClientCreated(
1937 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1938 EXPECT_FALSE(mock_timer_
->IsRunning());
1939 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1940 EXPECT_FALSE(mock_timer_
->IsRunning());
1941 scheduler_
.OnLoadingStateChanged(
1942 kBackgroundChildId
, kBackgroundRouteId
, true);
1943 EXPECT_EQ(ResourceScheduler::COALESCED
,
1944 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1945 kBackgroundRouteId
));
1946 scheduler_
.OnLoadingStateChanged(
1947 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1948 EXPECT_EQ(ResourceScheduler::COALESCED
,
1949 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1950 kBackgroundRouteId2
));
1951 EXPECT_TRUE(mock_timer_
->IsRunning());
1953 scheduler_
.OnLoadingStateChanged(
1954 kBackgroundChildId
, kBackgroundRouteId
, false);
1955 EXPECT_TRUE(mock_timer_
->IsRunning());
1957 scheduler_
.OnLoadingStateChanged(
1958 kBackgroundChildId2
, kBackgroundRouteId2
, false);
1959 EXPECT_FALSE(mock_timer_
->IsRunning());
1961 // This is needed to avoid errors on test tear down.
1962 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1965 TEST_F(ResourceSchedulerTest
, LastCoalescedClientBecomesVisibleStopsTimer
) {
1966 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1967 true /* should_coalesce */);
1968 scheduler_
.OnClientCreated(
1969 kBackgroundChildId2
, kBackgroundRouteId2
, false, false);
1970 EXPECT_FALSE(mock_timer_
->IsRunning());
1971 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
1972 EXPECT_FALSE(mock_timer_
->IsRunning());
1973 scheduler_
.OnLoadingStateChanged(
1974 kBackgroundChildId
, kBackgroundRouteId
, true);
1975 EXPECT_EQ(ResourceScheduler::COALESCED
,
1976 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
1977 kBackgroundRouteId
));
1978 scheduler_
.OnLoadingStateChanged(
1979 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1980 EXPECT_EQ(ResourceScheduler::COALESCED
,
1981 scheduler_
.GetClientStateForTesting(kBackgroundChildId2
,
1982 kBackgroundRouteId2
));
1983 EXPECT_TRUE(mock_timer_
->IsRunning());
1985 scheduler_
.OnVisibilityChanged(kBackgroundChildId
, kBackgroundRouteId
, true);
1986 EXPECT_TRUE(mock_timer_
->IsRunning());
1988 scheduler_
.OnVisibilityChanged(
1989 kBackgroundChildId2
, kBackgroundRouteId2
, true);
1990 EXPECT_FALSE(mock_timer_
->IsRunning());
1992 // To avoid errors on test tear down.
1993 scheduler_
.OnClientDeleted(kBackgroundChildId2
, kBackgroundRouteId2
);
1996 TEST_F(ResourceSchedulerTest
,
1997 CoalescedClientBecomesLoadingAndVisibleStopsTimer
) {
1998 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
1999 true /* should_coalesce */);
2000 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
2001 EXPECT_FALSE(mock_timer_
->IsRunning());
2002 scheduler_
.OnLoadingStateChanged(
2003 kBackgroundChildId
, kBackgroundRouteId
, true);
2004 EXPECT_EQ(ResourceScheduler::COALESCED
,
2005 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
2006 kBackgroundRouteId
));
2007 EXPECT_TRUE(mock_timer_
->IsRunning());
2009 scheduler_
.OnLoadingStateChanged(
2010 kBackgroundChildId
, kBackgroundRouteId
, false);
2011 EXPECT_EQ(ResourceScheduler::UNTHROTTLED
,
2012 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
2013 kBackgroundRouteId
));
2014 EXPECT_FALSE(mock_timer_
->IsRunning());
2016 scheduler_
.OnVisibilityChanged(kBackgroundChildId
, kBackgroundRouteId
, true);
2017 EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING
,
2018 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
2019 kBackgroundRouteId
));
2020 EXPECT_FALSE(mock_timer_
->IsRunning());
2023 TEST_F(ResourceSchedulerTest
, CoalescedRequestsIssueOnTimer
) {
2024 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
2025 true /* should_coalesce */);
2026 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
2027 scheduler_
.OnLoadingStateChanged(
2028 kBackgroundChildId
, kBackgroundRouteId
, true);
2029 EXPECT_EQ(ResourceScheduler::COALESCED
,
2030 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
2031 kBackgroundRouteId
));
2032 EXPECT_TRUE(scheduler_
.active_clients_loaded());
2034 scoped_ptr
<TestRequest
> high(
2035 NewBackgroundRequest("http://host/high", net::HIGHEST
));
2036 scoped_ptr
<TestRequest
> low(
2037 NewBackgroundRequest("http://host/low", net::LOWEST
));
2038 EXPECT_FALSE(high
->started());
2039 EXPECT_FALSE(low
->started());
2041 FireCoalescingTimer();
2043 EXPECT_TRUE(high
->started());
2044 EXPECT_TRUE(low
->started());
2047 TEST_F(ResourceSchedulerTest
, CoalescedRequestsUnthrottleCorrectlyOnTimer
) {
2048 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
2049 true /* should_coalesce */);
2050 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
2051 scheduler_
.OnLoadingStateChanged(
2052 kBackgroundChildId
, kBackgroundRouteId
, true);
2053 EXPECT_EQ(ResourceScheduler::COALESCED
,
2054 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
2055 kBackgroundRouteId
));
2056 EXPECT_TRUE(scheduler_
.active_clients_loaded());
2058 scoped_ptr
<TestRequest
> high(
2059 NewBackgroundRequest("http://host/high", net::HIGHEST
));
2060 scoped_ptr
<TestRequest
> high2(
2061 NewBackgroundRequest("http://host/high", net::HIGHEST
));
2062 scoped_ptr
<TestRequest
> high3(
2063 NewBackgroundRequest("http://host/high", net::HIGHEST
));
2064 scoped_ptr
<TestRequest
> high4(
2065 NewBackgroundRequest("http://host/high", net::HIGHEST
));
2066 scoped_ptr
<TestRequest
> low(
2067 NewBackgroundRequest("http://host/low", net::LOWEST
));
2068 scoped_ptr
<TestRequest
> low2(
2069 NewBackgroundRequest("http://host/low", net::LOWEST
));
2070 scoped_ptr
<TestRequest
> low3(
2071 NewBackgroundRequest("http://host/low", net::LOWEST
));
2072 scoped_ptr
<TestRequest
> low4(
2073 NewBackgroundRequest("http://host/low", net::LOWEST
));
2075 http_server_properties_
.SetSupportsSpdy(net::HostPortPair("spdyhost", 443),
2077 scoped_ptr
<TestRequest
> low_spdy(
2078 NewBackgroundRequest("https://spdyhost/low", net::LOW
));
2079 scoped_ptr
<TestRequest
> sync_request(
2080 NewBackgroundSyncRequest("http://host/req", net::LOW
));
2081 scoped_ptr
<TestRequest
> non_http_request(
2082 NewBackgroundRequest("chrome-extension://req", net::LOW
));
2084 // Sync requests should issue immediately.
2085 EXPECT_TRUE(sync_request
->started());
2086 // Non-http(s) requests should issue immediately.
2087 EXPECT_TRUE(non_http_request
->started());
2088 // Nothing else should issue without a timer fire.
2089 EXPECT_FALSE(high
->started());
2090 EXPECT_FALSE(high2
->started());
2091 EXPECT_FALSE(high3
->started());
2092 EXPECT_FALSE(high4
->started());
2093 EXPECT_FALSE(low
->started());
2094 EXPECT_FALSE(low2
->started());
2095 EXPECT_FALSE(low3
->started());
2096 EXPECT_FALSE(low4
->started());
2097 EXPECT_FALSE(low_spdy
->started());
2099 FireCoalescingTimer();
2101 // All high priority requests should issue.
2102 EXPECT_TRUE(high
->started());
2103 EXPECT_TRUE(high2
->started());
2104 EXPECT_TRUE(high3
->started());
2105 EXPECT_TRUE(high4
->started());
2106 // There should only be one net::LOWEST priority request issued with
2107 // non-delayable requests in flight.
2108 EXPECT_TRUE(low
->started());
2109 EXPECT_FALSE(low2
->started());
2110 EXPECT_FALSE(low3
->started());
2111 EXPECT_FALSE(low4
->started());
2112 // Spdy-Enable requests should issue regardless of priority.
2113 EXPECT_TRUE(low_spdy
->started());
2116 TEST_F(ResourceSchedulerTest
, CoalescedRequestsWaitForNextTimer
) {
2117 scheduler_
.SetThrottleOptionsForTesting(true /* should_throttle */,
2118 true /* should_coalesce */);
2119 scheduler_
.OnLoadingStateChanged(kChildId
, kRouteId
, true);
2120 scheduler_
.OnLoadingStateChanged(
2121 kBackgroundChildId
, kBackgroundRouteId
, true);
2123 EXPECT_EQ(ResourceScheduler::COALESCED
,
2124 scheduler_
.GetClientStateForTesting(kBackgroundChildId
,
2125 kBackgroundRouteId
));
2126 EXPECT_TRUE(scheduler_
.active_clients_loaded());
2128 scoped_ptr
<TestRequest
> high(
2129 NewBackgroundRequest("http://host/high", net::HIGHEST
));
2130 EXPECT_FALSE(high
->started());
2132 FireCoalescingTimer();
2134 scoped_ptr
<TestRequest
> high2(
2135 NewBackgroundRequest("http://host/high2", net::HIGHEST
));
2136 scoped_ptr
<TestRequest
> low(
2137 NewBackgroundRequest("http://host/low", net::LOWEST
));
2139 EXPECT_TRUE(high
->started());
2140 EXPECT_FALSE(high2
->started());
2141 EXPECT_FALSE(low
->started());
2143 FireCoalescingTimer();
2145 EXPECT_TRUE(high
->started());
2146 EXPECT_TRUE(high2
->started());
2147 EXPECT_TRUE(low
->started());
2150 TEST_F(ResourceSchedulerTest
, GetVisualSignalFromRenderViewHost
) {
2151 scoped_ptr
<MockRenderProcessHostFactory
> render_process_host_factory
;
2152 scoped_ptr
<TestRenderViewHostFactory
> render_view_host_factory
;
2153 scoped_ptr
<TestBrowserContext
> browser_context
;
2154 scoped_ptr
<TestWebContents
> web_contents_1
;
2155 scoped_ptr
<TestWebContents
> web_contents_2
;
2156 render_process_host_factory
.reset(new MockRenderProcessHostFactory());
2157 render_view_host_factory
.reset(
2158 new TestRenderViewHostFactory(render_process_host_factory
.get()));
2160 browser_context
.reset(new TestBrowserContext());
2161 scoped_refptr
<SiteInstance
> site_instance_1
=
2162 SiteInstance::Create(browser_context
.get());
2163 scoped_refptr
<SiteInstance
> site_instance_2
=
2164 SiteInstance::Create(browser_context
.get());
2165 SiteInstanceImpl::set_render_process_host_factory(
2166 render_process_host_factory
.get());
2168 web_contents_1
.reset(
2169 TestWebContents::Create(browser_context
.get(), site_instance_1
.get()));
2170 web_contents_2
.reset(
2171 TestWebContents::Create(browser_context
.get(), site_instance_2
.get()));
2172 base::RunLoop().RunUntilIdle();
2174 RenderViewHostImpl
* rvh1
= web_contents_1
->GetRenderViewHost();
2175 RenderViewHostImpl
* rvh2
= web_contents_2
->GetRenderViewHost();
2176 ResourceScheduler
* scheduler
= ResourceDispatcherHostImpl::Get()->scheduler();
2178 // Check initial visibility is set correctly.
2179 EXPECT_EQ(scheduler
->IsClientVisibleForTesting(rvh1
->GetProcess()->GetID(),
2180 rvh1
->GetRoutingID()),
2181 !rvh1
->is_hidden());
2182 EXPECT_EQ(scheduler
->IsClientVisibleForTesting(rvh2
->GetProcess()->GetID(),
2183 rvh1
->GetRoutingID()),
2184 !rvh2
->is_hidden());
2186 // 1 visible, 1 hidden
2187 rvh1
->WasShown(ui::LatencyInfo());
2189 base::RunLoop().RunUntilIdle();
2191 EXPECT_TRUE(scheduler
->IsClientVisibleForTesting(rvh1
->GetProcess()->GetID(),
2192 rvh1
->GetRoutingID()));
2193 EXPECT_FALSE(scheduler
->IsClientVisibleForTesting(rvh2
->GetProcess()->GetID(),
2194 rvh2
->GetRoutingID()));
2196 // Flip the visibility and check again.
2198 rvh2
->WasShown(ui::LatencyInfo());
2199 base::RunLoop().RunUntilIdle();
2201 EXPECT_FALSE(scheduler
->IsClientVisibleForTesting(rvh1
->GetProcess()->GetID(),
2202 rvh1
->GetRoutingID()));
2203 EXPECT_TRUE(scheduler
->IsClientVisibleForTesting(rvh2
->GetProcess()->GetID(),
2204 rvh2
->GetRoutingID()));
2206 web_contents_1
.reset();
2207 web_contents_2
.reset();
2208 base::RunLoop().RunUntilIdle();
2210 browser_context
.reset();
2211 render_process_host_factory
.reset();
2214 } // unnamed namespace
2216 } // namespace content