| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/loader/resource_scheduler.h" | 5 #include "content/browser/loader/resource_scheduler.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_vector.h" | 7 #include "base/memory/scoped_vector.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "content/browser/browser_thread_impl.h" | 10 #include "content/browser/browser_thread_impl.h" |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); | 182 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); |
| 183 request->Start(); | 183 request->Start(); |
| 184 return request; | 184 return request; |
| 185 } | 185 } |
| 186 | 186 |
| 187 TestRequest* NewRequest(const char* url, net::RequestPriority priority) { | 187 TestRequest* NewRequest(const char* url, net::RequestPriority priority) { |
| 188 return NewRequestWithRoute(url, priority, kRouteId); | 188 return NewRequestWithRoute(url, priority, kRouteId); |
| 189 } | 189 } |
| 190 | 190 |
| 191 void ChangeRequestPriority(TestRequest* request, | 191 void ChangeRequestPriority(TestRequest* request, |
| 192 net::RequestPriority new_priority) { | 192 net::RequestPriority new_priority, |
| 193 int intra_priority = 0) { |
| 193 scoped_refptr<FakeResourceMessageFilter> filter( | 194 scoped_refptr<FakeResourceMessageFilter> filter( |
| 194 new FakeResourceMessageFilter(kChildId)); | 195 new FakeResourceMessageFilter(kChildId)); |
| 195 const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( | 196 const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( |
| 196 request->url_request()); | 197 request->url_request()); |
| 197 const GlobalRequestID& id = info->GetGlobalRequestID(); | 198 const GlobalRequestID& id = info->GetGlobalRequestID(); |
| 198 ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority); | 199 ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority, |
| 200 intra_priority); |
| 199 bool ok = false; | 201 bool ok = false; |
| 200 rdh_.OnMessageReceived(msg, filter.get(), &ok); | 202 rdh_.OnMessageReceived(msg, filter.get(), &ok); |
| 201 EXPECT_TRUE(ok); | 203 EXPECT_TRUE(ok); |
| 202 } | 204 } |
| 203 | 205 |
| 204 int next_request_id_; | 206 int next_request_id_; |
| 205 base::MessageLoopForIO message_loop_; | 207 base::MessageLoopForIO message_loop_; |
| 206 BrowserThreadImpl ui_thread_; | 208 BrowserThreadImpl ui_thread_; |
| 207 BrowserThreadImpl io_thread_; | 209 BrowserThreadImpl io_thread_; |
| 208 ResourceDispatcherHostImpl rdh_; | 210 ResourceDispatcherHostImpl rdh_; |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 | 449 |
| 448 ChangeRequestPriority(request.get(), net::LOWEST); | 450 ChangeRequestPriority(request.get(), net::LOWEST); |
| 449 EXPECT_FALSE(request->started()); | 451 EXPECT_FALSE(request->started()); |
| 450 EXPECT_FALSE(idle->started()); | 452 EXPECT_FALSE(idle->started()); |
| 451 | 453 |
| 452 scheduler_.OnWillInsertBody(kChildId, kRouteId); | 454 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 453 EXPECT_FALSE(request->started()); | 455 EXPECT_FALSE(request->started()); |
| 454 EXPECT_FALSE(idle->started()); | 456 EXPECT_FALSE(idle->started()); |
| 455 } | 457 } |
| 456 | 458 |
| 459 TEST_F(ResourceSchedulerTest, HigherIntraPriorityGoesToFrontOfQueue) { |
| 460 // Dummies to enforce scheduling. |
| 461 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
| 462 scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); |
| 463 |
| 464 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. |
| 465 ScopedVector<TestRequest> lows; |
| 466 for (int i = 0; i < kMaxNumDelayableRequestsPerClient; ++i) { |
| 467 string url = "http://host/low" + base::IntToString(i); |
| 468 lows.push_back(NewRequest(url.c_str(), net::IDLE)); |
| 469 } |
| 470 |
| 471 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); |
| 472 EXPECT_FALSE(request->started()); |
| 473 |
| 474 ChangeRequestPriority(request.get(), net::IDLE, 1); |
| 475 EXPECT_FALSE(request->started()); |
| 476 |
| 477 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 478 EXPECT_TRUE(request->started()); |
| 479 } |
| 480 |
| 457 TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { | 481 TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { |
| 458 // Dummies to enforce scheduling. | 482 // Dummies to enforce scheduling. |
| 459 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 483 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
| 460 scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); | 484 scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); |
| 461 | 485 |
| 462 scoped_ptr<TestRequest> request( | 486 scoped_ptr<TestRequest> request( |
| 463 NewRequest("chrome-extension://req", net::LOWEST)); | 487 NewRequest("chrome-extension://req", net::LOWEST)); |
| 464 EXPECT_TRUE(request->started()); | 488 EXPECT_TRUE(request->started()); |
| 465 } | 489 } |
| 466 | 490 |
| 467 TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) { | 491 TEST_F(ResourceSchedulerTest, SpdyProxySchedulesImmediately) { |
| 468 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 492 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
| 469 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); | 493 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
| 470 | 494 |
| 471 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); | 495 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); |
| 472 EXPECT_FALSE(request->started()); | 496 EXPECT_FALSE(request->started()); |
| 473 | 497 |
| 474 scheduler_.OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId); | 498 scheduler_.OnReceivedSpdyProxiedHttpResponse(kChildId, kRouteId); |
| 475 EXPECT_TRUE(request->started()); | 499 EXPECT_TRUE(request->started()); |
| 476 | 500 |
| 477 scoped_ptr<TestRequest> after(NewRequest("http://host/after", net::IDLE)); | 501 scoped_ptr<TestRequest> after(NewRequest("http://host/after", net::IDLE)); |
| 478 EXPECT_TRUE(after->started()); | 502 EXPECT_TRUE(after->started()); |
| 479 } | 503 } |
| 480 | 504 |
| 481 } // unnamed namespace | 505 } // unnamed namespace |
| 482 | 506 |
| 483 } // namespace content | 507 } // namespace content |
| OLD | NEW |