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 "base/timer/mock_timer.h" | 10 #include "base/timer/mock_timer.h" |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 EXPECT_TRUE(low2->started()); | 297 EXPECT_TRUE(low2->started()); |
298 } | 298 } |
299 | 299 |
300 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) { | 300 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) { |
301 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 301 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
302 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); | 302 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
303 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); | 303 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); |
304 EXPECT_TRUE(high->started()); | 304 EXPECT_TRUE(high->started()); |
305 EXPECT_TRUE(low->started()); | 305 EXPECT_TRUE(low->started()); |
306 EXPECT_FALSE(low2->started()); | 306 EXPECT_FALSE(low2->started()); |
| 307 high.reset(); |
| 308 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 309 EXPECT_TRUE(low2->started()); |
| 310 } |
| 311 |
| 312 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilCriticalComplete) { |
| 313 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
| 314 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
| 315 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); |
| 316 EXPECT_TRUE(high->started()); |
| 317 EXPECT_TRUE(low->started()); |
| 318 EXPECT_FALSE(low2->started()); |
307 scheduler_.OnWillInsertBody(kChildId, kRouteId); | 319 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 320 EXPECT_FALSE(low2->started()); |
| 321 high.reset(); |
308 EXPECT_TRUE(low2->started()); | 322 EXPECT_TRUE(low2->started()); |
309 } | 323 } |
310 | 324 |
311 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { | 325 TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { |
312 http_server_properties_.SetSupportsSpdy( | 326 http_server_properties_.SetSupportsSpdy( |
313 net::HostPortPair("spdyhost", 443), true); | 327 net::HostPortPair("spdyhost", 443), true); |
314 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 328 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
315 scoped_ptr<TestRequest> low_spdy( | 329 scoped_ptr<TestRequest> low_spdy( |
316 NewRequest("https://spdyhost/low", net::LOWEST)); | 330 NewRequest("https://spdyhost/low", net::LOWEST)); |
317 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); | 331 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
318 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); | 332 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); |
319 EXPECT_TRUE(high->started()); | 333 EXPECT_TRUE(high->started()); |
320 EXPECT_TRUE(low_spdy->started()); | 334 EXPECT_TRUE(low_spdy->started()); |
321 EXPECT_TRUE(low->started()); | 335 EXPECT_TRUE(low->started()); |
322 EXPECT_FALSE(low2->started()); | 336 EXPECT_FALSE(low2->started()); |
323 scheduler_.OnWillInsertBody(kChildId, kRouteId); | 337 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 338 high.reset(); |
324 EXPECT_TRUE(low2->started()); | 339 EXPECT_TRUE(low2->started()); |
325 } | 340 } |
326 | 341 |
327 TEST_F(ResourceSchedulerTest, NavigationResetsState) { | 342 TEST_F(ResourceSchedulerTest, NavigationResetsState) { |
328 scheduler_.OnWillInsertBody(kChildId, kRouteId); | 343 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
329 scheduler_.OnNavigate(kChildId, kRouteId); | 344 scheduler_.OnNavigate(kChildId, kRouteId); |
330 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 345 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
331 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); | 346 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
332 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); | 347 scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); |
333 EXPECT_TRUE(high->started()); | 348 EXPECT_TRUE(high->started()); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 EXPECT_FALSE(idle->started()); | 469 EXPECT_FALSE(idle->started()); |
455 | 470 |
456 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. | 471 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. |
457 ScopedVector<TestRequest> lows; | 472 ScopedVector<TestRequest> lows; |
458 for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) { | 473 for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) { |
459 string url = "http://host/low" + base::IntToString(i); | 474 string url = "http://host/low" + base::IntToString(i); |
460 lows.push_back(NewRequest(url.c_str(), net::LOWEST)); | 475 lows.push_back(NewRequest(url.c_str(), net::LOWEST)); |
461 } | 476 } |
462 | 477 |
463 scheduler_.OnWillInsertBody(kChildId, kRouteId); | 478 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 479 high.reset(); |
| 480 |
464 EXPECT_TRUE(request->started()); | 481 EXPECT_TRUE(request->started()); |
465 EXPECT_FALSE(idle->started()); | 482 EXPECT_FALSE(idle->started()); |
466 } | 483 } |
467 | 484 |
468 TEST_F(ResourceSchedulerTest, LowerPriority) { | 485 TEST_F(ResourceSchedulerTest, LowerPriority) { |
469 // Dummies to enforce scheduling. | 486 // Dummies to enforce scheduling. |
470 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 487 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
471 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); | 488 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
472 | 489 |
473 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); | 490 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); |
474 scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); | 491 scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); |
475 EXPECT_FALSE(request->started()); | 492 EXPECT_FALSE(request->started()); |
476 EXPECT_FALSE(idle->started()); | 493 EXPECT_FALSE(idle->started()); |
477 | 494 |
478 ChangeRequestPriority(request.get(), net::IDLE); | 495 ChangeRequestPriority(request.get(), net::IDLE); |
479 EXPECT_FALSE(request->started()); | 496 EXPECT_FALSE(request->started()); |
480 EXPECT_FALSE(idle->started()); | 497 EXPECT_FALSE(idle->started()); |
481 | 498 |
482 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. | 499 const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. |
483 // 2 fewer filler requests: 1 for the "low" dummy at the start, and 1 for the | 500 // 2 fewer filler requests: 1 for the "low" dummy at the start, and 1 for the |
484 // one at the end, which will be tested. | 501 // one at the end, which will be tested. |
485 const int kNumFillerRequests = kMaxNumDelayableRequestsPerClient - 2; | 502 const int kNumFillerRequests = kMaxNumDelayableRequestsPerClient - 2; |
486 ScopedVector<TestRequest> lows; | 503 ScopedVector<TestRequest> lows; |
487 for (int i = 0; i < kNumFillerRequests; ++i) { | 504 for (int i = 0; i < kNumFillerRequests; ++i) { |
488 string url = "http://host" + base::IntToString(i) + "/low"; | 505 string url = "http://host" + base::IntToString(i) + "/low"; |
489 lows.push_back(NewRequest(url.c_str(), net::LOWEST)); | 506 lows.push_back(NewRequest(url.c_str(), net::LOWEST)); |
490 } | 507 } |
491 | 508 |
492 scheduler_.OnWillInsertBody(kChildId, kRouteId); | 509 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 510 high.reset(); |
| 511 |
493 EXPECT_FALSE(request->started()); | 512 EXPECT_FALSE(request->started()); |
494 EXPECT_TRUE(idle->started()); | 513 EXPECT_TRUE(idle->started()); |
495 } | 514 } |
496 | 515 |
497 TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) { | 516 TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) { |
498 // Dummies to enforce scheduling. | 517 // Dummies to enforce scheduling. |
499 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 518 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
500 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); | 519 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
501 | 520 |
502 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); | 521 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 lows.push_back(NewRequest(url.c_str(), net::IDLE)); | 555 lows.push_back(NewRequest(url.c_str(), net::IDLE)); |
537 } | 556 } |
538 | 557 |
539 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); | 558 scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); |
540 EXPECT_FALSE(request->started()); | 559 EXPECT_FALSE(request->started()); |
541 | 560 |
542 ChangeRequestPriority(request.get(), net::IDLE, 1); | 561 ChangeRequestPriority(request.get(), net::IDLE, 1); |
543 EXPECT_FALSE(request->started()); | 562 EXPECT_FALSE(request->started()); |
544 | 563 |
545 scheduler_.OnWillInsertBody(kChildId, kRouteId); | 564 scheduler_.OnWillInsertBody(kChildId, kRouteId); |
| 565 high.reset(); |
546 EXPECT_TRUE(request->started()); | 566 EXPECT_TRUE(request->started()); |
547 } | 567 } |
548 | 568 |
549 TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { | 569 TEST_F(ResourceSchedulerTest, NonHTTPSchedulesImmediately) { |
550 // Dummies to enforce scheduling. | 570 // Dummies to enforce scheduling. |
551 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); | 571 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); |
552 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); | 572 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); |
553 | 573 |
554 scoped_ptr<TestRequest> request( | 574 scoped_ptr<TestRequest> request( |
555 NewRequest("chrome-extension://req", net::LOWEST)); | 575 NewRequest("chrome-extension://req", net::LOWEST)); |
(...skipping 1537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2093 FireCoalescingTimer(); | 2113 FireCoalescingTimer(); |
2094 | 2114 |
2095 EXPECT_TRUE(high->started()); | 2115 EXPECT_TRUE(high->started()); |
2096 EXPECT_TRUE(high2->started()); | 2116 EXPECT_TRUE(high2->started()); |
2097 EXPECT_TRUE(low->started()); | 2117 EXPECT_TRUE(low->started()); |
2098 } | 2118 } |
2099 | 2119 |
2100 } // unnamed namespace | 2120 } // unnamed namespace |
2101 | 2121 |
2102 } // namespace content | 2122 } // namespace content |
OLD | NEW |