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

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

Issue 2481093003: Introduce ResourceRequesterInfo to abstract the requester of resource request (Closed)
Patch Set: fix URLLoaderFactoryImplTest/URLLoaderFactoryImplTest.GetFailedResponse2 Created 4 years 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/url_loader_factory_impl.h" 5 #include "content/browser/loader/url_loader_factory_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 15 matching lines...) Expand all
26 #include "content/browser/loader/resource_message_filter.h" 26 #include "content/browser/loader/resource_message_filter.h"
27 #include "content/browser/loader/resource_request_info_impl.h" 27 #include "content/browser/loader/resource_request_info_impl.h"
28 #include "content/browser/loader/test_url_loader_client.h" 28 #include "content/browser/loader/test_url_loader_client.h"
29 #include "content/browser/loader_delegate_impl.h" 29 #include "content/browser/loader_delegate_impl.h"
30 #include "content/common/resource_request.h" 30 #include "content/common/resource_request.h"
31 #include "content/common/resource_request_completion_status.h" 31 #include "content/common/resource_request_completion_status.h"
32 #include "content/common/url_loader.mojom.h" 32 #include "content/common/url_loader.mojom.h"
33 #include "content/public/browser/resource_context.h" 33 #include "content/public/browser/resource_context.h"
34 #include "content/public/browser/resource_dispatcher_host_delegate.h" 34 #include "content/public/browser/resource_dispatcher_host_delegate.h"
35 #include "content/public/common/content_paths.h" 35 #include "content/public/common/content_paths.h"
36 #include "content/public/common/process_type.h"
37 #include "content/public/test/test_browser_context.h" 36 #include "content/public/test/test_browser_context.h"
38 #include "content/public/test/test_browser_thread_bundle.h" 37 #include "content/public/test/test_browser_thread_bundle.h"
39 #include "mojo/public/c/system/data_pipe.h" 38 #include "mojo/public/c/system/data_pipe.h"
40 #include "mojo/public/c/system/types.h" 39 #include "mojo/public/c/system/types.h"
41 #include "mojo/public/cpp/bindings/binding.h" 40 #include "mojo/public/cpp/bindings/binding.h"
42 #include "mojo/public/cpp/system/data_pipe.h" 41 #include "mojo/public/cpp/system/data_pipe.h"
43 #include "net/base/io_buffer.h" 42 #include "net/base/io_buffer.h"
44 #include "net/base/net_errors.h" 43 #include "net/base/net_errors.h"
45 #include "net/http/http_response_headers.h" 44 #include "net/http/http_response_headers.h"
46 #include "net/http/http_response_info.h" 45 #include "net/http/http_response_info.h"
47 #include "net/http/http_status_code.h" 46 #include "net/http/http_status_code.h"
48 #include "net/http/http_util.h" 47 #include "net/http/http_util.h"
49 #include "net/test/url_request/url_request_failed_job.h" 48 #include "net/test/url_request/url_request_failed_job.h"
50 #include "net/test/url_request/url_request_mock_http_job.h" 49 #include "net/test/url_request/url_request_mock_http_job.h"
51 #include "net/test/url_request/url_request_slow_download_job.h" 50 #include "net/test/url_request/url_request_slow_download_job.h"
52 #include "net/url_request/url_request_filter.h" 51 #include "net/url_request/url_request_filter.h"
53 #include "testing/gtest/include/gtest/gtest.h" 52 #include "testing/gtest/include/gtest/gtest.h"
54 #include "url/gurl.h" 53 #include "url/gurl.h"
54 #include "url/origin.h"
55 55
56 namespace content { 56 namespace content {
57 57
58 namespace { 58 namespace {
59 59
60 constexpr int kChildId = 99; 60 constexpr int kChildId = 99;
61 61
62 class RejectingResourceDispatcherHostDelegate final 62 class RejectingResourceDispatcherHostDelegate final
63 : public ResourceDispatcherHostDelegate { 63 : public ResourceDispatcherHostDelegate {
64 public: 64 public:
(...skipping 11 matching lines...) Expand all
76 // The test parameter is the number of bytes allocated for the buffer in the 76 // The test parameter is the number of bytes allocated for the buffer in the
77 // data pipe, for testing the case where the allocated size is smaller than the 77 // data pipe, for testing the case where the allocated size is smaller than the
78 // size the mime sniffer *implicitly* requires. 78 // size the mime sniffer *implicitly* requires.
79 class URLLoaderFactoryImplTest : public ::testing::TestWithParam<size_t> { 79 class URLLoaderFactoryImplTest : public ::testing::TestWithParam<size_t> {
80 public: 80 public:
81 URLLoaderFactoryImplTest() 81 URLLoaderFactoryImplTest()
82 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP), 82 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP),
83 browser_context_(new TestBrowserContext()), 83 browser_context_(new TestBrowserContext()),
84 resource_message_filter_(new ResourceMessageFilter( 84 resource_message_filter_(new ResourceMessageFilter(
85 kChildId, 85 kChildId,
86 // If browser side navigation is enabled then
87 // ResourceDispatcherHostImpl prevents main frame URL requests from
88 // the renderer. Ensure that these checks don't trip us up by
89 // setting the process type in ResourceMessageFilter as
90 // PROCESS_TYPE_UNKNOWN.
91 PROCESS_TYPE_UNKNOWN,
92 nullptr, 86 nullptr,
93 nullptr, 87 nullptr,
94 nullptr, 88 nullptr,
95 nullptr, 89 nullptr,
96 base::Bind(&URLLoaderFactoryImplTest::GetContexts, 90 base::Bind(&URLLoaderFactoryImplTest::GetContexts,
97 base::Unretained(this)))) { 91 base::Unretained(this)))) {
92 resource_message_filter_->InitializeForTest();
98 MojoAsyncResourceHandler::SetAllocationSizeForTesting(GetParam()); 93 MojoAsyncResourceHandler::SetAllocationSizeForTesting(GetParam());
99 rdh_.SetLoaderDelegate(&loader_deleate_); 94 rdh_.SetLoaderDelegate(&loader_deleate_);
100 95
101 URLLoaderFactoryImpl::Create(resource_message_filter_, 96 URLLoaderFactoryImpl::Create(
102 mojo::GetProxy(&factory_)); 97 resource_message_filter_->requester_info_for_test(),
98 mojo::GetProxy(&factory_));
103 99
104 // Calling this function creates a request context. 100 // Calling this function creates a request context.
105 browser_context_->GetResourceContext()->GetRequestContext(); 101 browser_context_->GetResourceContext()->GetRequestContext();
106 base::RunLoop().RunUntilIdle(); 102 base::RunLoop().RunUntilIdle();
107 } 103 }
108 104
109 ~URLLoaderFactoryImplTest() override { 105 ~URLLoaderFactoryImplTest() override {
110 rdh_.SetDelegate(nullptr); 106 rdh_.SetDelegate(nullptr);
111 net::URLRequestFilter::GetInstance()->ClearHandlers(); 107 net::URLRequestFilter::GetInstance()->ClearHandlers();
112 108
(...skipping 29 matching lines...) Expand all
142 mojom::URLLoaderAssociatedPtr loader; 138 mojom::URLLoaderAssociatedPtr loader;
143 base::FilePath root; 139 base::FilePath root;
144 PathService::Get(DIR_TEST_DATA, &root); 140 PathService::Get(DIR_TEST_DATA, &root);
145 net::URLRequestMockHTTPJob::AddUrlHandlers(root, 141 net::URLRequestMockHTTPJob::AddUrlHandlers(root,
146 BrowserThread::GetBlockingPool()); 142 BrowserThread::GetBlockingPool());
147 ResourceRequest request; 143 ResourceRequest request;
148 TestURLLoaderClient client; 144 TestURLLoaderClient client;
149 // Assume the file contents is small enough to be stored in the data pipe. 145 // Assume the file contents is small enough to be stored in the data pipe.
150 request.url = net::URLRequestMockHTTPJob::GetMockUrl("hello.html"); 146 request.url = net::URLRequestMockHTTPJob::GetMockUrl("hello.html");
151 request.method = "GET"; 147 request.method = "GET";
152 request.is_main_frame = true; 148 // |resource_type| can't be a frame type. It is because when PlzNavigate is
149 // enabled, the url scheme of frame type requests from the renderer process
150 // must be blob scheme.
151 request.resource_type = RESOURCE_TYPE_XHR;
152 // Need to set |request_initiator| for non main frame type request.
153 request.request_initiator = url::Origin();
153 factory_->CreateLoaderAndStart( 154 factory_->CreateLoaderAndStart(
154 mojo::GetProxy(&loader, factory_.associated_group()), kRoutingId, 155 mojo::GetProxy(&loader, factory_.associated_group()), kRoutingId,
155 kRequestId, request, 156 kRequestId, request,
156 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group())); 157 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group()));
157 158
158 ASSERT_FALSE(client.has_received_response()); 159 ASSERT_FALSE(client.has_received_response());
159 ASSERT_FALSE(client.response_body().is_valid()); 160 ASSERT_FALSE(client.response_body().is_valid());
160 ASSERT_FALSE(client.has_received_completion()); 161 ASSERT_FALSE(client.has_received_completion());
161 162
162 client.RunUntilResponseReceived(); 163 client.RunUntilResponseReceived();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 212
212 TEST_P(URLLoaderFactoryImplTest, GetFailedResponse) { 213 TEST_P(URLLoaderFactoryImplTest, GetFailedResponse) {
213 NavigationResourceThrottle::set_ui_checks_always_succeed_for_testing(true); 214 NavigationResourceThrottle::set_ui_checks_always_succeed_for_testing(true);
214 mojom::URLLoaderAssociatedPtr loader; 215 mojom::URLLoaderAssociatedPtr loader;
215 ResourceRequest request; 216 ResourceRequest request;
216 TestURLLoaderClient client; 217 TestURLLoaderClient client;
217 net::URLRequestFailedJob::AddUrlHandler(); 218 net::URLRequestFailedJob::AddUrlHandler();
218 request.url = net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase( 219 request.url = net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase(
219 net::URLRequestFailedJob::START, net::ERR_TIMED_OUT); 220 net::URLRequestFailedJob::START, net::ERR_TIMED_OUT);
220 request.method = "GET"; 221 request.method = "GET";
222 // |resource_type| can't be a frame type. It is because when PlzNavigate is
223 // enabled, the url scheme of frame type requests from the renderer process
224 // must be blob scheme.
225 request.resource_type = RESOURCE_TYPE_XHR;
226 // Need to set |request_initiator| for non main frame type request.
227 request.request_initiator = url::Origin();
221 factory_->CreateLoaderAndStart( 228 factory_->CreateLoaderAndStart(
222 mojo::GetProxy(&loader, factory_.associated_group()), 2, 1, request, 229 mojo::GetProxy(&loader, factory_.associated_group()), 2, 1, request,
223 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group())); 230 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group()));
224 231
225 client.RunUntilComplete(); 232 client.RunUntilComplete();
226 ASSERT_FALSE(client.has_received_response()); 233 ASSERT_FALSE(client.has_received_response());
227 ASSERT_FALSE(client.response_body().is_valid()); 234 ASSERT_FALSE(client.response_body().is_valid());
228 235
229 EXPECT_EQ(net::ERR_TIMED_OUT, client.completion_status().error_code); 236 EXPECT_EQ(net::ERR_TIMED_OUT, client.completion_status().error_code);
230 EXPECT_EQ(0, client.completion_status().encoded_data_length); 237 EXPECT_EQ(0, client.completion_status().encoded_data_length);
231 EXPECT_EQ(0, client.completion_status().encoded_body_length); 238 EXPECT_EQ(0, client.completion_status().encoded_body_length);
232 } 239 }
233 240
234 // In this case, the loading fails after receiving a response. 241 // In this case, the loading fails after receiving a response.
235 TEST_P(URLLoaderFactoryImplTest, GetFailedResponse2) { 242 TEST_P(URLLoaderFactoryImplTest, GetFailedResponse2) {
236 NavigationResourceThrottle::set_ui_checks_always_succeed_for_testing(true); 243 NavigationResourceThrottle::set_ui_checks_always_succeed_for_testing(true);
237 mojom::URLLoaderAssociatedPtr loader; 244 mojom::URLLoaderAssociatedPtr loader;
238 ResourceRequest request; 245 ResourceRequest request;
239 TestURLLoaderClient client; 246 TestURLLoaderClient client;
240 net::URLRequestFailedJob::AddUrlHandler(); 247 net::URLRequestFailedJob::AddUrlHandler();
241 request.url = net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase( 248 request.url = net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase(
242 net::URLRequestFailedJob::READ_ASYNC, net::ERR_TIMED_OUT); 249 net::URLRequestFailedJob::READ_ASYNC, net::ERR_TIMED_OUT);
243 request.method = "GET"; 250 request.method = "GET";
244 request.is_main_frame = true; 251 // |resource_type| can't be a frame type. It is because when PlzNavigate is
252 // enabled, the url scheme of frame type requests from the renderer process
253 // must be blob scheme.
254 request.resource_type = RESOURCE_TYPE_XHR;
255 // Need to set |request_initiator| for non main frame type request.
256 request.request_initiator = url::Origin();
245 factory_->CreateLoaderAndStart( 257 factory_->CreateLoaderAndStart(
246 mojo::GetProxy(&loader, factory_.associated_group()), 2, 1, request, 258 mojo::GetProxy(&loader, factory_.associated_group()), 2, 1, request,
247 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group())); 259 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group()));
248 260
249 client.RunUntilComplete(); 261 client.RunUntilComplete();
250 ASSERT_FALSE(client.has_received_response()); 262 ASSERT_FALSE(client.has_received_response());
251 ASSERT_TRUE(client.response_body().is_valid()); 263 ASSERT_TRUE(client.response_body().is_valid());
252 264
253 EXPECT_EQ(net::ERR_TIMED_OUT, client.completion_status().error_code); 265 EXPECT_EQ(net::ERR_TIMED_OUT, client.completion_status().error_code);
254 EXPECT_GT(client.completion_status().encoded_data_length, 0); 266 EXPECT_GT(client.completion_status().encoded_data_length, 0);
255 EXPECT_EQ(0, client.completion_status().encoded_body_length); 267 EXPECT_EQ(0, client.completion_status().encoded_body_length);
256 } 268 }
257 269
258 // This test tests a case where resource loading is cancelled before started. 270 // This test tests a case where resource loading is cancelled before started.
259 TEST_P(URLLoaderFactoryImplTest, InvalidURL) { 271 TEST_P(URLLoaderFactoryImplTest, InvalidURL) {
260 mojom::URLLoaderAssociatedPtr loader; 272 mojom::URLLoaderAssociatedPtr loader;
261 ResourceRequest request; 273 ResourceRequest request;
262 TestURLLoaderClient client; 274 TestURLLoaderClient client;
263 request.url = GURL(); 275 request.url = GURL();
264 request.method = "GET"; 276 request.method = "GET";
277 // |resource_type| can't be a frame type. It is because when PlzNavigate is
278 // enabled, the url scheme of frame type requests from the renderer process
279 // must be blob scheme.
280 request.resource_type = RESOURCE_TYPE_XHR;
281 // Need to set |request_initiator| for non main frame type request.
282 request.request_initiator = url::Origin();
265 ASSERT_FALSE(request.url.is_valid()); 283 ASSERT_FALSE(request.url.is_valid());
266 factory_->CreateLoaderAndStart( 284 factory_->CreateLoaderAndStart(
267 mojo::GetProxy(&loader, factory_.associated_group()), 2, 1, request, 285 mojo::GetProxy(&loader, factory_.associated_group()), 2, 1, request,
268 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group())); 286 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group()));
269 287
270 client.RunUntilComplete(); 288 client.RunUntilComplete();
271 ASSERT_FALSE(client.has_received_response()); 289 ASSERT_FALSE(client.has_received_response());
272 ASSERT_FALSE(client.response_body().is_valid()); 290 ASSERT_FALSE(client.response_body().is_valid());
273 291
274 EXPECT_EQ(net::ERR_ABORTED, client.completion_status().error_code); 292 EXPECT_EQ(net::ERR_ABORTED, client.completion_status().error_code);
275 } 293 }
276 294
277 // This test tests a case where resource loading is cancelled before started. 295 // This test tests a case where resource loading is cancelled before started.
278 TEST_P(URLLoaderFactoryImplTest, ShouldNotRequestURL) { 296 TEST_P(URLLoaderFactoryImplTest, ShouldNotRequestURL) {
279 mojom::URLLoaderAssociatedPtr loader; 297 mojom::URLLoaderAssociatedPtr loader;
280 RejectingResourceDispatcherHostDelegate rdh_delegate; 298 RejectingResourceDispatcherHostDelegate rdh_delegate;
281 rdh_.SetDelegate(&rdh_delegate); 299 rdh_.SetDelegate(&rdh_delegate);
282 ResourceRequest request; 300 ResourceRequest request;
283 TestURLLoaderClient client; 301 TestURLLoaderClient client;
284 request.url = GURL("http://localhost/"); 302 request.url = GURL("http://localhost/");
285 request.method = "GET"; 303 request.method = "GET";
304 // |resource_type| can't be a frame type. It is because when PlzNavigate is
305 // enabled, the url scheme of frame type requests from the renderer process
306 // must be blob scheme.
307 request.resource_type = RESOURCE_TYPE_XHR;
308 // Need to set |request_initiator| for non main frame type request.
309 request.request_initiator = url::Origin();
286 factory_->CreateLoaderAndStart( 310 factory_->CreateLoaderAndStart(
287 mojo::GetProxy(&loader, factory_.associated_group()), 2, 1, request, 311 mojo::GetProxy(&loader, factory_.associated_group()), 2, 1, request,
288 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group())); 312 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group()));
289 313
290 client.RunUntilComplete(); 314 client.RunUntilComplete();
291 rdh_.SetDelegate(nullptr); 315 rdh_.SetDelegate(nullptr);
292 316
293 ASSERT_FALSE(client.has_received_response()); 317 ASSERT_FALSE(client.has_received_response());
294 ASSERT_FALSE(client.response_body().is_valid()); 318 ASSERT_FALSE(client.response_body().is_valid());
295 319
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 mojom::URLLoaderAssociatedPtr loader; 455 mojom::URLLoaderAssociatedPtr loader;
432 base::FilePath root; 456 base::FilePath root;
433 PathService::Get(DIR_TEST_DATA, &root); 457 PathService::Get(DIR_TEST_DATA, &root);
434 net::URLRequestFailedJob::AddUrlHandler(); 458 net::URLRequestFailedJob::AddUrlHandler();
435 ResourceRequest request; 459 ResourceRequest request;
436 TestURLLoaderClient client; 460 TestURLLoaderClient client;
437 // Assume the file contents is small enough to be stored in the data pipe. 461 // Assume the file contents is small enough to be stored in the data pipe.
438 request.url = net::URLRequestFailedJob::GetMockHttpUrl(net::ERR_IO_PENDING); 462 request.url = net::URLRequestFailedJob::GetMockHttpUrl(net::ERR_IO_PENDING);
439 request.method = "GET"; 463 request.method = "GET";
440 request.is_main_frame = true; 464 request.is_main_frame = true;
465 // |resource_type| can't be a frame type. It is because when PlzNavigate is
466 // enabled, the url scheme of frame type requests from the renderer process
467 // must be blob scheme.
468 request.resource_type = RESOURCE_TYPE_XHR;
469 // Need to set |request_initiator| for non main frame type request.
470 request.request_initiator = url::Origin();
441 factory_->CreateLoaderAndStart( 471 factory_->CreateLoaderAndStart(
442 mojo::GetProxy(&loader, factory_.associated_group()), kRoutingId, 472 mojo::GetProxy(&loader, factory_.associated_group()), kRoutingId,
443 kRequestId, request, 473 kRequestId, request,
444 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group())); 474 client.CreateRemoteAssociatedPtrInfo(factory_.associated_group()));
445 475
446 base::RunLoop().RunUntilIdle(); 476 base::RunLoop().RunUntilIdle();
447 ASSERT_TRUE(rdh_.GetURLRequest(GlobalRequestID(kChildId, kRequestId))); 477 ASSERT_TRUE(rdh_.GetURLRequest(GlobalRequestID(kChildId, kRequestId)));
448 ASSERT_FALSE(client.has_received_response()); 478 ASSERT_FALSE(client.has_received_response());
449 ASSERT_FALSE(client.response_body().is_valid()); 479 ASSERT_FALSE(client.response_body().is_valid());
450 ASSERT_FALSE(client.has_received_completion()); 480 ASSERT_FALSE(client.has_received_completion());
451 481
452 loader = nullptr; 482 loader = nullptr;
453 base::RunLoop().RunUntilIdle(); 483 base::RunLoop().RunUntilIdle();
454 ASSERT_FALSE(rdh_.GetURLRequest(GlobalRequestID(kChildId, kRequestId))); 484 ASSERT_FALSE(rdh_.GetURLRequest(GlobalRequestID(kChildId, kRequestId)));
455 } 485 }
456 486
457 INSTANTIATE_TEST_CASE_P(URLLoaderFactoryImplTest, 487 INSTANTIATE_TEST_CASE_P(URLLoaderFactoryImplTest,
458 URLLoaderFactoryImplTest, 488 URLLoaderFactoryImplTest,
459 ::testing::Values(128, 32 * 1024)); 489 ::testing::Values(128, 32 * 1024));
460 490
461 } // namespace 491 } // namespace
462 492
463 } // namespace content 493 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/url_loader_factory_impl.cc ('k') | content/browser/renderer_host/render_process_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698