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

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

Issue 1285863003: ResourceScheduler: remove dependency on ResourceRequestInfo and request_id (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkgr
Patch Set: Changes suggested by davidben@ Created 5 years, 4 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
OLDNEW
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/metrics/field_trial.h" 9 #include "base/metrics/field_trial.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
11 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "base/test/mock_entropy_provider.h" 12 #include "base/test/mock_entropy_provider.h"
13 #include "base/timer/mock_timer.h" 13 #include "base/timer/mock_timer.h"
14 #include "base/timer/timer.h" 14 #include "base/timer/timer.h"
15 #include "content/browser/browser_thread_impl.h" 15 #include "content/browser/browser_thread_impl.h"
16 #include "content/browser/loader/resource_dispatcher_host_impl.h" 16 #include "content/browser/loader/resource_dispatcher_host_impl.h"
17 #include "content/browser/loader/resource_message_filter.h"
18 #include "content/browser/loader/resource_request_info_impl.h"
19 #include "content/common/resource_messages.h"
20 #include "content/public/browser/resource_context.h" 17 #include "content/public/browser/resource_context.h"
21 #include "content/public/browser/resource_controller.h" 18 #include "content/public/browser/resource_controller.h"
22 #include "content/public/browser/resource_throttle.h"
23 #include "content/public/common/content_switches.h" 19 #include "content/public/common/content_switches.h"
24 #include "content/public/common/process_type.h"
25 #include "content/public/common/resource_type.h"
26 #include "content/public/test/mock_render_process_host.h" 20 #include "content/public/test/mock_render_process_host.h"
27 #include "content/public/test/test_browser_context.h" 21 #include "content/public/test/test_browser_context.h"
28 #include "content/test/test_render_view_host_factory.h" 22 #include "content/test/test_render_view_host_factory.h"
29 #include "content/test/test_web_contents.h" 23 #include "content/test/test_web_contents.h"
30 #include "net/base/host_port_pair.h" 24 #include "net/base/host_port_pair.h"
31 #include "net/base/request_priority.h" 25 #include "net/base/request_priority.h"
32 #include "net/http/http_server_properties_impl.h" 26 #include "net/http/http_server_properties_impl.h"
33 #include "net/url_request/url_request.h" 27 #include "net/url_request/url_request.h"
34 #include "net/url_request/url_request_test_util.h" 28 #include "net/url_request/url_request_test_util.h"
35 #include "testing/gtest/include/gtest/gtest.h" 29 #include "testing/gtest/include/gtest/gtest.h"
36 #include "ui/events/latency_info.h" 30 #include "ui/events/latency_info.h"
37 31
38 using std::string; 32 using std::string;
39 33
40 namespace content { 34 namespace content {
41 35
42 namespace { 36 namespace {
43 37
44 class TestRequestFactory; 38 class TestRequestFactory;
45 39
46 const int kChildId = 30; 40 const int kChildId = 30;
47 const int kRouteId = 75; 41 const int kRouteId = 75;
48 const int kChildId2 = 43; 42 const int kChildId2 = 43;
49 const int kRouteId2 = 67; 43 const int kRouteId2 = 67;
50 const int kBackgroundChildId = 35; 44 const int kBackgroundChildId = 35;
51 const int kBackgroundRouteId = 43; 45 const int kBackgroundRouteId = 43;
52 const int kBackgroundChildId2 = 54; 46 const int kBackgroundChildId2 = 54;
53 const int kBackgroundRouteId2 = 82; 47 const int kBackgroundRouteId2 = 82;
54 48
49 typedef ResourceScheduler::ScheduledResourceRequest ScheduledResourceRequest;
50
55 class TestRequest : public ResourceController { 51 class TestRequest : public ResourceController {
56 public: 52 public:
57 TestRequest(scoped_ptr<ResourceThrottle> throttle, 53 TestRequest(scoped_ptr<net::URLRequest> url_request,
58 scoped_ptr<net::URLRequest> url_request) 54 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request)
59 : started_(false), 55 : started_(false),
60 throttle_(throttle.Pass()), 56 url_request_(url_request.Pass()),
61 url_request_(url_request.Pass()) { 57 scheduled_resource_request_(scheduled_resource_request.Pass()) {
62 throttle_->set_controller_for_testing(this); 58 scheduled_resource_request_->set_controller_for_testing(this);
63 } 59 }
64 ~TestRequest() override {} 60 ~TestRequest() override {
61 // The URLRequest must still be valid when the ScheduledResourceRequest is
62 // destroyed, so that it can unregister itself.
63 scheduled_resource_request_.reset();
64 }
65 65
66 bool started() const { return started_; } 66 bool started() const { return started_; }
67 67
68 void Start() { 68 void Start() {
69 bool deferred = false; 69 bool deferred = false;
70 throttle_->WillStartRequest(&deferred); 70 scheduled_resource_request_->WillStartRequest(&deferred);
71 started_ = !deferred; 71 started_ = !deferred;
72 } 72 }
73 73
74 void ChangePriority(net::RequestPriority new_priority, int intra_priority) {
75 scheduled_resource_request_->ChangePriority(new_priority, intra_priority);
76 }
77
74 void Cancel() override { 78 void Cancel() override {
75 // Alert the scheduler that the request can be deleted. 79 // Alert the scheduler that the request can be deleted.
76 throttle_.reset(0); 80 scheduled_resource_request_.reset();
77 } 81 }
78 82
79 const net::URLRequest* url_request() const { return url_request_.get(); } 83 const net::URLRequest* url_request() const { return url_request_.get(); }
80 84
81 protected: 85 protected:
82 // ResourceController interface: 86 // ResourceController interface:
83 void CancelAndIgnore() override {} 87 void CancelAndIgnore() override {}
84 void CancelWithError(int error_code) override {} 88 void CancelWithError(int error_code) override {}
85 void Resume() override { started_ = true; } 89 void Resume() override { started_ = true; }
86 90
87 private: 91 private:
88 bool started_; 92 bool started_;
89 scoped_ptr<ResourceThrottle> throttle_;
90 scoped_ptr<net::URLRequest> url_request_; 93 scoped_ptr<net::URLRequest> url_request_;
94 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request_;
91 }; 95 };
92 96
93 class CancelingTestRequest : public TestRequest { 97 class CancelingTestRequest : public TestRequest {
94 public: 98 public:
95 CancelingTestRequest(scoped_ptr<ResourceThrottle> throttle, 99 CancelingTestRequest(
96 scoped_ptr<net::URLRequest> url_request) 100 scoped_ptr<net::URLRequest> url_request,
97 : TestRequest(throttle.Pass(), url_request.Pass()) {} 101 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request)
102 : TestRequest(url_request.Pass(), scheduled_resource_request.Pass()) {}
98 103
99 void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) { 104 void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) {
100 request_to_cancel_ = request_to_cancel.Pass(); 105 request_to_cancel_ = request_to_cancel.Pass();
101 } 106 }
102 107
103 private: 108 private:
104 void Resume() override { 109 void Resume() override {
105 TestRequest::Resume(); 110 TestRequest::Resume();
106 request_to_cancel_.reset(); 111 request_to_cancel_.reset();
107 } 112 }
108 113
109 scoped_ptr<TestRequest> request_to_cancel_; 114 scoped_ptr<TestRequest> request_to_cancel_;
110 }; 115 };
111 116
112 class FakeResourceContext : public ResourceContext { 117 class FakeResourceContext : public ResourceContext {
113 private: 118 private:
114 net::HostResolver* GetHostResolver() override { return NULL; } 119 net::HostResolver* GetHostResolver() override { return NULL; }
115 net::URLRequestContext* GetRequestContext() override { return NULL; } 120 net::URLRequestContext* GetRequestContext() override { return NULL; }
116 }; 121 };
117 122
118 class FakeResourceMessageFilter : public ResourceMessageFilter {
119 public:
120 FakeResourceMessageFilter(int child_id)
121 : ResourceMessageFilter(
122 child_id,
123 PROCESS_TYPE_RENDERER,
124 NULL /* appcache_service */,
125 NULL /* blob_storage_context */,
126 NULL /* file_system_context */,
127 NULL /* service_worker_context */,
128 NULL /* host_zoom_level_context */,
129 base::Bind(&FakeResourceMessageFilter::GetContexts,
130 base::Unretained(this))) {
131 }
132
133 private:
134 ~FakeResourceMessageFilter() override {}
135
136 void GetContexts(const ResourceHostMsg_Request& request,
137 ResourceContext** resource_context,
138 net::URLRequestContext** request_context) {
139 *resource_context = &context_;
140 *request_context = NULL;
141 }
142
143 FakeResourceContext context_;
144 };
145
146 class ResourceSchedulerTest : public testing::Test { 123 class ResourceSchedulerTest : public testing::Test {
147 protected: 124 protected:
148 ResourceSchedulerTest() 125 ResourceSchedulerTest()
149 : next_request_id_(0), 126 : ui_thread_(BrowserThread::UI, &message_loop_),
150 ui_thread_(BrowserThread::UI, &message_loop_),
151 io_thread_(BrowserThread::IO, &message_loop_), 127 io_thread_(BrowserThread::IO, &message_loop_),
152 field_trial_list_(new base::MockEntropyProvider()) { 128 field_trial_list_(new base::MockEntropyProvider()) {
153 InitializeScheduler(); 129 InitializeScheduler();
154 context_.set_http_server_properties(http_server_properties_.GetWeakPtr()); 130 context_.set_http_server_properties(http_server_properties_.GetWeakPtr());
155 } 131 }
156 132
157 ~ResourceSchedulerTest() override { 133 ~ResourceSchedulerTest() override {
158 CleanupScheduler(); 134 CleanupScheduler();
159 } 135 }
160 136
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 return base::FieldTrialList::CreateTrialsFromString( 168 return base::FieldTrialList::CreateTrialsFromString(
193 force_field_trial_argument, 169 force_field_trial_argument,
194 base::FieldTrialList::DONT_ACTIVATE_TRIALS, 170 base::FieldTrialList::DONT_ACTIVATE_TRIALS,
195 std::set<std::string>()); 171 std::set<std::string>());
196 } 172 }
197 173
198 scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute( 174 scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute(
199 const char* url, 175 const char* url,
200 net::RequestPriority priority, 176 net::RequestPriority priority,
201 int child_id, 177 int child_id,
202 int route_id, 178 int route_id) {
203 bool is_async) {
204 scoped_ptr<net::URLRequest> url_request( 179 scoped_ptr<net::URLRequest> url_request(
205 context_.CreateRequest(GURL(url), priority, NULL)); 180 context_.CreateRequest(GURL(url), priority, NULL));
206 ResourceRequestInfoImpl* info = new ResourceRequestInfoImpl(
207 PROCESS_TYPE_RENDERER, // process_type
208 child_id, // child_id
209 route_id, // route_id
210 -1, // frame_tree_node_id
211 0, // origin_pid
212 ++next_request_id_, // request_id
213 MSG_ROUTING_NONE, // render_frame_id
214 false, // is_main_frame
215 false, // parent_is_main_frame
216 0, // parent_render_frame_id
217 RESOURCE_TYPE_SUB_RESOURCE, // resource_type
218 ui::PAGE_TRANSITION_LINK, // transition_type
219 false, // should_replace_current_entry
220 false, // is_download
221 false, // is_stream
222 true, // allow_download
223 false, // has_user_gesture
224 false, // enable_load_timing
225 false, // enable_upload_progress
226 false, // do_not_prompt_for_login
227 blink::WebReferrerPolicyDefault, // referrer_policy
228 blink::WebPageVisibilityStateVisible, // visibility_state
229 NULL, // context
230 base::WeakPtr<ResourceMessageFilter>(), // filter
231 is_async); // is_async
232 info->AssociateWithRequest(url_request.get());
233 return url_request.Pass(); 181 return url_request.Pass();
234 } 182 }
235 183
236 scoped_ptr<net::URLRequest> NewURLRequest(const char* url, 184 scoped_ptr<net::URLRequest> NewURLRequest(const char* url,
237 net::RequestPriority priority) { 185 net::RequestPriority priority) {
238 return NewURLRequestWithChildAndRoute( 186 return NewURLRequestWithChildAndRoute(url, priority, kChildId, kRouteId);
239 url, priority, kChildId, kRouteId, true);
240 } 187 }
241 188
242 TestRequest* NewRequestWithRoute(const char* url, 189 TestRequest* NewRequestWithRoute(const char* url,
243 net::RequestPriority priority, 190 net::RequestPriority priority,
244 int route_id) { 191 int route_id) {
245 return NewRequestWithChildAndRoute(url, priority, route_id, kChildId); 192 return NewRequestWithChildAndRoute(url, priority, route_id, kChildId);
246 } 193 }
247 194
248 TestRequest* NewRequestWithChildAndRoute(const char* url, 195 TestRequest* NewRequestWithChildAndRoute(const char* url,
249 net::RequestPriority priority, 196 net::RequestPriority priority,
(...skipping 27 matching lines...) Expand all
277 int child_id, 224 int child_id,
278 int route_id) { 225 int route_id) {
279 return GetNewTestRequest(url, priority, child_id, route_id, false); 226 return GetNewTestRequest(url, priority, child_id, route_id, false);
280 } 227 }
281 228
282 TestRequest* GetNewTestRequest(const char* url, 229 TestRequest* GetNewTestRequest(const char* url,
283 net::RequestPriority priority, 230 net::RequestPriority priority,
284 int child_id, 231 int child_id,
285 int route_id, 232 int route_id,
286 bool is_async) { 233 bool is_async) {
287 scoped_ptr<net::URLRequest> url_request(NewURLRequestWithChildAndRoute( 234 scoped_ptr<net::URLRequest> url_request(
288 url, priority, child_id, route_id, is_async)); 235 NewURLRequestWithChildAndRoute(url, priority, child_id, route_id));
289 scoped_ptr<ResourceThrottle> throttle( 236 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request(
290 scheduler_->ScheduleRequest(child_id, route_id, url_request.get())); 237 scheduler_->ScheduleRequest(child_id, route_id, is_async,
291 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); 238 url_request.get()));
239 TestRequest* request =
240 new TestRequest(url_request.Pass(), scheduled_resource_request.Pass());
292 request->Start(); 241 request->Start();
293 return request; 242 return request;
294 } 243 }
295 244
296 void ChangeRequestPriority(TestRequest* request, 245 void ChangeRequestPriority(TestRequest* request,
297 net::RequestPriority new_priority, 246 net::RequestPriority new_priority,
298 int intra_priority = 0) { 247 int intra_priority = 0) {
299 scoped_refptr<FakeResourceMessageFilter> filter( 248 request->ChangePriority(new_priority, intra_priority);
300 new FakeResourceMessageFilter(kChildId));
301 const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(
302 request->url_request());
303 const GlobalRequestID& id = info->GetGlobalRequestID();
304 ResourceHostMsg_DidChangePriority msg(id.request_id, new_priority,
305 intra_priority);
306 rdh_.OnMessageReceived(msg, filter.get());
307 } 249 }
308 250
309 void FireCoalescingTimer() { 251 void FireCoalescingTimer() {
310 EXPECT_TRUE(mock_timer_->IsRunning()); 252 EXPECT_TRUE(mock_timer_->IsRunning());
311 mock_timer_->Fire(); 253 mock_timer_->Fire();
312 } 254 }
313 255
314 ResourceScheduler* scheduler() { 256 ResourceScheduler* scheduler() {
315 return scheduler_.get(); 257 return scheduler_.get();
316 } 258 }
317 259
318 int next_request_id_;
319 base::MessageLoopForIO message_loop_; 260 base::MessageLoopForIO message_loop_;
320 BrowserThreadImpl ui_thread_; 261 BrowserThreadImpl ui_thread_;
321 BrowserThreadImpl io_thread_; 262 BrowserThreadImpl io_thread_;
322 ResourceDispatcherHostImpl rdh_; 263 ResourceDispatcherHostImpl rdh_;
323 scoped_ptr<ResourceScheduler> scheduler_; 264 scoped_ptr<ResourceScheduler> scheduler_;
324 base::FieldTrialList field_trial_list_; 265 base::FieldTrialList field_trial_list_;
325 base::MockTimer* mock_timer_; 266 base::MockTimer* mock_timer_;
326 net::HttpServerPropertiesImpl http_server_properties_; 267 net::HttpServerPropertiesImpl http_server_properties_;
327 net::TestURLRequestContext context_; 268 net::TestURLRequestContext context_;
328 }; 269 };
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 high2.reset(); 370 high2.reset();
430 EXPECT_TRUE(low2->started()); 371 EXPECT_TRUE(low2->started());
431 } 372 }
432 373
433 TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { 374 TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) {
434 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 375 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
435 scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST)); 376 scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST));
436 377
437 scoped_ptr<net::URLRequest> url_request( 378 scoped_ptr<net::URLRequest> url_request(
438 NewURLRequest("http://host/low2", net::LOWEST)); 379 NewURLRequest("http://host/low2", net::LOWEST));
439 scoped_ptr<ResourceThrottle> throttle( 380 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request(
440 scheduler()->ScheduleRequest(kChildId, kRouteId, url_request.get())); 381 scheduler()->ScheduleRequest(kChildId, kRouteId, true,
382 url_request.get()));
441 scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest( 383 scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest(
442 throttle.Pass(), url_request.Pass())); 384 url_request.Pass(), scheduled_resource_request.Pass()));
443 low2->Start(); 385 low2->Start();
444 386
445 scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST)); 387 scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST));
446 low2->set_request_to_cancel(low3.Pass()); 388 low2->set_request_to_cancel(low3.Pass());
447 scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST)); 389 scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST));
448 390
449 EXPECT_TRUE(high->started()); 391 EXPECT_TRUE(high->started());
450 EXPECT_FALSE(low2->started()); 392 EXPECT_FALSE(low2->started());
451 high.reset(); 393 high.reset();
452 EXPECT_TRUE(low1->started()); 394 EXPECT_TRUE(low1->started());
(...skipping 1903 matching lines...) Expand 10 before | Expand all | Expand 10 after
2356 EXPECT_FALSE(lowest->started()); 2298 EXPECT_FALSE(lowest->started());
2357 scheduler_->OnClientDeleted(kChildId2, kRouteId2); 2299 scheduler_->OnClientDeleted(kChildId2, kRouteId2);
2358 high.reset(); 2300 high.reset();
2359 delayable_requests.clear(); 2301 delayable_requests.clear();
2360 EXPECT_TRUE(lowest->started()); 2302 EXPECT_TRUE(lowest->started());
2361 } 2303 }
2362 2304
2363 } // unnamed namespace 2305 } // unnamed namespace
2364 2306
2365 } // namespace content 2307 } // namespace content
OLDNEW
« content/browser/loader/resource_scheduler.cc ('K') | « content/browser/loader/resource_scheduler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698