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

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: Minor fixes. 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" 19 #include "content/public/browser/resource_throttle.h"
davidben 2015/08/13 23:08:53 No longer needed?
Adam Rice 2015/08/13 23:42:28 Done.
23 #include "content/public/common/content_switches.h" 20 #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" 21 #include "content/public/test/mock_render_process_host.h"
27 #include "content/public/test/test_browser_context.h" 22 #include "content/public/test/test_browser_context.h"
28 #include "content/test/test_render_view_host_factory.h" 23 #include "content/test/test_render_view_host_factory.h"
29 #include "content/test/test_web_contents.h" 24 #include "content/test/test_web_contents.h"
30 #include "net/base/host_port_pair.h" 25 #include "net/base/host_port_pair.h"
31 #include "net/base/request_priority.h" 26 #include "net/base/request_priority.h"
32 #include "net/http/http_server_properties_impl.h" 27 #include "net/http/http_server_properties_impl.h"
33 #include "net/url_request/url_request.h" 28 #include "net/url_request/url_request.h"
34 #include "net/url_request/url_request_test_util.h" 29 #include "net/url_request/url_request_test_util.h"
35 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
36 #include "ui/events/latency_info.h" 31 #include "ui/events/latency_info.h"
37 32
38 using std::string; 33 using std::string;
39 34
40 namespace content { 35 namespace content {
41 36
42 namespace { 37 namespace {
43 38
44 class TestRequestFactory; 39 class TestRequestFactory;
45 40
46 const int kChildId = 30; 41 const int kChildId = 30;
47 const int kRouteId = 75; 42 const int kRouteId = 75;
48 const int kChildId2 = 43; 43 const int kChildId2 = 43;
49 const int kRouteId2 = 67; 44 const int kRouteId2 = 67;
50 const int kBackgroundChildId = 35; 45 const int kBackgroundChildId = 35;
51 const int kBackgroundRouteId = 43; 46 const int kBackgroundRouteId = 43;
52 const int kBackgroundChildId2 = 54; 47 const int kBackgroundChildId2 = 54;
53 const int kBackgroundRouteId2 = 82; 48 const int kBackgroundRouteId2 = 82;
54 49
50 typedef ResourceScheduler::ScheduledResourceRequest ScheduledResourceRequest;
51
55 class TestRequest : public ResourceController { 52 class TestRequest : public ResourceController {
56 public: 53 public:
57 TestRequest(scoped_ptr<ResourceThrottle> throttle, 54 TestRequest(scoped_ptr<ScheduledResourceRequest> scheduled_resource_request,
58 scoped_ptr<net::URLRequest> url_request) 55 scoped_ptr<net::URLRequest> url_request)
59 : started_(false), 56 : started_(false),
60 throttle_(throttle.Pass()), 57 scheduled_resource_request_(scheduled_resource_request.Pass()),
61 url_request_(url_request.Pass()) { 58 url_request_(url_request.Pass()) {
62 throttle_->set_controller_for_testing(this); 59 scheduled_resource_request_->set_controller_for_testing(this);
63 } 60 }
64 ~TestRequest() override {} 61 ~TestRequest() override {
62 // The URLRequest must still be valid when the ScheduledResourceRequest is
63 // destroyed, so that it can unregister itself.
64 scheduled_resource_request_.reset();
davidben 2015/08/13 23:08:53 Perhaps just change the order of url_request_ and
Adam Rice 2015/08/13 23:42:28 Yes. But I have kept the comment & reset() just to
65 }
65 66
66 bool started() const { return started_; } 67 bool started() const { return started_; }
67 68
68 void Start() { 69 void Start() {
69 bool deferred = false; 70 bool deferred = false;
70 throttle_->WillStartRequest(&deferred); 71 scheduled_resource_request_->WillStartRequest(&deferred);
71 started_ = !deferred; 72 started_ = !deferred;
72 } 73 }
73 74
75 void ChangePriority(net::RequestPriority new_priority, int intra_priority) {
76 scheduled_resource_request_->ChangePriority(new_priority, intra_priority);
77 }
78
74 void Cancel() override { 79 void Cancel() override {
75 // Alert the scheduler that the request can be deleted. 80 // Alert the scheduler that the request can be deleted.
76 throttle_.reset(0); 81 scheduled_resource_request_.reset();
77 } 82 }
78 83
79 const net::URLRequest* url_request() const { return url_request_.get(); } 84 const net::URLRequest* url_request() const { return url_request_.get(); }
80 85
81 protected: 86 protected:
82 // ResourceController interface: 87 // ResourceController interface:
83 void CancelAndIgnore() override {} 88 void CancelAndIgnore() override {}
84 void CancelWithError(int error_code) override {} 89 void CancelWithError(int error_code) override {}
85 void Resume() override { started_ = true; } 90 void Resume() override { started_ = true; }
86 91
87 private: 92 private:
88 bool started_; 93 bool started_;
89 scoped_ptr<ResourceThrottle> throttle_; 94 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request_;
90 scoped_ptr<net::URLRequest> url_request_; 95 scoped_ptr<net::URLRequest> url_request_;
91 }; 96 };
92 97
93 class CancelingTestRequest : public TestRequest { 98 class CancelingTestRequest : public TestRequest {
94 public: 99 public:
95 CancelingTestRequest(scoped_ptr<ResourceThrottle> throttle, 100 CancelingTestRequest(
96 scoped_ptr<net::URLRequest> url_request) 101 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request,
97 : TestRequest(throttle.Pass(), url_request.Pass()) {} 102 scoped_ptr<net::URLRequest> url_request)
103 : TestRequest(scheduled_resource_request.Pass(), url_request.Pass()) {}
98 104
99 void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) { 105 void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) {
100 request_to_cancel_ = request_to_cancel.Pass(); 106 request_to_cancel_ = request_to_cancel.Pass();
101 } 107 }
102 108
103 private: 109 private:
104 void Resume() override { 110 void Resume() override {
105 TestRequest::Resume(); 111 TestRequest::Resume();
106 request_to_cancel_.reset(); 112 request_to_cancel_.reset();
107 } 113 }
108 114
109 scoped_ptr<TestRequest> request_to_cancel_; 115 scoped_ptr<TestRequest> request_to_cancel_;
110 }; 116 };
111 117
112 class FakeResourceContext : public ResourceContext { 118 class FakeResourceContext : public ResourceContext {
113 private: 119 private:
114 net::HostResolver* GetHostResolver() override { return NULL; } 120 net::HostResolver* GetHostResolver() override { return NULL; }
115 net::URLRequestContext* GetRequestContext() override { return NULL; } 121 net::URLRequestContext* GetRequestContext() override { return NULL; }
116 }; 122 };
117 123
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 { 124 class ResourceSchedulerTest : public testing::Test {
147 protected: 125 protected:
148 ResourceSchedulerTest() 126 ResourceSchedulerTest()
149 : next_request_id_(0), 127 : ui_thread_(BrowserThread::UI, &message_loop_),
150 ui_thread_(BrowserThread::UI, &message_loop_),
151 io_thread_(BrowserThread::IO, &message_loop_), 128 io_thread_(BrowserThread::IO, &message_loop_),
152 field_trial_list_(new base::MockEntropyProvider()) { 129 field_trial_list_(new base::MockEntropyProvider()) {
153 InitializeScheduler(); 130 InitializeScheduler();
154 context_.set_http_server_properties(http_server_properties_.GetWeakPtr()); 131 context_.set_http_server_properties(http_server_properties_.GetWeakPtr());
155 } 132 }
156 133
157 ~ResourceSchedulerTest() override { 134 ~ResourceSchedulerTest() override {
158 CleanupScheduler(); 135 CleanupScheduler();
159 } 136 }
160 137
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 return base::FieldTrialList::CreateTrialsFromString( 169 return base::FieldTrialList::CreateTrialsFromString(
193 force_field_trial_argument, 170 force_field_trial_argument,
194 base::FieldTrialList::DONT_ACTIVATE_TRIALS, 171 base::FieldTrialList::DONT_ACTIVATE_TRIALS,
195 std::set<std::string>()); 172 std::set<std::string>());
196 } 173 }
197 174
198 scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute( 175 scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute(
199 const char* url, 176 const char* url,
200 net::RequestPriority priority, 177 net::RequestPriority priority,
201 int child_id, 178 int child_id,
202 int route_id, 179 int route_id) {
203 bool is_async) {
204 scoped_ptr<net::URLRequest> url_request( 180 scoped_ptr<net::URLRequest> url_request(
205 context_.CreateRequest(GURL(url), priority, NULL)); 181 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(); 182 return url_request.Pass();
234 } 183 }
235 184
236 scoped_ptr<net::URLRequest> NewURLRequest(const char* url, 185 scoped_ptr<net::URLRequest> NewURLRequest(const char* url,
237 net::RequestPriority priority) { 186 net::RequestPriority priority) {
238 return NewURLRequestWithChildAndRoute( 187 return NewURLRequestWithChildAndRoute(url, priority, kChildId, kRouteId);
239 url, priority, kChildId, kRouteId, true);
240 } 188 }
241 189
242 TestRequest* NewRequestWithRoute(const char* url, 190 TestRequest* NewRequestWithRoute(const char* url,
243 net::RequestPriority priority, 191 net::RequestPriority priority,
244 int route_id) { 192 int route_id) {
245 return NewRequestWithChildAndRoute(url, priority, route_id, kChildId); 193 return NewRequestWithChildAndRoute(url, priority, route_id, kChildId);
246 } 194 }
247 195
248 TestRequest* NewRequestWithChildAndRoute(const char* url, 196 TestRequest* NewRequestWithChildAndRoute(const char* url,
249 net::RequestPriority priority, 197 net::RequestPriority priority,
(...skipping 27 matching lines...) Expand all
277 int child_id, 225 int child_id,
278 int route_id) { 226 int route_id) {
279 return GetNewTestRequest(url, priority, child_id, route_id, false); 227 return GetNewTestRequest(url, priority, child_id, route_id, false);
280 } 228 }
281 229
282 TestRequest* GetNewTestRequest(const char* url, 230 TestRequest* GetNewTestRequest(const char* url,
283 net::RequestPriority priority, 231 net::RequestPriority priority,
284 int child_id, 232 int child_id,
285 int route_id, 233 int route_id,
286 bool is_async) { 234 bool is_async) {
287 scoped_ptr<net::URLRequest> url_request(NewURLRequestWithChildAndRoute( 235 scoped_ptr<net::URLRequest> url_request(
288 url, priority, child_id, route_id, is_async)); 236 NewURLRequestWithChildAndRoute(url, priority, child_id, route_id));
289 scoped_ptr<ResourceThrottle> throttle( 237 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request(
290 scheduler_->ScheduleRequest(child_id, route_id, url_request.get())); 238 scheduler_->ScheduleRequest(child_id, route_id, is_async,
291 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); 239 url_request.get()));
240 TestRequest* request =
241 new TestRequest(scheduled_resource_request.Pass(), url_request.Pass());
292 request->Start(); 242 request->Start();
293 return request; 243 return request;
294 } 244 }
295 245
296 void ChangeRequestPriority(TestRequest* request, 246 void ChangeRequestPriority(TestRequest* request,
297 net::RequestPriority new_priority, 247 net::RequestPriority new_priority,
298 int intra_priority = 0) { 248 int intra_priority = 0) {
299 scoped_refptr<FakeResourceMessageFilter> filter( 249 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 } 250 }
308 251
309 void FireCoalescingTimer() { 252 void FireCoalescingTimer() {
310 EXPECT_TRUE(mock_timer_->IsRunning()); 253 EXPECT_TRUE(mock_timer_->IsRunning());
311 mock_timer_->Fire(); 254 mock_timer_->Fire();
312 } 255 }
313 256
314 ResourceScheduler* scheduler() { 257 ResourceScheduler* scheduler() {
315 return scheduler_.get(); 258 return scheduler_.get();
316 } 259 }
317 260
318 int next_request_id_;
319 base::MessageLoopForIO message_loop_; 261 base::MessageLoopForIO message_loop_;
320 BrowserThreadImpl ui_thread_; 262 BrowserThreadImpl ui_thread_;
321 BrowserThreadImpl io_thread_; 263 BrowserThreadImpl io_thread_;
322 ResourceDispatcherHostImpl rdh_; 264 ResourceDispatcherHostImpl rdh_;
323 scoped_ptr<ResourceScheduler> scheduler_; 265 scoped_ptr<ResourceScheduler> scheduler_;
324 base::FieldTrialList field_trial_list_; 266 base::FieldTrialList field_trial_list_;
325 base::MockTimer* mock_timer_; 267 base::MockTimer* mock_timer_;
326 net::HttpServerPropertiesImpl http_server_properties_; 268 net::HttpServerPropertiesImpl http_server_properties_;
327 net::TestURLRequestContext context_; 269 net::TestURLRequestContext context_;
328 }; 270 };
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 high2.reset(); 371 high2.reset();
430 EXPECT_TRUE(low2->started()); 372 EXPECT_TRUE(low2->started());
431 } 373 }
432 374
433 TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { 375 TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) {
434 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 376 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
435 scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST)); 377 scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST));
436 378
437 scoped_ptr<net::URLRequest> url_request( 379 scoped_ptr<net::URLRequest> url_request(
438 NewURLRequest("http://host/low2", net::LOWEST)); 380 NewURLRequest("http://host/low2", net::LOWEST));
439 scoped_ptr<ResourceThrottle> throttle( 381 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request(
440 scheduler()->ScheduleRequest(kChildId, kRouteId, url_request.get())); 382 scheduler()->ScheduleRequest(kChildId, kRouteId, true,
383 url_request.get()));
441 scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest( 384 scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest(
442 throttle.Pass(), url_request.Pass())); 385 scheduled_resource_request.Pass(), url_request.Pass()));
443 low2->Start(); 386 low2->Start();
444 387
445 scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST)); 388 scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST));
446 low2->set_request_to_cancel(low3.Pass()); 389 low2->set_request_to_cancel(low3.Pass());
447 scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST)); 390 scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST));
448 391
449 EXPECT_TRUE(high->started()); 392 EXPECT_TRUE(high->started());
450 EXPECT_FALSE(low2->started()); 393 EXPECT_FALSE(low2->started());
451 high.reset(); 394 high.reset();
452 EXPECT_TRUE(low1->started()); 395 EXPECT_TRUE(low1->started());
(...skipping 1903 matching lines...) Expand 10 before | Expand all | Expand 10 after
2356 EXPECT_FALSE(lowest->started()); 2299 EXPECT_FALSE(lowest->started());
2357 scheduler_->OnClientDeleted(kChildId2, kRouteId2); 2300 scheduler_->OnClientDeleted(kChildId2, kRouteId2);
2358 high.reset(); 2301 high.reset();
2359 delayable_requests.clear(); 2302 delayable_requests.clear();
2360 EXPECT_TRUE(lowest->started()); 2303 EXPECT_TRUE(lowest->started());
2361 } 2304 }
2362 2305
2363 } // unnamed namespace 2306 } // unnamed namespace
2364 2307
2365 } // namespace content 2308 } // 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