Index: content/browser/loader/resource_scheduler_unittest.cc |
diff --git a/content/browser/loader/resource_scheduler_unittest.cc b/content/browser/loader/resource_scheduler_unittest.cc |
index b3dbf3778d85e0f15839c1ea78bb71906ff22f59..5d06268ccbd09f4d16ce9ad430a3c3bd54a84cf7 100644 |
--- a/content/browser/loader/resource_scheduler_unittest.cc |
+++ b/content/browser/loader/resource_scheduler_unittest.cc |
@@ -32,6 +32,12 @@ class TestRequestFactory; |
const int kChildId = 30; |
const int kRouteId = 75; |
+const int kChildId2 = 43; |
+const int kRouteId2 = 67; |
+const int kBackgroundChildId = 35; |
+const int kBackgroundRouteId = 43; |
+const int kBackgroundChildId2 = 54; |
+const int kBackgroundRouteId2 = 82; |
class TestRequest : public ResourceController { |
public: |
@@ -42,6 +48,7 @@ class TestRequest : public ResourceController { |
url_request_(url_request.Pass()) { |
throttle_->set_controller_for_testing(this); |
} |
+ virtual ~TestRequest() {} |
bool started() const { return started_; } |
@@ -51,11 +58,15 @@ class TestRequest : public ResourceController { |
started_ = !deferred; |
} |
+ virtual void Cancel() OVERRIDE { |
+ // Alert the scheduler that the request can be deleted. |
+ throttle_.reset(0); |
+ } |
+ |
const net::URLRequest* url_request() const { return url_request_.get(); } |
protected: |
// ResourceController interface: |
- virtual void Cancel() OVERRIDE {} |
virtual void CancelAndIgnore() OVERRIDE {} |
virtual void CancelWithError(int error_code) OVERRIDE {} |
virtual void Resume() OVERRIDE { started_ = true; } |
@@ -70,8 +81,7 @@ class CancelingTestRequest : public TestRequest { |
public: |
CancelingTestRequest(scoped_ptr<ResourceThrottle> throttle, |
scoped_ptr<net::URLRequest> url_request) |
- : TestRequest(throttle.Pass(), url_request.Pass()) { |
- } |
+ : TestRequest(throttle.Pass(), url_request.Pass()) {} |
void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) { |
request_to_cancel_ = request_to_cancel.Pass(); |
@@ -127,66 +137,115 @@ class ResourceSchedulerTest : public testing::Test { |
: next_request_id_(0), |
ui_thread_(BrowserThread::UI, &message_loop_), |
io_thread_(BrowserThread::IO, &message_loop_) { |
+ // TODO(aiolos): remove when throttling and coalescing have both landed |
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, |
+ false /* should_coalesce */); |
+ |
scheduler_.OnClientCreated(kChildId, kRouteId); |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, true); |
+ scheduler_.OnClientCreated(kBackgroundChildId, kBackgroundRouteId); |
context_.set_http_server_properties(http_server_properties_.GetWeakPtr()); |
} |
virtual ~ResourceSchedulerTest() { |
scheduler_.OnClientDeleted(kChildId, kRouteId); |
+ scheduler_.OnClientDeleted(kBackgroundChildId, kBackgroundRouteId); |
} |
- scoped_ptr<net::URLRequest> NewURLRequestWithRoute( |
+ scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute( |
const char* url, |
net::RequestPriority priority, |
- int route_id) { |
+ int child_id, |
+ int route_id, |
+ bool is_async) { |
scoped_ptr<net::URLRequest> url_request( |
context_.CreateRequest(GURL(url), priority, NULL, NULL)); |
ResourceRequestInfoImpl* info = new ResourceRequestInfoImpl( |
- PROCESS_TYPE_RENDERER, // process_type |
- kChildId, // child_id |
- route_id, // route_id |
- 0, // origin_pid |
- ++next_request_id_, // request_id |
- MSG_ROUTING_NONE, // render_frame_id |
- false, // is_main_frame |
- false, // parent_is_main_frame |
- 0, // parent_render_frame_id |
- ResourceType::SUB_RESOURCE, // resource_type |
- PAGE_TRANSITION_LINK, // transition_type |
- false, // should_replace_current_entry |
- false, // is_download |
- false, // is_stream |
- true, // allow_download |
- false, // has_user_gesture |
- blink::WebReferrerPolicyDefault, // referrer_policy |
- blink::WebPageVisibilityStateVisible, // visibility_state |
- NULL, // context |
+ PROCESS_TYPE_RENDERER, // process_type |
+ child_id, // child_id |
+ route_id, // route_id |
+ 0, // origin_pid |
+ ++next_request_id_, // request_id |
+ MSG_ROUTING_NONE, // render_frame_id |
+ false, // is_main_frame |
+ false, // parent_is_main_frame |
+ 0, // parent_render_frame_id |
+ ResourceType::SUB_RESOURCE, // resource_type |
+ PAGE_TRANSITION_LINK, // transition_type |
+ false, // should_replace_current_entry |
+ false, // is_download |
+ false, // is_stream |
+ true, // allow_download |
+ false, // has_user_gesture |
+ blink::WebReferrerPolicyDefault, // referrer_policy |
+ blink::WebPageVisibilityStateVisible, // visibility_state |
+ NULL, // context |
base::WeakPtr<ResourceMessageFilter>(), // filter |
- true); // is_async |
+ is_async); // is_async |
info->AssociateWithRequest(url_request.get()); |
return url_request.Pass(); |
} |
scoped_ptr<net::URLRequest> NewURLRequest(const char* url, |
net::RequestPriority priority) { |
- return NewURLRequestWithRoute(url, priority, kRouteId); |
+ return NewURLRequestWithChildAndRoute( |
+ url, priority, kChildId, kRouteId, true); |
} |
TestRequest* NewRequestWithRoute(const char* url, |
net::RequestPriority priority, |
int route_id) { |
- scoped_ptr<net::URLRequest> url_request( |
- NewURLRequestWithRoute(url, priority, route_id)); |
- scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest( |
- kChildId, route_id, url_request.get())); |
+ return NewRequestWithChildAndRoute(url, priority, route_id, kChildId); |
+ } |
+ |
+ TestRequest* NewRequestWithChildAndRoute(const char* url, |
+ net::RequestPriority priority, |
+ int child_id, |
+ int route_id) { |
+ return GetNewTestRequest(url, priority, child_id, route_id, true); |
+ } |
+ |
+ TestRequest* NewRequest(const char* url, net::RequestPriority priority) { |
+ return NewRequestWithChildAndRoute(url, priority, kChildId, kRouteId); |
+ } |
+ |
+ TestRequest* NewBackgroundRequest(const char* url, |
+ net::RequestPriority priority) { |
+ return NewRequestWithChildAndRoute( |
+ url, priority, kBackgroundChildId, kBackgroundRouteId); |
+ } |
+ |
+ TestRequest* NewSyncRequest(const char* url, net::RequestPriority priority) { |
+ return NewSyncRequestWithChildAndRoute(url, priority, kChildId, kRouteId); |
+ } |
+ |
+ TestRequest* NewBackgroundSyncRequest(const char* url, |
+ net::RequestPriority priority) { |
+ return NewSyncRequestWithChildAndRoute( |
+ url, priority, kBackgroundChildId, kBackgroundRouteId); |
+ } |
+ |
+ TestRequest* NewSyncRequestWithChildAndRoute(const char* url, |
+ net::RequestPriority priority, |
+ int child_id, |
+ int route_id) { |
+ return GetNewTestRequest(url, priority, child_id, route_id, false); |
+ } |
+ |
+ TestRequest* GetNewTestRequest(const char* url, |
+ net::RequestPriority priority, |
+ int child_id, |
+ int route_id, |
+ bool is_async) { |
+ scoped_ptr<net::URLRequest> url_request(NewURLRequestWithChildAndRoute( |
+ url, priority, child_id, route_id, is_async)); |
+ scoped_ptr<ResourceThrottle> throttle( |
+ scheduler_.ScheduleRequest(child_id, route_id, url_request.get())); |
TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); |
request->Start(); |
return request; |
} |
- TestRequest* NewRequest(const char* url, net::RequestPriority priority) { |
- return NewRequestWithRoute(url, priority, kRouteId); |
- } |
void ChangeRequestPriority(TestRequest* request, |
net::RequestPriority new_priority, |
@@ -243,7 +302,7 @@ TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { |
net::HostPortPair("spdyhost", 443), true); |
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
scoped_ptr<TestRequest> low_spdy( |
- NewRequest("https://spdyhost/high", net::LOWEST)); |
+ NewRequest("https://spdyhost/low", net::LOWEST)); |
scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); |
EXPECT_TRUE(high->started()); |
@@ -293,8 +352,8 @@ TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { |
scoped_ptr<net::URLRequest> url_request( |
NewURLRequest("http://host/low2", net::LOWEST)); |
- scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest( |
- kChildId, kRouteId, url_request.get())); |
+ scoped_ptr<ResourceThrottle> throttle( |
+ scheduler_.ScheduleRequest(kChildId, kRouteId, url_request.get())); |
scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest( |
throttle.Pass(), url_request.Pass())); |
low2->Start(); |
@@ -427,7 +486,7 @@ TEST_F(ResourceSchedulerTest, LowerPriority) { |
TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) { |
// Dummies to enforce scheduling. |
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
- scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); |
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); |
scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); |
@@ -457,7 +516,7 @@ TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) { |
TEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) { |
// Dummies to enforce scheduling. |
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
- scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); |
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. |
ScopedVector<TestRequest> lows; |
@@ -479,13 +538,39 @@ TEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) { |
TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { |
// Dummies to enforce scheduling. |
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
- scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); |
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
scoped_ptr<TestRequest> request( |
NewRequest("chrome-extension://req", net::LOWEST)); |
EXPECT_TRUE(request->started()); |
} |
+TEST_F(ResourceSchedulerTest, ActiveLoadingSyncSchedulesImmediately) { |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ // Dummies to enforce scheduling. |
+ scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
+ |
+ scoped_ptr<TestRequest> request( |
+ NewSyncRequest("http://host/req", net::LOWEST)); |
+ EXPECT_TRUE(request->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, UnthrottledSyncSchedulesImmediately) { |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ // Dummies to enforce scheduling. |
+ scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
+ |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundSyncRequest("http://host/req", net::LOWEST)); |
+ EXPECT_TRUE(request->started()); |
+} |
+ |
TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) { |
scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
@@ -531,6 +616,1066 @@ TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { |
EXPECT_TRUE(low2->started()); |
} |
+TEST_F(ResourceSchedulerTest, ThrottledClientCreation) { |
+ EXPECT_TRUE(scheduler_.should_throttle()); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, ActiveClientThrottleUpdateOnLoadingChange) { |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, CoalesceBackgroundClientOnLoadCompletion) { |
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, |
+ true /* should_coalesce */); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::COALESCED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, UnthrottleBackgroundClientOnLoadingStarted) { |
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, |
+ true /* should_coalesce */); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::COALESCED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, false); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, OneRequestPerThrottledClient) { |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("http://host/req", net::IDLE)); |
+ |
+ EXPECT_TRUE(high->started()); |
+ EXPECT_FALSE(request->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, UnthrottleNewlyVisibleClient) { |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("http://host/req", net::IDLE)); |
+ EXPECT_FALSE(request->started()); |
+ |
+ scheduler_.OnVisibilityChanged(kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_TRUE(request->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, UnthrottleNewlyAudibleClient) { |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("http://host/req", net::IDLE)); |
+ EXPECT_FALSE(request->started()); |
+ |
+ scheduler_.OnAudibilityChanged(kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_TRUE(request->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, VisibleClientStillUnthrottledOnAudabilityChange) { |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, false); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, AudibleClientStillUnthrottledOnVisabilityChange) { |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, ThrottledClientStartsNextHighestPriorityRequest) { |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("http://host/req", net::IDLE)); |
+ // Lower priority request started first to test request prioritizaton. |
+ scoped_ptr<TestRequest> low( |
+ NewBackgroundRequest("http://host/high", net::IDLE)); |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ |
+ EXPECT_FALSE(low->started()); |
+ EXPECT_FALSE(high->started()); |
+ |
+ // request->CancelRequest(); |
+ request->Cancel(); |
+ EXPECT_TRUE(high->started()); |
+ EXPECT_FALSE(low->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, ThrottledSpdyProxySchedulesImmediately) { |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("http://host/req", net::IDLE)); |
+ |
+ EXPECT_FALSE(request->started()); |
+ |
+ scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId, |
+ kBackgroundRouteId); |
+ EXPECT_TRUE(request->started()); |
+ |
+ scoped_ptr<TestRequest> after( |
+ NewBackgroundRequest("http://host/after", net::IDLE)); |
+ EXPECT_TRUE(after->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, CoalescedClientIssuesNoRequests) { |
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, |
+ true /* should_coalesce */); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::COALESCED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("http://host/req", net::IDLE)); |
+ |
+ EXPECT_FALSE(high->started()); |
+ EXPECT_FALSE(request->started()); |
+ |
+ scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId, |
+ kBackgroundRouteId); |
+ EXPECT_FALSE(high->started()); |
+ |
+ scoped_ptr<TestRequest> after( |
+ NewBackgroundRequest("http://host/after", net::HIGHEST)); |
+ EXPECT_FALSE(after->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, CoalescedSpdyProxyWaits) { |
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, |
+ true /* should_coalesce */); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::COALESCED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("http://host/req", net::IDLE)); |
+ |
+ EXPECT_FALSE(request->started()); |
+ |
+ scheduler_.OnReceivedSpdyProxiedHttpResponse(kBackgroundChildId, |
+ kBackgroundRouteId); |
+ EXPECT_FALSE(request->started()); |
+ |
+ scoped_ptr<TestRequest> after( |
+ NewBackgroundRequest("http://host/after", net::IDLE)); |
+ EXPECT_FALSE(after->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, ThrottledNonHTTPSchedulesImmediately) { |
+ // Dummies to enforce scheduling. |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> low( |
+ NewBackgroundRequest("http://host/low", net::LOWEST)); |
+ |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("chrome-extension://req", net::LOWEST)); |
+ EXPECT_TRUE(request->started()); |
+ EXPECT_FALSE(low->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, CoalescedNonHTTPSchedulesImmediately) { |
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, |
+ true /* should_coalesce */); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::COALESCED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ // Dummies to enforce scheduling. |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> low( |
+ NewBackgroundRequest("http://host/low", net::LOWEST)); |
+ |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundRequest("chrome-extension://req", net::LOWEST)); |
+ EXPECT_TRUE(request->started()); |
+ EXPECT_FALSE(low->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, ThrottledSyncSchedulesImmediately) { |
+ // Dummies to enforce scheduling. |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> low( |
+ NewBackgroundRequest("http://host/low", net::LOWEST)); |
+ |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundSyncRequest("http://host/req", net::LOWEST)); |
+ EXPECT_TRUE(request->started()); |
+ EXPECT_FALSE(low->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, CoalescedSyncSchedulesImmediately) { |
+ scheduler_.SetThrottleOptionsForTesting(true /* should_throttle */, |
+ true /* should_coalesce */); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::COALESCED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ // Dummies to enforce scheduling. |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> low( |
+ NewBackgroundRequest("http://host/low", net::LOWEST)); |
+ |
+ scoped_ptr<TestRequest> request( |
+ NewBackgroundSyncRequest("http://host/req", net::LOWEST)); |
+ EXPECT_TRUE(request->started()); |
+ EXPECT_FALSE(low->started()); |
+ EXPECT_FALSE(high->started()); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, AllBackgroundClientsUnthrottle) { |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, |
+ UnloadedClientVisibilityChangedCorrectlyUnthrottles) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ |
+ // 1 visible, 3 hidden |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 2 visible, 2 hidden |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible, 3 hidden |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, |
+ UnloadedClientAudibilityChangedCorrectlyUnthrottles) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); |
+ |
+ // 1 audible, 3 hidden |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 2 audible, 2 hidden |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 audible, 3 hidden |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, |
+ LoadedClientVisibilityChangedCorrectlyUnthrottles) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ // 1 visible, 3 hidden |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 2 visible, 2 hidden |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible, 3 hidden |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, |
+ LoadedClientAudibilityChangedCorrectlyUnthrottles) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); |
+ // 1 audible, 3 hidden |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 2 audible, 2 hidden |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 audible, 3 hidden |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, UnloadedClientBecomesHiddenCorrectlyUnthrottles) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ |
+ // 2 visible, 2 hidden |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible, 3 hidden |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 0 visible, 4 hidden |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible, 3 hidden |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, UnloadedClientBecomesSilentCorrectlyUnthrottles) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); |
+ // 2 audible, 2 hidden |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 audible, 3 hidden |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 0 audible, 4 hidden |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, false); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 audible, 3 hidden |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, LoadedClientBecomesHiddenCorrectlyThrottles) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ // 2 visible, 2 hidden |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible, 3 hidden |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 0 visible, 4 hidden |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible, 3 hidden |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, LoadedClientBecomesSilentCorrectlyThrottles) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); |
+ scheduler_.OnVisibilityChanged(kChildId, kRouteId, false); |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, true); |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); |
+ // 2 audible, 2 hidden |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 audible, 3 hidden |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 0 audible, 4 hidden |
+ scheduler_.OnAudibilityChanged(kChildId, kRouteId, false); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 audible, 3 hidden |
+ scheduler_.OnAudibilityChanged(kChildId2, kRouteId2, true); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, HiddenLoadedChangesCorrectlyStayThrottled) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ |
+ // 1 visible and 2 hidden loading, 1 visible loaded |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible loading, 1 visible and 2 hidden loaded |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId, kBackgroundRouteId, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible and 1 hidden loading, 1 visible and 1 hidden loaded |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, PartialVisibleClientLoadedDoesNotUnthrottle) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ |
+ // 2 visible loading, 1 hidden loading, 1 hidden loaded |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 2 visible loading, 1 hidden loading, 1 hidden loaded |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, FullVisibleLoadedCorrectlyUnthrottle) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ |
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ scheduler_.OnLoadingStateChanged(kChildId2, kRouteId2, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scoped_ptr<TestRequest> high( |
+ NewBackgroundRequest("http://host/high", net::HIGHEST)); |
+ scoped_ptr<TestRequest> low( |
+ NewBackgroundRequest("http://host/low", net::LOWEST)); |
+ |
+ EXPECT_TRUE(high->started()); |
+ EXPECT_FALSE(low->started()); |
+ |
+ // 2 visible loaded, 1 hidden loading, 1 hidden loaded |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ // kBackgroundClientId unthrottling should unthrottle it's request. |
+ EXPECT_TRUE(low->started()); |
+ |
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
+TEST_F(ResourceSchedulerTest, |
+ ActiveAndLoadingClientDeletedCorrectlyUnthrottle) { |
+ scheduler_.OnClientCreated(kChildId2, kRouteId2); |
+ scheduler_.OnClientCreated(kBackgroundChildId2, kBackgroundRouteId2); |
+ scheduler_.OnVisibilityChanged(kChildId2, kRouteId2, true); |
+ |
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading |
+ scheduler_.OnLoadingStateChanged( |
+ kBackgroundChildId2, kBackgroundRouteId2, true); |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, true); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId2, kRouteId2)); |
+ |
+ // 1 visible loaded, 1 hidden loading, 1 hidden loaded |
+ scheduler_.OnClientDeleted(kChildId2, kRouteId2); |
+ EXPECT_TRUE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::UNTHROTTLED, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading |
+ scheduler_.OnLoadingStateChanged(kChildId, kRouteId, false); |
+ EXPECT_FALSE(scheduler_.active_clients_loaded()); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId, |
+ kBackgroundRouteId)); |
+ EXPECT_EQ(ResourceScheduler::THROTTLED, |
+ scheduler_.GetClientStateForTesting(kBackgroundChildId2, |
+ kBackgroundRouteId2)); |
+ EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, |
+ scheduler_.GetClientStateForTesting(kChildId, kRouteId)); |
+ |
+ scheduler_.OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); |
+} |
+ |
} // unnamed namespace |
} // namespace content |