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

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: Fix tests. 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"
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"
(...skipping 11 matching lines...) Expand all
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
55 class TestRequest : public ResourceController { 50 class TestRequest : public ResourceController {
56 public: 51 public:
57 TestRequest(scoped_ptr<ResourceThrottle> throttle, 52 TestRequest(scoped_ptr<ScheduledResourceRequest> scheduled_resource_request,
58 scoped_ptr<net::URLRequest> url_request) 53 scoped_ptr<net::URLRequest> url_request)
59 : started_(false), 54 : started_(false),
60 throttle_(throttle.Pass()), 55 scheduled_resource_request_(scheduled_resource_request.Pass()),
61 url_request_(url_request.Pass()) { 56 url_request_(url_request.Pass()) {
62 throttle_->set_controller_for_testing(this); 57 scheduled_resource_request_->set_controller_for_testing(this);
63 } 58 }
64 ~TestRequest() override {} 59 ~TestRequest() override {}
65 60
66 bool started() const { return started_; } 61 bool started() const { return started_; }
67 62
68 void Start() { 63 void Start() {
69 bool deferred = false; 64 bool deferred = false;
70 throttle_->WillStartRequest(&deferred); 65 scheduled_resource_request_->WillStartRequest(&deferred);
71 started_ = !deferred; 66 started_ = !deferred;
72 } 67 }
73 68
69 void ChangePriority(net::RequestPriority new_priority, int intra_priority) {
70 scheduled_resource_request_->ChangePriority(new_priority, intra_priority);
71 }
72
74 void Cancel() override { 73 void Cancel() override {
75 // Alert the scheduler that the request can be deleted. 74 // Alert the scheduler that the request can be deleted.
76 throttle_.reset(0); 75 scheduled_resource_request_.reset(0);
77 } 76 }
78 77
79 const net::URLRequest* url_request() const { return url_request_.get(); } 78 const net::URLRequest* url_request() const { return url_request_.get(); }
80 79
81 protected: 80 protected:
82 // ResourceController interface: 81 // ResourceController interface:
83 void CancelAndIgnore() override {} 82 void CancelAndIgnore() override {}
84 void CancelWithError(int error_code) override {} 83 void CancelWithError(int error_code) override {}
85 void Resume() override { started_ = true; } 84 void Resume() override { started_ = true; }
86 85
87 private: 86 private:
88 bool started_; 87 bool started_;
89 scoped_ptr<ResourceThrottle> throttle_; 88 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request_;
90 scoped_ptr<net::URLRequest> url_request_; 89 scoped_ptr<net::URLRequest> url_request_;
91 }; 90 };
92 91
93 class CancelingTestRequest : public TestRequest { 92 class CancelingTestRequest : public TestRequest {
94 public: 93 public:
95 CancelingTestRequest(scoped_ptr<ResourceThrottle> throttle, 94 CancelingTestRequest(
96 scoped_ptr<net::URLRequest> url_request) 95 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request,
97 : TestRequest(throttle.Pass(), url_request.Pass()) {} 96 scoped_ptr<net::URLRequest> url_request)
97 : TestRequest(scheduled_resource_request.Pass(), url_request.Pass()) {}
98 98
99 void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) { 99 void set_request_to_cancel(scoped_ptr<TestRequest> request_to_cancel) {
100 request_to_cancel_ = request_to_cancel.Pass(); 100 request_to_cancel_ = request_to_cancel.Pass();
101 } 101 }
102 102
103 private: 103 private:
104 void Resume() override { 104 void Resume() override {
105 TestRequest::Resume(); 105 TestRequest::Resume();
106 request_to_cancel_.reset(); 106 request_to_cancel_.reset();
107 } 107 }
108 108
109 scoped_ptr<TestRequest> request_to_cancel_; 109 scoped_ptr<TestRequest> request_to_cancel_;
110 }; 110 };
111 111
112 class FakeResourceContext : public ResourceContext { 112 class FakeResourceContext : public ResourceContext {
113 private: 113 private:
114 net::HostResolver* GetHostResolver() override { return NULL; } 114 net::HostResolver* GetHostResolver() override { return NULL; }
115 net::URLRequestContext* GetRequestContext() override { return NULL; } 115 net::URLRequestContext* GetRequestContext() override { return NULL; }
116 }; 116 };
117 117
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 { 118 class ResourceSchedulerTest : public testing::Test {
147 protected: 119 protected:
148 ResourceSchedulerTest() 120 ResourceSchedulerTest()
149 : next_request_id_(0), 121 : next_request_id_(0),
150 ui_thread_(BrowserThread::UI, &message_loop_), 122 ui_thread_(BrowserThread::UI, &message_loop_),
151 io_thread_(BrowserThread::IO, &message_loop_), 123 io_thread_(BrowserThread::IO, &message_loop_),
152 field_trial_list_(new base::MockEntropyProvider()) { 124 field_trial_list_(new base::MockEntropyProvider()) {
153 InitializeScheduler(); 125 InitializeScheduler();
154 context_.set_http_server_properties(http_server_properties_.GetWeakPtr()); 126 context_.set_http_server_properties(http_server_properties_.GetWeakPtr());
155 } 127 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 return base::FieldTrialList::CreateTrialsFromString( 164 return base::FieldTrialList::CreateTrialsFromString(
193 force_field_trial_argument, 165 force_field_trial_argument,
194 base::FieldTrialList::DONT_ACTIVATE_TRIALS, 166 base::FieldTrialList::DONT_ACTIVATE_TRIALS,
195 std::set<std::string>()); 167 std::set<std::string>());
196 } 168 }
197 169
198 scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute( 170 scoped_ptr<net::URLRequest> NewURLRequestWithChildAndRoute(
199 const char* url, 171 const char* url,
200 net::RequestPriority priority, 172 net::RequestPriority priority,
201 int child_id, 173 int child_id,
202 int route_id, 174 int route_id) {
203 bool is_async) {
204 scoped_ptr<net::URLRequest> url_request( 175 scoped_ptr<net::URLRequest> url_request(
205 context_.CreateRequest(GURL(url), priority, NULL)); 176 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(); 177 return url_request.Pass();
234 } 178 }
235 179
236 scoped_ptr<net::URLRequest> NewURLRequest(const char* url, 180 scoped_ptr<net::URLRequest> NewURLRequest(const char* url,
237 net::RequestPriority priority) { 181 net::RequestPriority priority) {
238 return NewURLRequestWithChildAndRoute( 182 return NewURLRequestWithChildAndRoute(url, priority, kChildId, kRouteId);
239 url, priority, kChildId, kRouteId, true);
240 } 183 }
241 184
242 TestRequest* NewRequestWithRoute(const char* url, 185 TestRequest* NewRequestWithRoute(const char* url,
243 net::RequestPriority priority, 186 net::RequestPriority priority,
244 int route_id) { 187 int route_id) {
245 return NewRequestWithChildAndRoute(url, priority, route_id, kChildId); 188 return NewRequestWithChildAndRoute(url, priority, route_id, kChildId);
246 } 189 }
247 190
248 TestRequest* NewRequestWithChildAndRoute(const char* url, 191 TestRequest* NewRequestWithChildAndRoute(const char* url,
249 net::RequestPriority priority, 192 net::RequestPriority priority,
(...skipping 27 matching lines...) Expand all
277 int child_id, 220 int child_id,
278 int route_id) { 221 int route_id) {
279 return GetNewTestRequest(url, priority, child_id, route_id, false); 222 return GetNewTestRequest(url, priority, child_id, route_id, false);
280 } 223 }
281 224
282 TestRequest* GetNewTestRequest(const char* url, 225 TestRequest* GetNewTestRequest(const char* url,
283 net::RequestPriority priority, 226 net::RequestPriority priority,
284 int child_id, 227 int child_id,
285 int route_id, 228 int route_id,
286 bool is_async) { 229 bool is_async) {
287 scoped_ptr<net::URLRequest> url_request(NewURLRequestWithChildAndRoute( 230 scoped_ptr<net::URLRequest> url_request(
288 url, priority, child_id, route_id, is_async)); 231 NewURLRequestWithChildAndRoute(url, priority, child_id, route_id));
289 scoped_ptr<ResourceThrottle> throttle( 232 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request(
290 scheduler_->ScheduleRequest(child_id, route_id, url_request.get())); 233 scheduler_->ScheduleRequest(child_id, route_id, is_async,
291 TestRequest* request = new TestRequest(throttle.Pass(), url_request.Pass()); 234 url_request.get()));
235 TestRequest* request =
236 new TestRequest(scheduled_resource_request.Pass(), url_request.Pass());
292 request->Start(); 237 request->Start();
293 return request; 238 return request;
294 } 239 }
295 240
296 void ChangeRequestPriority(TestRequest* request, 241 void ChangeRequestPriority(TestRequest* request,
297 net::RequestPriority new_priority, 242 net::RequestPriority new_priority,
298 int intra_priority = 0) { 243 int intra_priority = 0) {
299 scoped_refptr<FakeResourceMessageFilter> filter( 244 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 } 245 }
308 246
309 void FireCoalescingTimer() { 247 void FireCoalescingTimer() {
310 EXPECT_TRUE(mock_timer_->IsRunning()); 248 EXPECT_TRUE(mock_timer_->IsRunning());
311 mock_timer_->Fire(); 249 mock_timer_->Fire();
312 } 250 }
313 251
314 ResourceScheduler* scheduler() { 252 ResourceScheduler* scheduler() {
315 return scheduler_.get(); 253 return scheduler_.get();
316 } 254 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 high2.reset(); 367 high2.reset();
430 EXPECT_TRUE(low2->started()); 368 EXPECT_TRUE(low2->started());
431 } 369 }
432 370
433 TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { 371 TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) {
434 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); 372 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
435 scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST)); 373 scoped_ptr<TestRequest> low1(NewRequest("http://host/low1", net::LOWEST));
436 374
437 scoped_ptr<net::URLRequest> url_request( 375 scoped_ptr<net::URLRequest> url_request(
438 NewURLRequest("http://host/low2", net::LOWEST)); 376 NewURLRequest("http://host/low2", net::LOWEST));
439 scoped_ptr<ResourceThrottle> throttle( 377 scoped_ptr<ScheduledResourceRequest> scheduled_resource_request(
440 scheduler()->ScheduleRequest(kChildId, kRouteId, url_request.get())); 378 scheduler()->ScheduleRequest(kChildId, kRouteId, true,
379 url_request.get()));
441 scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest( 380 scoped_ptr<CancelingTestRequest> low2(new CancelingTestRequest(
442 throttle.Pass(), url_request.Pass())); 381 scheduled_resource_request.Pass(), url_request.Pass()));
443 low2->Start(); 382 low2->Start();
444 383
445 scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST)); 384 scoped_ptr<TestRequest> low3(NewRequest("http://host/low3", net::LOWEST));
446 low2->set_request_to_cancel(low3.Pass()); 385 low2->set_request_to_cancel(low3.Pass());
447 scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST)); 386 scoped_ptr<TestRequest> low4(NewRequest("http://host/low4", net::LOWEST));
448 387
449 EXPECT_TRUE(high->started()); 388 EXPECT_TRUE(high->started());
450 EXPECT_FALSE(low2->started()); 389 EXPECT_FALSE(low2->started());
451 high.reset(); 390 high.reset();
452 EXPECT_TRUE(low1->started()); 391 EXPECT_TRUE(low1->started());
(...skipping 1903 matching lines...) Expand 10 before | Expand all | Expand 10 after
2356 EXPECT_FALSE(lowest->started()); 2295 EXPECT_FALSE(lowest->started());
2357 scheduler_->OnClientDeleted(kChildId2, kRouteId2); 2296 scheduler_->OnClientDeleted(kChildId2, kRouteId2);
2358 high.reset(); 2297 high.reset();
2359 delayable_requests.clear(); 2298 delayable_requests.clear();
2360 EXPECT_TRUE(lowest->started()); 2299 EXPECT_TRUE(lowest->started());
2361 } 2300 }
2362 2301
2363 } // unnamed namespace 2302 } // unnamed namespace
2364 2303
2365 } // namespace content 2304 } // namespace content
OLDNEW
« content/browser/loader/resource_scheduler.h ('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