diff options
Diffstat (limited to 'chromium/content/browser/loader/resource_scheduler_unittest.cc')
-rw-r--r-- | chromium/content/browser/loader/resource_scheduler_unittest.cc | 1908 |
1 files changed, 175 insertions, 1733 deletions
diff --git a/chromium/content/browser/loader/resource_scheduler_unittest.cc b/chromium/content/browser/loader/resource_scheduler_unittest.cc index 1399b52dde3..59b6d0055b9 100644 --- a/chromium/content/browser/loader/resource_scheduler_unittest.cc +++ b/chromium/content/browser/loader/resource_scheduler_unittest.cc @@ -46,13 +46,11 @@ 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: - TestRequest(scoped_ptr<net::URLRequest> url_request, - scoped_ptr<ResourceThrottle> throttle, + TestRequest(std::unique_ptr<net::URLRequest> url_request, + std::unique_ptr<ResourceThrottle> throttle, ResourceScheduler* scheduler) : started_(false), url_request_(std::move(url_request)), @@ -94,19 +92,19 @@ class TestRequest : public ResourceController { private: bool started_; - scoped_ptr<net::URLRequest> url_request_; - scoped_ptr<ResourceThrottle> throttle_; + std::unique_ptr<net::URLRequest> url_request_; + std::unique_ptr<ResourceThrottle> throttle_; ResourceScheduler* scheduler_; }; class CancelingTestRequest : public TestRequest { public: - CancelingTestRequest(scoped_ptr<net::URLRequest> url_request, - scoped_ptr<ResourceThrottle> throttle, + CancelingTestRequest(std::unique_ptr<net::URLRequest> url_request, + std::unique_ptr<ResourceThrottle> throttle, ResourceScheduler* scheduler) : TestRequest(std::move(url_request), std::move(throttle), scheduler) {} - void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) { + void set_request_to_cancel(std::unique_ptr<TestRequest> request_to_cancel) { request_to_cancel_ = std::move(request_to_cancel); } @@ -116,7 +114,7 @@ class CancelingTestRequest : public TestRequest { request_to_cancel_.reset(); } - scoped_ptr<TestRequest> request_to_cancel_; + std::unique_ptr<TestRequest> request_to_cancel_; }; class FakeResourceContext : public ResourceContext { @@ -148,16 +146,9 @@ class ResourceSchedulerTest : public testing::Test { // mock_timer_. scheduler_.reset(new ResourceScheduler()); - mock_timer_ = new base::MockTimer(true, true); - scheduler_->set_timer_for_testing(scoped_ptr<base::Timer>(mock_timer_)); - - // TODO(aiolos): Remove when throttling and coalescing have both landed. - scheduler_->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - - scheduler_->OnClientCreated(kChildId, kRouteId, true, false); + scheduler_->OnClientCreated(kChildId, kRouteId); scheduler_->OnClientCreated( - kBackgroundChildId, kBackgroundRouteId, false, false); + kBackgroundChildId, kBackgroundRouteId); } void CleanupScheduler() { @@ -171,23 +162,22 @@ class ResourceSchedulerTest : public testing::Test { // as the argument to kForceFieldTrials. bool InitializeFieldTrials(const std::string& force_field_trial_argument) { return base::FieldTrialList::CreateTrialsFromString( - force_field_trial_argument, - base::FieldTrialList::DONT_ACTIVATE_TRIALS, - std::set<std::string>()); + force_field_trial_argument, std::set<std::string>()); } - scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute( + std::unique_ptr<net::URLRequest> NewURLRequestWithChildAndRoute( const char* url, net::RequestPriority priority, int child_id, int route_id) { - scoped_ptr<net::URLRequest> url_request( + std::unique_ptr<net::URLRequest> url_request( context_.CreateRequest(GURL(url), priority, NULL)); return url_request; } - scoped_ptr<net::URLRequest> NewURLRequest(const char* url, - net::RequestPriority priority) { + std::unique_ptr<net::URLRequest> NewURLRequest( + const char* url, + net::RequestPriority priority) { return NewURLRequestWithChildAndRoute(url, priority, kChildId, kRouteId); } @@ -236,9 +226,9 @@ class ResourceSchedulerTest : public testing::Test { int child_id, int route_id, bool is_async) { - scoped_ptr<net::URLRequest> url_request( + std::unique_ptr<net::URLRequest> url_request( NewURLRequestWithChildAndRoute(url, priority, child_id, route_id)); - scoped_ptr<ResourceThrottle> throttle(scheduler_->ScheduleRequest( + std::unique_ptr<ResourceThrottle> throttle(scheduler_->ScheduleRequest( child_id, route_id, is_async, url_request.get())); TestRequest* request = new TestRequest(std::move(url_request), std::move(throttle), scheduler()); @@ -265,7 +255,7 @@ class ResourceSchedulerTest : public testing::Test { BrowserThreadImpl ui_thread_; BrowserThreadImpl io_thread_; ResourceDispatcherHostImpl rdh_; - scoped_ptr<ResourceScheduler> scheduler_; + std::unique_ptr<ResourceScheduler> scheduler_; base::FieldTrialList field_trial_list_; base::MockTimer* mock_timer_; net::HttpServerPropertiesImpl http_server_properties_; @@ -273,14 +263,16 @@ class ResourceSchedulerTest : public testing::Test { }; TEST_F(ResourceSchedulerTest, OneIsolatedLowRequest) { - scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOWEST)); + std::unique_ptr<TestRequest> request( + NewRequest("http://host/1", net::LOWEST)); EXPECT_TRUE(request->started()); } TEST_F(ResourceSchedulerTest, OneLowLoadsUntilIdle) { - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(low->started()); EXPECT_FALSE(low2->started()); @@ -291,9 +283,10 @@ TEST_F(ResourceSchedulerTest, OneLowLoadsUntilIdle) { } TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) { - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(low->started()); EXPECT_FALSE(low2->started()); @@ -310,9 +303,10 @@ TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) { } TEST_F(ResourceSchedulerTest, OneLowLoadsUntilCriticalComplete) { - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(low->started()); EXPECT_FALSE(low2->started()); @@ -327,9 +321,10 @@ TEST_F(ResourceSchedulerTest, OneLowLoadsUntilCriticalComplete) { } TEST_F(ResourceSchedulerTest, LowDoesNotBlockCriticalComplete) { - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOW)); - scoped_ptr<TestRequest> lowest(NewRequest("http://host/lowest", net::LOWEST)); - scoped_ptr<TestRequest> lowest2( + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOW)); + std::unique_ptr<TestRequest> lowest( + NewRequest("http://host/lowest", net::LOWEST)); + std::unique_ptr<TestRequest> lowest2( NewRequest("http://host/lowest", net::LOWEST)); EXPECT_TRUE(low->started()); EXPECT_TRUE(lowest->started()); @@ -343,11 +338,12 @@ TEST_F(ResourceSchedulerTest, LowDoesNotBlockCriticalComplete) { TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { http_server_properties_.SetSupportsSpdy( net::HostPortPair("spdyhost", 443), true); - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low_spdy( + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low_spdy( 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)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(low_spdy->started()); EXPECT_TRUE(low->started()); @@ -362,9 +358,10 @@ TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { TEST_F(ResourceSchedulerTest, NavigationResetsState) { scheduler()->OnWillInsertBody(kChildId, kRouteId); scheduler()->OnNavigate(kChildId, kRouteId); - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(low->started()); EXPECT_FALSE(low2->started()); @@ -372,16 +369,18 @@ TEST_F(ResourceSchedulerTest, NavigationResetsState) { TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) { const int route_id = 0; // Indicates a background request. - scoped_ptr<TestRequest> request(NewRequestWithRoute("http://host/1", - net::LOWEST, route_id)); + std::unique_ptr<TestRequest> request( + NewRequestWithRoute("http://host/1", net::LOWEST, route_id)); EXPECT_TRUE(request->started()); } TEST_F(ResourceSchedulerTest, StartMultipleLowRequestsWhenIdle) { - scoped_ptr<TestRequest> high1(NewRequest("http://host/high1", net::HIGHEST)); - scoped_ptr<TestRequest> high2(NewRequest("http://host/high2", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high1( + NewRequest("http://host/high1", net::HIGHEST)); + std::unique_ptr<TestRequest> high2( + NewRequest("http://host/high2", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high1->started()); EXPECT_TRUE(high2->started()); EXPECT_TRUE(low->started()); @@ -397,20 +396,24 @@ TEST_F(ResourceSchedulerTest, StartMultipleLowRequestsWhenIdle) { } TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low1( + NewRequest("http://host/low1", net::LOWEST)); - scoped_ptr<net::URLRequest> url_request( + std::unique_ptr<net::URLRequest> url_request( NewURLRequest("http://host/low2", net::LOWEST)); - scoped_ptr<ResourceThrottle> throttle(scheduler()->ScheduleRequest( + std::unique_ptr<ResourceThrottle> throttle(scheduler()->ScheduleRequest( kChildId, kRouteId, true, url_request.get())); - scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest( + std::unique_ptr<CancelingTestRequest> low2(new CancelingTestRequest( std::move(url_request), std::move(throttle), scheduler())); low2->Start(); - scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST)); + std::unique_ptr<TestRequest> low3( + NewRequest("http://host/low3", net::LOWEST)); low2->set_request_to_cancel(std::move(low3)); - scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST)); + std::unique_ptr<TestRequest> low4( + NewRequest("http://host/low4", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_FALSE(low2->started()); @@ -427,7 +430,8 @@ TEST_F(ResourceSchedulerTest, LimitedNumberOfDelayableRequestsInFlight) { scheduler()->OnWillInsertBody(kChildId, kRouteId); // Throw in one high priority request to make sure that's not a factor. - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); EXPECT_TRUE(high->started()); const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. @@ -440,10 +444,10 @@ TEST_F(ResourceSchedulerTest, LimitedNumberOfDelayableRequestsInFlight) { EXPECT_TRUE(lows_singlehost[i]->started()); } - scoped_ptr<TestRequest> second_last_singlehost(NewRequest("http://host/last", - net::LOWEST)); - scoped_ptr<TestRequest> last_singlehost(NewRequest("http://host/s_last", - net::LOWEST)); + std::unique_ptr<TestRequest> second_last_singlehost( + NewRequest("http://host/last", net::LOWEST)); + std::unique_ptr<TestRequest> last_singlehost( + NewRequest("http://host/s_last", net::LOWEST)); EXPECT_FALSE(second_last_singlehost->started()); @@ -468,17 +472,19 @@ TEST_F(ResourceSchedulerTest, LimitedNumberOfDelayableRequestsInFlight) { EXPECT_TRUE(lows_different_host[i]->started()); } - scoped_ptr<TestRequest> last_different_host(NewRequest("http://host_new/last", - net::LOWEST)); + std::unique_ptr<TestRequest> last_different_host( + NewRequest("http://host_new/last", net::LOWEST)); EXPECT_FALSE(last_different_host->started()); } TEST_F(ResourceSchedulerTest, RaisePriorityAndStart) { // Dummies to enforce scheduling. - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/req", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/req", net::LOWEST)); - scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); + std::unique_ptr<TestRequest> request( + NewRequest("http://host/req", net::LOWEST)); EXPECT_FALSE(request->started()); ChangeRequestPriority(request.get(), net::HIGHEST); @@ -488,11 +494,13 @@ TEST_F(ResourceSchedulerTest, RaisePriorityAndStart) { TEST_F(ResourceSchedulerTest, RaisePriorityInQueue) { // Dummies to enforce scheduling. - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); - scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); + std::unique_ptr<TestRequest> request( + NewRequest("http://host/req", net::IDLE)); + std::unique_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); EXPECT_FALSE(request->started()); EXPECT_FALSE(idle->started()); @@ -518,11 +526,13 @@ TEST_F(ResourceSchedulerTest, RaisePriorityInQueue) { TEST_F(ResourceSchedulerTest, LowerPriority) { // Dummies to enforce scheduling. - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_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)); + std::unique_ptr<TestRequest> request( + NewRequest("http://host/req", net::LOWEST)); + std::unique_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); EXPECT_FALSE(request->started()); EXPECT_FALSE(idle->started()); @@ -551,11 +561,13 @@ 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/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_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)); + std::unique_ptr<TestRequest> request( + NewRequest("http://host/req", net::LOWEST)); + std::unique_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); EXPECT_FALSE(request->started()); EXPECT_FALSE(idle->started()); @@ -584,8 +596,9 @@ 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/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. ScopedVector<TestRequest> lows; @@ -594,7 +607,8 @@ TEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) { lows.push_back(NewRequest(url.c_str(), net::IDLE)); } - scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); + std::unique_ptr<TestRequest> request( + NewRequest("http://host/req", net::IDLE)); EXPECT_FALSE(request->started()); ChangeRequestPriority(request.get(), net::IDLE, 1); @@ -609,58 +623,30 @@ 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/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> request( + std::unique_ptr<TestRequest> request( NewRequest("chrome-extension://req", net::LOWEST)); EXPECT_TRUE(request->started()); } -TEST_F(ResourceSchedulerTest, ActiveLoadingSyncSchedulesImmediately) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); + std::unique_ptr<TestRequest> request( + NewRequest("http://host/req", net::IDLE)); EXPECT_FALSE(request->started()); scheduler()->OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(request->started()); - scoped_ptr<TestRequest> after(NewRequest("http://host/after", net::IDLE)); + std::unique_ptr<TestRequest> after( + NewRequest("http://host/after", net::IDLE)); EXPECT_TRUE(after->started()); } @@ -668,7 +654,7 @@ TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { scheduler()->OnWillInsertBody(kChildId, kRouteId); const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. - scoped_ptr<TestRequest> low1_spdy( + std::unique_ptr<TestRequest> low1_spdy( NewRequest("http://spdyhost1:8080/low", net::LOWEST)); // Cancel a request after we learn the server supports SPDY. ScopedVector<TestRequest> lows; @@ -676,7 +662,7 @@ TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { string url = "http://host" + base::IntToString(i) + "/low"; lows.push_back(NewRequest(url.c_str(), net::LOWEST)); } - scoped_ptr<TestRequest> low1(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low1(NewRequest("http://host/low", net::LOWEST)); EXPECT_FALSE(low1->started()); http_server_properties_.SetSupportsSpdy( net::HostPortPair("spdyhost1", 8080), true); @@ -686,7 +672,7 @@ TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { low1.reset(); base::RunLoop().RunUntilIdle(); - scoped_ptr<TestRequest> low2_spdy( + std::unique_ptr<TestRequest> low2_spdy( NewRequest("http://spdyhost2:8080/low", net::IDLE)); // Reprioritize a request after we learn the server supports SPDY. EXPECT_TRUE(low2_spdy->started()); @@ -694,1565 +680,10 @@ TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { net::HostPortPair("spdyhost2", 8080), true); ChangeRequestPriority(low2_spdy.get(), net::LOWEST); base::RunLoop().RunUntilIdle(); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(low2->started()); } -TEST_F(ResourceSchedulerTest, ThrottledClientCreation) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - EXPECT_TRUE(scheduler()->should_throttle()); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - - EXPECT_EQ(ResourceScheduler::THROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId2, - kBackgroundRouteId2)); - scheduler()->OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); -} - -TEST_F(ResourceSchedulerTest, ActiveClientThrottleUpdateOnLoadingChange) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_TRUE(request->started()); -} - -TEST_F(ResourceSchedulerTest, UnthrottleNewlyAudibleClient) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_TRUE(request->started()); -} - -TEST_F(ResourceSchedulerTest, VisibleClientStillUnthrottledOnAudabilityChange) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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->Cancel(); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(high->started()); - EXPECT_FALSE(low->started()); -} - -TEST_F(ResourceSchedulerTest, ThrottledSpdyProxySchedulesImmediately) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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); - base::RunLoop().RunUntilIdle(); - 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); - base::RunLoop().RunUntilIdle(); - 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); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(request->started()); - - scoped_ptr<TestRequest> after( - NewBackgroundRequest("http://host/after", net::IDLE)); - EXPECT_FALSE(after->started()); -} - -TEST_F(ResourceSchedulerTest, ThrottledNonHTTPSchedulesImmediately) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - // 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - // 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, false, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, false, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, false, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, false, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, true, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, 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::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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, false, true); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, true); - scheduler()->OnAudibilityChanged(kChildId, kRouteId, true); - scheduler()->OnVisibilityChanged(kChildId, kRouteId, false); - // 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, true, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, true); - scheduler()->OnLoadingStateChanged(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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, false, true); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, true); - scheduler()->OnLoadingStateChanged(kChildId2, kRouteId2, true); - scheduler()->OnVisibilityChanged(kChildId, kRouteId, false); - scheduler()->OnAudibilityChanged(kChildId, kRouteId, 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, true, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - - // 1 visible and 2 hidden loading, 1 visible loaded - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, true, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - - // 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, true, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - - // 1 visible and 1 hidden loaded, 1 visible and 1 hidden loading - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, true); - scheduler()->OnLoadingStateChanged(kChildId2, kRouteId2, true); - base::RunLoop().RunUntilIdle(); - 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); - base::RunLoop().RunUntilIdle(); - 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); - base::RunLoop().RunUntilIdle(); - 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) { - // TODO(aiolos): remove when throttling and coalescing have both landed - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - false /* should_coalesce */); - scheduler()->OnClientCreated(kChildId2, kRouteId2, true, false); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - - // 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); -} - -TEST_F(ResourceSchedulerTest, CoalescedClientCreationStartsTimer) { - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - true /* should_coalesce */); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged(kChildId, kRouteId, true); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId, kBackgroundRouteId, true); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_TRUE(mock_timer_->IsRunning()); -} - -TEST_F(ResourceSchedulerTest, ActiveLoadingClientLoadedAndHiddenStartsTimer) { - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - true /* should_coalesce */); - EXPECT_FALSE(mock_timer_->IsRunning()); - EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, - scheduler()->GetClientStateForTesting(kChildId, kRouteId)); - EXPECT_EQ(ResourceScheduler::THROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_FALSE(mock_timer_->IsRunning()); - - scheduler()->OnLoadingStateChanged(kChildId, kRouteId, true); - EXPECT_EQ(ResourceScheduler::UNTHROTTLED, - scheduler()->GetClientStateForTesting(kChildId, kRouteId)); - EXPECT_EQ(ResourceScheduler::UNTHROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_FALSE(mock_timer_->IsRunning()); - - scheduler()->OnVisibilityChanged(kChildId, kRouteId, false); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kChildId, kRouteId)); - EXPECT_EQ(ResourceScheduler::UNTHROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_TRUE(mock_timer_->IsRunning()); -} - -TEST_F(ResourceSchedulerTest, ActiveLoadingClientHiddenAndLoadedStartsTimer) { - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - true /* should_coalesce */); - EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, - scheduler()->GetClientStateForTesting(kChildId, kRouteId)); - EXPECT_EQ(ResourceScheduler::THROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_FALSE(mock_timer_->IsRunning()); - - scheduler()->OnVisibilityChanged(kChildId, kRouteId, false); - EXPECT_EQ(ResourceScheduler::UNTHROTTLED, - scheduler()->GetClientStateForTesting(kChildId, kRouteId)); - EXPECT_FALSE(mock_timer_->IsRunning()); - - scheduler()->OnLoadingStateChanged(kChildId, kRouteId, true); - EXPECT_EQ(ResourceScheduler::UNTHROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kChildId, kRouteId)); - EXPECT_EQ(ResourceScheduler::UNTHROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_TRUE(mock_timer_->IsRunning()); -} - -TEST_F(ResourceSchedulerTest, CoalescedClientBecomesAudibleStopsTimer) { - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - true /* should_coalesce */); - scheduler()->OnLoadingStateChanged(kChildId, kRouteId, true); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId, kBackgroundRouteId, true); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_TRUE(mock_timer_->IsRunning()); - - scheduler()->OnAudibilityChanged( - kBackgroundChildId, kBackgroundRouteId, true); - EXPECT_EQ(ResourceScheduler::UNTHROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_FALSE(mock_timer_->IsRunning()); -} - -TEST_F(ResourceSchedulerTest, LastCoalescedClientDeletionStopsTimer) { - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - true /* should_coalesce */); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged(kChildId, kRouteId, true); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId, kBackgroundRouteId, true); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, true); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId2, - kBackgroundRouteId2)); - EXPECT_TRUE(mock_timer_->IsRunning()); - - scheduler()->OnClientDeleted(kBackgroundChildId, kBackgroundRouteId); - EXPECT_TRUE(mock_timer_->IsRunning()); - - scheduler()->OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); - EXPECT_FALSE(mock_timer_->IsRunning()); - - // To avoid errors on test tear down. - scheduler()->OnClientCreated( - kBackgroundChildId, kBackgroundRouteId, false, false); -} - -TEST_F(ResourceSchedulerTest, LastCoalescedClientStartsLoadingStopsTimer) { - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - true /* should_coalesce */); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged(kChildId, kRouteId, true); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId, kBackgroundRouteId, true); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, true); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId2, - kBackgroundRouteId2)); - EXPECT_TRUE(mock_timer_->IsRunning()); - - scheduler()->OnLoadingStateChanged( - kBackgroundChildId, kBackgroundRouteId, false); - EXPECT_TRUE(mock_timer_->IsRunning()); - - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, false); - EXPECT_FALSE(mock_timer_->IsRunning()); - - // This is needed to avoid errors on test tear down. - scheduler()->OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); -} - -TEST_F(ResourceSchedulerTest, LastCoalescedClientBecomesVisibleStopsTimer) { - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - true /* should_coalesce */); - scheduler()->OnClientCreated( - kBackgroundChildId2, kBackgroundRouteId2, false, false); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged(kChildId, kRouteId, true); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId, kBackgroundRouteId, true); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId2, kBackgroundRouteId2, true); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId2, - kBackgroundRouteId2)); - EXPECT_TRUE(mock_timer_->IsRunning()); - - scheduler()->OnVisibilityChanged( - kBackgroundChildId, kBackgroundRouteId, true); - EXPECT_TRUE(mock_timer_->IsRunning()); - - scheduler()->OnVisibilityChanged( - kBackgroundChildId2, kBackgroundRouteId2, true); - EXPECT_FALSE(mock_timer_->IsRunning()); - - // To avoid errors on test tear down. - scheduler()->OnClientDeleted(kBackgroundChildId2, kBackgroundRouteId2); -} - -TEST_F(ResourceSchedulerTest, - CoalescedClientBecomesLoadingAndVisibleStopsTimer) { - scheduler()->SetThrottleOptionsForTesting(true /* should_throttle */, - true /* should_coalesce */); - scheduler()->OnLoadingStateChanged(kChildId, kRouteId, true); - EXPECT_FALSE(mock_timer_->IsRunning()); - scheduler()->OnLoadingStateChanged( - kBackgroundChildId, kBackgroundRouteId, true); - EXPECT_EQ(ResourceScheduler::COALESCED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_TRUE(mock_timer_->IsRunning()); - - scheduler()->OnLoadingStateChanged( - kBackgroundChildId, kBackgroundRouteId, false); - EXPECT_EQ(ResourceScheduler::UNTHROTTLED, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_FALSE(mock_timer_->IsRunning()); - - scheduler()->OnVisibilityChanged( - kBackgroundChildId, kBackgroundRouteId, true); - EXPECT_EQ(ResourceScheduler::ACTIVE_AND_LOADING, - scheduler()->GetClientStateForTesting(kBackgroundChildId, - kBackgroundRouteId)); - EXPECT_FALSE(mock_timer_->IsRunning()); -} - -TEST_F(ResourceSchedulerTest, CoalescedRequestsIssueOnTimer) { - 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)); - EXPECT_TRUE(scheduler()->active_clients_loaded()); - - scoped_ptr<TestRequest> high( - NewBackgroundRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low( - NewBackgroundRequest("http://host/low", net::LOWEST)); - EXPECT_FALSE(high->started()); - EXPECT_FALSE(low->started()); - - FireCoalescingTimer(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(high->started()); - EXPECT_TRUE(low->started()); -} - -TEST_F(ResourceSchedulerTest, CoalescedRequestsUnthrottleCorrectlyOnTimer) { - 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)); - EXPECT_TRUE(scheduler()->active_clients_loaded()); - - scoped_ptr<TestRequest> high( - NewBackgroundRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> high2( - NewBackgroundRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> high3( - NewBackgroundRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> high4( - NewBackgroundRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low( - NewBackgroundRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2( - NewBackgroundRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low3( - NewBackgroundRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low4( - NewBackgroundRequest("http://host/low", net::LOWEST)); - - http_server_properties_.SetSupportsSpdy(net::HostPortPair("spdyhost", 443), - true); - scoped_ptr<TestRequest> low_spdy( - NewBackgroundRequest("https://spdyhost/low", net::LOW)); - scoped_ptr<TestRequest> sync_request( - NewBackgroundSyncRequest("http://host/req", net::LOW)); - scoped_ptr<TestRequest> non_http_request( - NewBackgroundRequest("chrome-extension://req", net::LOW)); - - // Sync requests should issue immediately. - EXPECT_TRUE(sync_request->started()); - // Non-http(s) requests should issue immediately. - EXPECT_TRUE(non_http_request->started()); - // Nothing else should issue without a timer fire. - EXPECT_FALSE(high->started()); - EXPECT_FALSE(high2->started()); - EXPECT_FALSE(high3->started()); - EXPECT_FALSE(high4->started()); - EXPECT_FALSE(low->started()); - EXPECT_FALSE(low2->started()); - EXPECT_FALSE(low3->started()); - EXPECT_FALSE(low4->started()); - EXPECT_FALSE(low_spdy->started()); - - FireCoalescingTimer(); - base::RunLoop().RunUntilIdle(); - - // All high priority requests should issue. - EXPECT_TRUE(high->started()); - EXPECT_TRUE(high2->started()); - EXPECT_TRUE(high3->started()); - EXPECT_TRUE(high4->started()); - // There should only be one net::LOWEST priority request issued with - // non-delayable requests in flight. - EXPECT_TRUE(low->started()); - EXPECT_FALSE(low2->started()); - EXPECT_FALSE(low3->started()); - EXPECT_FALSE(low4->started()); - // Spdy-Enable requests should issue regardless of priority. - EXPECT_TRUE(low_spdy->started()); -} - -TEST_F(ResourceSchedulerTest, CoalescedRequestsWaitForNextTimer) { - 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)); - EXPECT_TRUE(scheduler()->active_clients_loaded()); - - scoped_ptr<TestRequest> high( - NewBackgroundRequest("http://host/high", net::HIGHEST)); - EXPECT_FALSE(high->started()); - - FireCoalescingTimer(); - base::RunLoop().RunUntilIdle(); - - scoped_ptr<TestRequest> high2( - NewBackgroundRequest("http://host/high2", net::HIGHEST)); - scoped_ptr<TestRequest> low( - NewBackgroundRequest("http://host/low", net::LOWEST)); - - EXPECT_TRUE(high->started()); - EXPECT_FALSE(high2->started()); - EXPECT_FALSE(low->started()); - - FireCoalescingTimer(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(high->started()); - EXPECT_TRUE(high2->started()); - EXPECT_TRUE(low->started()); -} - -TEST_F(ResourceSchedulerTest, GetVisualSignalFromRenderViewHost) { - scoped_ptr<MockRenderProcessHostFactory> render_process_host_factory; - scoped_ptr<TestRenderViewHostFactory> render_view_host_factory; - scoped_ptr<TestBrowserContext> browser_context; - scoped_ptr<TestWebContents> web_contents_1; - scoped_ptr<TestWebContents> web_contents_2; - render_process_host_factory.reset(new MockRenderProcessHostFactory()); - render_view_host_factory.reset( - new TestRenderViewHostFactory(render_process_host_factory.get())); - - browser_context.reset(new TestBrowserContext()); - scoped_refptr<SiteInstance> site_instance_1 = - SiteInstance::Create(browser_context.get()); - scoped_refptr<SiteInstance> site_instance_2 = - SiteInstance::Create(browser_context.get()); - SiteInstanceImpl::set_render_process_host_factory( - render_process_host_factory.get()); - - web_contents_1.reset( - TestWebContents::Create(browser_context.get(), site_instance_1.get())); - web_contents_2.reset( - TestWebContents::Create(browser_context.get(), site_instance_2.get())); - base::RunLoop().RunUntilIdle(); - - RenderViewHostImpl* rvh1 = web_contents_1->GetRenderViewHost(); - RenderViewHostImpl* rvh2 = web_contents_2->GetRenderViewHost(); - ResourceScheduler* scheduler = ResourceDispatcherHostImpl::Get()->scheduler(); - - // Check initial visibility is set correctly. - EXPECT_EQ(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(), - rvh1->GetRoutingID()), - !rvh1->GetWidget()->is_hidden()); - EXPECT_EQ(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(), - rvh1->GetRoutingID()), - !rvh2->GetWidget()->is_hidden()); - - // 1 visible, 1 hidden. - rvh1->GetWidget()->WasShown(ui::LatencyInfo()); - rvh2->GetWidget()->WasHidden(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(), - rvh1->GetRoutingID())); - EXPECT_FALSE(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(), - rvh2->GetRoutingID())); - - // Flip the visibility and check again. - rvh1->GetWidget()->WasHidden(); - rvh2->GetWidget()->WasShown(ui::LatencyInfo()); - base::RunLoop().RunUntilIdle(); - - EXPECT_FALSE(scheduler->IsClientVisibleForTesting(rvh1->GetProcess()->GetID(), - rvh1->GetRoutingID())); - EXPECT_TRUE(scheduler->IsClientVisibleForTesting(rvh2->GetProcess()->GetID(), - rvh2->GetRoutingID())); - // Clean up. - web_contents_1.reset(); - web_contents_2.reset(); - base::RunLoop().RunUntilIdle(); - - browser_context.reset(); - render_process_host_factory.reset(); -} - TEST_F(ResourceSchedulerTest, OustandingRequestLimitEnforced) { const int kRequestLimit = 3; ASSERT_TRUE(InitializeFieldTrials( @@ -2308,9 +739,10 @@ TEST_F(ResourceSchedulerTest, OutstandingRequestLimitDelays) { kRequestLimit))); InitializeScheduler(); - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_FALSE(low->started()); EXPECT_FALSE(low2->started()); @@ -2325,12 +757,12 @@ TEST_F(ResourceSchedulerTest, OutstandingRequestLimitDelays) { // started at some point, or they will hang around forever and prevent other // async revalidations to the same URL from being issued. TEST_F(ResourceSchedulerTest, RequestStartedAfterClientDeleted) { - scheduler_->OnClientCreated(kChildId2, kRouteId2, false, false); - scoped_ptr<TestRequest> high(NewRequestWithChildAndRoute( + scheduler_->OnClientCreated(kChildId2, kRouteId2); + std::unique_ptr<TestRequest> high(NewRequestWithChildAndRoute( "http://host/high", net::HIGHEST, kChildId2, kRouteId2)); - scoped_ptr<TestRequest> lowest1(NewRequestWithChildAndRoute( + std::unique_ptr<TestRequest> lowest1(NewRequestWithChildAndRoute( "http://host/lowest", net::LOWEST, kChildId2, kRouteId2)); - scoped_ptr<TestRequest> lowest2(NewRequestWithChildAndRoute( + std::unique_ptr<TestRequest> lowest2(NewRequestWithChildAndRoute( "http://host/lowest", net::LOWEST, kChildId2, kRouteId2)); EXPECT_FALSE(lowest2->started()); @@ -2346,8 +778,8 @@ TEST_F(ResourceSchedulerTest, RequestStartedAfterClientDeleted) { // This test is to verify that requests will be started at some point // even if they were not started by the destructor. TEST_F(ResourceSchedulerTest, RequestStartedAfterClientDeletedManyDelayable) { - scheduler_->OnClientCreated(kChildId2, kRouteId2, false, false); - scoped_ptr<TestRequest> high(NewRequestWithChildAndRoute( + scheduler_->OnClientCreated(kChildId2, kRouteId2); + std::unique_ptr<TestRequest> high(NewRequestWithChildAndRoute( "http://host/high", net::HIGHEST, kChildId2, kRouteId2)); const int kMaxNumDelayableRequestsPerClient = 10; ScopedVector<TestRequest> delayable_requests; @@ -2355,7 +787,7 @@ TEST_F(ResourceSchedulerTest, RequestStartedAfterClientDeletedManyDelayable) { delayable_requests.push_back(NewRequestWithChildAndRoute( "http://host/lowest", net::LOWEST, kChildId2, kRouteId2)); } - scoped_ptr<TestRequest> lowest(NewRequestWithChildAndRoute( + std::unique_ptr<TestRequest> lowest(NewRequestWithChildAndRoute( "http://host/lowest", net::LOWEST, kChildId2, kRouteId2)); EXPECT_FALSE(lowest->started()); @@ -2386,18 +818,19 @@ TEST_F(ResourceSchedulerTest, DefaultLayoutBlockingPriority) { kMaxNumDelayableWhileLayoutBlocking, kMaxNumDelayableRequestsPerClient))); InitializeScheduler(); - scoped_ptr<TestRequest> high( + std::unique_ptr<TestRequest> high( NewRequest("http://hosthigh/high", net::HIGHEST)); - scoped_ptr<TestRequest> high2( + std::unique_ptr<TestRequest> high2( NewRequest("http://hosthigh/high", net::HIGHEST)); - scoped_ptr<TestRequest> medium( + std::unique_ptr<TestRequest> medium( NewRequest("http://hostmedium/medium", net::MEDIUM)); - scoped_ptr<TestRequest> medium2( + std::unique_ptr<TestRequest> medium2( NewRequest("http://hostmedium/medium", net::MEDIUM)); - scoped_ptr<TestRequest> low(NewRequest("http://hostlow/low", net::LOW)); - scoped_ptr<TestRequest> low2(NewRequest("http://hostlow/low", net::LOW)); - scoped_ptr<TestRequest> lowest(NewRequest("http://hostlowest/lowest", net::LOWEST)); - scoped_ptr<TestRequest> lowest2( + std::unique_ptr<TestRequest> low(NewRequest("http://hostlow/low", net::LOW)); + std::unique_ptr<TestRequest> low2(NewRequest("http://hostlow/low", net::LOW)); + std::unique_ptr<TestRequest> lowest( + NewRequest("http://hostlowest/lowest", net::LOWEST)); + std::unique_ptr<TestRequest> lowest2( NewRequest("http://hostlowest/lowest", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(high2->started()); @@ -2435,18 +868,19 @@ TEST_F(ResourceSchedulerTest, IncreaseLayoutBlockingPriority) { kMaxNumDelayableWhileLayoutBlocking, kMaxNumDelayableRequestsPerClient))); InitializeScheduler(); - scoped_ptr<TestRequest> high( + std::unique_ptr<TestRequest> high( NewRequest("http://hosthigh/high", net::HIGHEST)); - scoped_ptr<TestRequest> high2( + std::unique_ptr<TestRequest> high2( NewRequest("http://hosthigh/high", net::HIGHEST)); - scoped_ptr<TestRequest> medium( + std::unique_ptr<TestRequest> medium( NewRequest("http://hostmedium/medium", net::MEDIUM)); - scoped_ptr<TestRequest> medium2( + std::unique_ptr<TestRequest> medium2( NewRequest("http://hostmedium/medium", net::MEDIUM)); - scoped_ptr<TestRequest> low(NewRequest("http://hostlow/low", net::LOW)); - scoped_ptr<TestRequest> low2(NewRequest("http://hostlow/low", net::LOW)); - scoped_ptr<TestRequest> lowest(NewRequest("http://hostlowest/lowest", net::LOWEST)); - scoped_ptr<TestRequest> lowest2( + std::unique_ptr<TestRequest> low(NewRequest("http://hostlow/low", net::LOW)); + std::unique_ptr<TestRequest> low2(NewRequest("http://hostlow/low", net::LOW)); + std::unique_ptr<TestRequest> lowest( + NewRequest("http://hostlowest/lowest", net::LOWEST)); + std::unique_ptr<TestRequest> lowest2( NewRequest("http://hostlowest/lowest", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(high2->started()); @@ -2495,10 +929,12 @@ TEST_F(ResourceSchedulerTest, UseLayoutBlockingThresholdOne) { kMaxNumDelayableWhileLayoutBlocking, kMaxNumDelayableRequestsPerClient))); InitializeScheduler(); - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> high2(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> high2( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(high2->started()); EXPECT_FALSE(low->started()); @@ -2540,11 +976,14 @@ TEST_F(ResourceSchedulerTest, UseLayoutBlockingThresholdTwo) { kMaxNumDelayableWhileLayoutBlocking, kMaxNumDelayableRequestsPerClient))); InitializeScheduler(); - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> high2(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> high3(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> high2( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> high3( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(high2->started()); EXPECT_TRUE(high3->started()); @@ -2588,10 +1027,11 @@ TEST_F(ResourceSchedulerTest, TwoDelayableLoadsUntilBodyInserted) { kMaxNumDelayableWhileLayoutBlocking, kMaxNumDelayableRequestsPerClient))); InitializeScheduler(); - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low3(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low3(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(low->started()); EXPECT_TRUE(low2->started()); @@ -2627,11 +1067,13 @@ TEST_F(ResourceSchedulerTest, kMaxNumDelayableWhileLayoutBlocking, kMaxNumDelayableRequestsPerClient))); InitializeScheduler(); - scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> high2(NewRequest("http://host/high", net::HIGHEST)); - scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); - scoped_ptr<TestRequest> low3(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> high( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> high2( + NewRequest("http://host/high", net::HIGHEST)); + std::unique_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); + std::unique_ptr<TestRequest> low3(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(high2->started()); EXPECT_FALSE(low->started()); @@ -2684,8 +1126,8 @@ TEST_F(ResourceSchedulerTest, TwentyMaxNumDelayableRequestsPerClient) { EXPECT_TRUE(lows_different_host[i]->started()); } - scoped_ptr<TestRequest> last_different_host(NewRequest("http://host_new/last", - net::LOWEST)); + std::unique_ptr<TestRequest> last_different_host( + NewRequest("http://host_new/last", net::LOWEST)); EXPECT_FALSE(last_different_host->started()); } @@ -2725,8 +1167,8 @@ TEST_F(ResourceSchedulerTest, EXPECT_TRUE(lows_different_host[i]->started()); } - scoped_ptr<TestRequest> last_different_host(NewRequest("http://host_new/last", - net::LOWEST)); + std::unique_ptr<TestRequest> last_different_host( + NewRequest("http://host_new/last", net::LOWEST)); EXPECT_FALSE(last_different_host->started()); } |