Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(420)

Side by Side Diff: content/browser/loader/resource_scheduler_unittest.cc

Issue 11270027: Add a ResourceScheduler to ResourceDispatcherHost. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Win build Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/loader/resource_scheduler.h"
6
7 #include "base/message_loop.h"
8 #include "content/public/browser/resource_controller.h"
9 #include "content/public/browser/resource_throttle.h"
10 #include "net/url_request/url_request.h"
11 #include "net/url_request/url_request_test_util.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace content {
15
16 namespace {
17
18 class TestRequestFactory;
19
20 const int kChildId = 30;
21 const int kRouteId = 75;
22
23 class TestRequest : public ResourceController {
24 public:
25 TestRequest(scoped_ptr<ResourceThrottle> throttle,
26 scoped_ptr<net::URLRequest> url_request)
27 : started_(false),
28 throttle_(throttle.Pass()),
29 url_request_(url_request.Pass()) {
30 throttle_->set_controller_for_testing(this);
31 }
32
33 bool started() const { return started_; }
34
35 void Start() {
36 bool deferred = false;
37 throttle_->WillStartRequest(&deferred);
38 started_ = !deferred;
39 }
40
41 private:
42 // ResourceController interface:
43 virtual void Cancel() OVERRIDE {}
44 virtual void CancelAndIgnore() OVERRIDE {}
45 virtual void CancelWithError(int error_code) OVERRIDE {}
46 virtual void Resume() OVERRIDE { started_ = true; }
47
48 bool started_;
49 scoped_ptr<ResourceThrottle> throttle_;
50 scoped_ptr<net::URLRequest> url_request_;
51 };
52
53 class ResourceSchedulerTest : public testing::Test {
54 protected:
55 ResourceSchedulerTest()
56 : message_loop_(MessageLoop::TYPE_IO) {
57 scheduler_.OnNavigate(kChildId, kRouteId);
58 }
59
60 virtual ~ResourceSchedulerTest() {
61 }
62
63 TestRequest* NewRequest(const char* url, net::RequestPriority priority,
64 int route_id = kRouteId) {
65 scoped_ptr<net::URLRequest> url_request(
66 context_.CreateRequest(GURL(url), NULL));
67 url_request->set_priority(priority);
68 scoped_ptr<ResourceThrottle> throttle(scheduler_.ScheduleRequest(
69 kChildId, route_id, *url_request.get()));
70 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass());
71 request->Start();
72 return request;
73 }
74
75 MessageLoop message_loop_;
76 ResourceScheduler scheduler_;
77 net::TestURLRequestContext context_;
78 };
79
80 TEST_F(ResourceSchedulerTest, OneIsolatedLowRequest) {
81 scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOW));
82 EXPECT_TRUE(request->started());
83 }
84
85 TEST_F(ResourceSchedulerTest, LowBlocksUntilIdle) {
86 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
87 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOW));
88 EXPECT_TRUE(high->started());
89 EXPECT_FALSE(low->started());
90 high.reset();
91 EXPECT_TRUE(low->started());
92 }
93
94 TEST_F(ResourceSchedulerTest, LowBlocksUntilPaint) {
95 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
96 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOW));
97 EXPECT_TRUE(high->started());
98 EXPECT_FALSE(low->started());
99 scheduler_.OnFirstPaint(kChildId, kRouteId);
100 EXPECT_TRUE(low->started());
101 }
102
103 TEST_F(ResourceSchedulerTest, NavigationResetsPaintState) {
104 scheduler_.OnFirstPaint(kChildId, kRouteId);
105 scheduler_.OnNavigate(kChildId, kRouteId);
106 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
107 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOW));
108 EXPECT_TRUE(high->started());
109 EXPECT_FALSE(low->started());
110 }
111
112 TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) {
113 const int route_id = 0; // Indicates a background request.
114 scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOW,
115 route_id));
116 EXPECT_TRUE(request->started());
117 }
118
119 TEST_F(ResourceSchedulerTest, EvictedClientsIssuePendingRequests) {
120 ScopedVector<TestRequest> low_requests;
121 ScopedVector<TestRequest> high_requests;
122 for (int i = 0; i < 6; i++) {
123 scheduler_.OnNavigate(kChildId, kRouteId + i);
124 high_requests.push_back(
125 NewRequest("http://host/i", net::HIGHEST, kRouteId + i));
126 low_requests.push_back(
127 NewRequest("http://host/i", net::LOW, kRouteId + i));
128 EXPECT_FALSE(low_requests[i]->started());
129 }
130 EXPECT_TRUE(low_requests[0]->started());
131 }
132
133 } // unnamed namespace
134
135 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698