Add --output-dir flag for page_runner.py to specify a custom directory for
[chromium-blink-merge.git] / net / url_request / url_request_test_util.cc
blob82d8579f54775a09015c345dd223022e9b1f8bb9
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.
5 #include "net/url_request/url_request_test_util.h"
7 #include "base/compiler_specific.h"
8 #include "base/logging.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/threading/thread.h"
11 #include "base/threading/worker_pool.h"
12 #include "net/base/host_port_pair.h"
13 #include "net/cert/cert_verifier.h"
14 #include "net/dns/mock_host_resolver.h"
15 #include "net/http/http_network_session.h"
16 #include "net/http/http_response_headers.h"
17 #include "net/http/http_server_properties_impl.h"
18 #include "net/http/transport_security_state.h"
19 #include "net/ssl/channel_id_service.h"
20 #include "net/ssl/default_channel_id_store.h"
21 #include "net/url_request/static_http_user_agent_settings.h"
22 #include "net/url_request/url_request_job_factory_impl.h"
23 #include "testing/gtest/include/gtest/gtest.h"
25 namespace net {
27 namespace {
29 // These constants put the NetworkDelegate events of TestNetworkDelegate
30 // into an order. They are used in conjunction with
31 // |TestNetworkDelegate::next_states_| to check that we do not send
32 // events in the wrong order.
33 const int kStageBeforeURLRequest = 1 << 0;
34 const int kStageBeforeSendHeaders = 1 << 1;
35 const int kStageSendHeaders = 1 << 2;
36 const int kStageHeadersReceived = 1 << 3;
37 const int kStageAuthRequired = 1 << 4;
38 const int kStageBeforeRedirect = 1 << 5;
39 const int kStageResponseStarted = 1 << 6;
40 const int kStageCompletedSuccess = 1 << 7;
41 const int kStageCompletedError = 1 << 8;
42 const int kStageURLRequestDestroyed = 1 << 9;
43 const int kStageDestruction = 1 << 10;
45 } // namespace
47 TestURLRequestContext::TestURLRequestContext()
48 : initialized_(false),
49 client_socket_factory_(NULL),
50 context_storage_(this) {
51 Init();
54 TestURLRequestContext::TestURLRequestContext(bool delay_initialization)
55 : initialized_(false),
56 client_socket_factory_(NULL),
57 context_storage_(this) {
58 if (!delay_initialization)
59 Init();
62 TestURLRequestContext::~TestURLRequestContext() {
63 DCHECK(initialized_);
64 AssertNoURLRequests();
67 void TestURLRequestContext::Init() {
68 DCHECK(!initialized_);
69 initialized_ = true;
71 if (!host_resolver())
72 context_storage_.set_host_resolver(
73 scoped_ptr<HostResolver>(new MockCachingHostResolver()));
74 if (!proxy_service())
75 context_storage_.set_proxy_service(ProxyService::CreateDirect());
76 if (!cert_verifier())
77 context_storage_.set_cert_verifier(CertVerifier::CreateDefault());
78 if (!transport_security_state())
79 context_storage_.set_transport_security_state(new TransportSecurityState);
80 if (!ssl_config_service())
81 context_storage_.set_ssl_config_service(new SSLConfigServiceDefaults);
82 if (!http_auth_handler_factory()) {
83 context_storage_.set_http_auth_handler_factory(
84 HttpAuthHandlerFactory::CreateDefault(host_resolver()));
86 if (!http_server_properties()) {
87 context_storage_.set_http_server_properties(
88 scoped_ptr<HttpServerProperties>(new HttpServerPropertiesImpl()));
90 if (!transport_security_state()) {
91 context_storage_.set_transport_security_state(
92 new TransportSecurityState());
94 if (http_transaction_factory()) {
95 // Make sure we haven't been passed an object we're not going to use.
96 EXPECT_FALSE(client_socket_factory_);
97 } else {
98 HttpNetworkSession::Params params;
99 if (http_network_session_params_)
100 params = *http_network_session_params_;
101 params.client_socket_factory = client_socket_factory();
102 params.host_resolver = host_resolver();
103 params.cert_verifier = cert_verifier();
104 params.transport_security_state = transport_security_state();
105 params.proxy_service = proxy_service();
106 params.ssl_config_service = ssl_config_service();
107 params.http_auth_handler_factory = http_auth_handler_factory();
108 params.network_delegate = network_delegate();
109 params.http_server_properties = http_server_properties();
110 params.net_log = net_log();
111 context_storage_.set_http_transaction_factory(new HttpCache(
112 new HttpNetworkSession(params),
113 HttpCache::DefaultBackend::InMemory(0)));
115 // In-memory cookie store.
116 if (!cookie_store())
117 context_storage_.set_cookie_store(new CookieMonster(NULL, NULL));
118 // In-memory Channel ID service.
119 if (!channel_id_service()) {
120 context_storage_.set_channel_id_service(
121 new ChannelIDService(
122 new DefaultChannelIDStore(NULL),
123 base::WorkerPool::GetTaskRunner(true)));
125 if (!http_user_agent_settings()) {
126 context_storage_.set_http_user_agent_settings(
127 new StaticHttpUserAgentSettings("en-us,fr", std::string()));
129 if (!job_factory())
130 context_storage_.set_job_factory(new URLRequestJobFactoryImpl);
133 TestURLRequestContextGetter::TestURLRequestContextGetter(
134 const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner)
135 : network_task_runner_(network_task_runner) {
136 DCHECK(network_task_runner_.get());
139 TestURLRequestContextGetter::TestURLRequestContextGetter(
140 const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner,
141 scoped_ptr<TestURLRequestContext> context)
142 : network_task_runner_(network_task_runner), context_(context.Pass()) {
143 DCHECK(network_task_runner_.get());
146 TestURLRequestContextGetter::~TestURLRequestContextGetter() {}
148 TestURLRequestContext* TestURLRequestContextGetter::GetURLRequestContext() {
149 if (!context_.get())
150 context_.reset(new TestURLRequestContext);
151 return context_.get();
154 scoped_refptr<base::SingleThreadTaskRunner>
155 TestURLRequestContextGetter::GetNetworkTaskRunner() const {
156 return network_task_runner_;
159 TestDelegate::TestDelegate()
160 : cancel_in_rr_(false),
161 cancel_in_rs_(false),
162 cancel_in_rd_(false),
163 cancel_in_rd_pending_(false),
164 quit_on_complete_(true),
165 quit_on_redirect_(false),
166 quit_on_before_network_start_(false),
167 allow_certificate_errors_(false),
168 response_started_count_(0),
169 received_bytes_count_(0),
170 received_redirect_count_(0),
171 received_before_network_start_count_(0),
172 received_data_before_response_(false),
173 request_failed_(false),
174 have_certificate_errors_(false),
175 certificate_errors_are_fatal_(false),
176 auth_required_(false),
177 have_full_request_headers_(false),
178 buf_(new IOBuffer(kBufferSize)) {
181 TestDelegate::~TestDelegate() {}
183 void TestDelegate::ClearFullRequestHeaders() {
184 full_request_headers_.Clear();
185 have_full_request_headers_ = false;
188 void TestDelegate::OnReceivedRedirect(URLRequest* request,
189 const RedirectInfo& redirect_info,
190 bool* defer_redirect) {
191 EXPECT_TRUE(request->is_redirecting());
193 have_full_request_headers_ =
194 request->GetFullRequestHeaders(&full_request_headers_);
196 received_redirect_count_++;
197 if (quit_on_redirect_) {
198 *defer_redirect = true;
199 base::MessageLoop::current()->PostTask(FROM_HERE,
200 base::MessageLoop::QuitClosure());
201 } else if (cancel_in_rr_) {
202 request->Cancel();
206 void TestDelegate::OnBeforeNetworkStart(URLRequest* request, bool* defer) {
207 received_before_network_start_count_++;
208 if (quit_on_before_network_start_) {
209 *defer = true;
210 base::MessageLoop::current()->PostTask(FROM_HERE,
211 base::MessageLoop::QuitClosure());
215 void TestDelegate::OnAuthRequired(URLRequest* request,
216 AuthChallengeInfo* auth_info) {
217 auth_required_ = true;
218 if (!credentials_.Empty()) {
219 request->SetAuth(credentials_);
220 } else {
221 request->CancelAuth();
225 void TestDelegate::OnSSLCertificateError(URLRequest* request,
226 const SSLInfo& ssl_info,
227 bool fatal) {
228 // The caller can control whether it needs all SSL requests to go through,
229 // independent of any possible errors, or whether it wants SSL errors to
230 // cancel the request.
231 have_certificate_errors_ = true;
232 certificate_errors_are_fatal_ = fatal;
233 if (allow_certificate_errors_)
234 request->ContinueDespiteLastError();
235 else
236 request->Cancel();
239 void TestDelegate::OnResponseStarted(URLRequest* request) {
240 // It doesn't make sense for the request to have IO pending at this point.
241 DCHECK(!request->status().is_io_pending());
242 EXPECT_FALSE(request->is_redirecting());
244 have_full_request_headers_ =
245 request->GetFullRequestHeaders(&full_request_headers_);
247 response_started_count_++;
248 if (cancel_in_rs_) {
249 request->Cancel();
250 OnResponseCompleted(request);
251 } else if (!request->status().is_success()) {
252 DCHECK(request->status().status() == URLRequestStatus::FAILED ||
253 request->status().status() == URLRequestStatus::CANCELED);
254 request_failed_ = true;
255 OnResponseCompleted(request);
256 } else {
257 // Initiate the first read.
258 int bytes_read = 0;
259 if (request->Read(buf_.get(), kBufferSize, &bytes_read))
260 OnReadCompleted(request, bytes_read);
261 else if (!request->status().is_io_pending())
262 OnResponseCompleted(request);
266 void TestDelegate::OnReadCompleted(URLRequest* request, int bytes_read) {
267 // It doesn't make sense for the request to have IO pending at this point.
268 DCHECK(!request->status().is_io_pending());
270 if (response_started_count_ == 0)
271 received_data_before_response_ = true;
273 if (cancel_in_rd_)
274 request->Cancel();
276 if (bytes_read >= 0) {
277 // There is data to read.
278 received_bytes_count_ += bytes_read;
280 // consume the data
281 data_received_.append(buf_->data(), bytes_read);
284 // If it was not end of stream, request to read more.
285 if (request->status().is_success() && bytes_read > 0) {
286 bytes_read = 0;
287 while (request->Read(buf_.get(), kBufferSize, &bytes_read)) {
288 if (bytes_read > 0) {
289 data_received_.append(buf_->data(), bytes_read);
290 received_bytes_count_ += bytes_read;
291 } else {
292 break;
296 if (!request->status().is_io_pending())
297 OnResponseCompleted(request);
298 else if (cancel_in_rd_pending_)
299 request->Cancel();
302 void TestDelegate::OnResponseCompleted(URLRequest* request) {
303 if (quit_on_complete_)
304 base::MessageLoop::current()->PostTask(FROM_HERE,
305 base::MessageLoop::QuitClosure());
308 TestNetworkDelegate::TestNetworkDelegate()
309 : last_error_(0),
310 error_count_(0),
311 created_requests_(0),
312 destroyed_requests_(0),
313 completed_requests_(0),
314 canceled_requests_(0),
315 cookie_options_bit_mask_(0),
316 blocked_get_cookies_count_(0),
317 blocked_set_cookie_count_(0),
318 set_cookie_count_(0),
319 observed_before_proxy_headers_sent_callbacks_(0),
320 has_load_timing_info_before_redirect_(false),
321 has_load_timing_info_before_auth_(false),
322 can_access_files_(true),
323 can_throttle_requests_(true),
324 cancel_request_with_policy_violating_referrer_(false) {
327 TestNetworkDelegate::~TestNetworkDelegate() {
328 for (std::map<int, int>::iterator i = next_states_.begin();
329 i != next_states_.end(); ++i) {
330 event_order_[i->first] += "~TestNetworkDelegate\n";
331 EXPECT_TRUE(i->second & kStageDestruction) << event_order_[i->first];
335 bool TestNetworkDelegate::GetLoadTimingInfoBeforeRedirect(
336 LoadTimingInfo* load_timing_info_before_redirect) const {
337 *load_timing_info_before_redirect = load_timing_info_before_redirect_;
338 return has_load_timing_info_before_redirect_;
341 bool TestNetworkDelegate::GetLoadTimingInfoBeforeAuth(
342 LoadTimingInfo* load_timing_info_before_auth) const {
343 *load_timing_info_before_auth = load_timing_info_before_auth_;
344 return has_load_timing_info_before_auth_;
347 void TestNetworkDelegate::InitRequestStatesIfNew(int request_id) {
348 if (next_states_.find(request_id) == next_states_.end()) {
349 // TODO(davidben): Although the URLRequest documentation does not allow
350 // calling Cancel() before Start(), the ResourceLoader does so. URLRequest's
351 // destructor also calls Cancel. Either officially support this or fix the
352 // ResourceLoader code.
353 next_states_[request_id] = kStageBeforeURLRequest | kStageCompletedError;
354 event_order_[request_id] = "";
358 int TestNetworkDelegate::OnBeforeURLRequest(
359 URLRequest* request,
360 const CompletionCallback& callback,
361 GURL* new_url) {
362 int req_id = request->identifier();
363 InitRequestStatesIfNew(req_id);
364 event_order_[req_id] += "OnBeforeURLRequest\n";
365 EXPECT_TRUE(next_states_[req_id] & kStageBeforeURLRequest) <<
366 event_order_[req_id];
367 next_states_[req_id] =
368 kStageBeforeSendHeaders |
369 kStageResponseStarted | // data: URLs do not trigger sending headers
370 kStageBeforeRedirect | // a delegate can trigger a redirection
371 kStageCompletedError | // request canceled by delegate
372 kStageAuthRequired; // Auth can come next for FTP requests
373 created_requests_++;
374 return OK;
377 int TestNetworkDelegate::OnBeforeSendHeaders(
378 URLRequest* request,
379 const CompletionCallback& callback,
380 HttpRequestHeaders* headers) {
381 int req_id = request->identifier();
382 InitRequestStatesIfNew(req_id);
383 event_order_[req_id] += "OnBeforeSendHeaders\n";
384 EXPECT_TRUE(next_states_[req_id] & kStageBeforeSendHeaders) <<
385 event_order_[req_id];
386 next_states_[req_id] =
387 kStageSendHeaders |
388 kStageCompletedError; // request canceled by delegate
390 return OK;
393 void TestNetworkDelegate::OnBeforeSendProxyHeaders(
394 net::URLRequest* request,
395 const net::ProxyInfo& proxy_info,
396 net::HttpRequestHeaders* headers) {
397 ++observed_before_proxy_headers_sent_callbacks_;
398 last_observed_proxy_ = proxy_info.proxy_server().host_port_pair();
401 void TestNetworkDelegate::OnSendHeaders(
402 URLRequest* request,
403 const HttpRequestHeaders& headers) {
404 int req_id = request->identifier();
405 InitRequestStatesIfNew(req_id);
406 event_order_[req_id] += "OnSendHeaders\n";
407 EXPECT_TRUE(next_states_[req_id] & kStageSendHeaders) <<
408 event_order_[req_id];
409 next_states_[req_id] =
410 kStageHeadersReceived |
411 kStageCompletedError;
414 int TestNetworkDelegate::OnHeadersReceived(
415 URLRequest* request,
416 const CompletionCallback& callback,
417 const HttpResponseHeaders* original_response_headers,
418 scoped_refptr<HttpResponseHeaders>* override_response_headers,
419 GURL* allowed_unsafe_redirect_url) {
420 int req_id = request->identifier();
421 event_order_[req_id] += "OnHeadersReceived\n";
422 InitRequestStatesIfNew(req_id);
423 EXPECT_TRUE(next_states_[req_id] & kStageHeadersReceived) <<
424 event_order_[req_id];
425 next_states_[req_id] =
426 kStageBeforeRedirect |
427 kStageResponseStarted |
428 kStageAuthRequired |
429 kStageCompletedError; // e.g. proxy resolution problem
431 // Basic authentication sends a second request from the URLRequestHttpJob
432 // layer before the URLRequest reports that a response has started.
433 next_states_[req_id] |= kStageBeforeSendHeaders;
435 if (!redirect_on_headers_received_url_.is_empty()) {
436 *override_response_headers =
437 new net::HttpResponseHeaders(original_response_headers->raw_headers());
438 (*override_response_headers)->ReplaceStatusLine("HTTP/1.1 302 Found");
439 (*override_response_headers)->RemoveHeader("Location");
440 (*override_response_headers)->AddHeader(
441 "Location: " + redirect_on_headers_received_url_.spec());
443 redirect_on_headers_received_url_ = GURL();
445 if (!allowed_unsafe_redirect_url_.is_empty())
446 *allowed_unsafe_redirect_url = allowed_unsafe_redirect_url_;
449 return OK;
452 void TestNetworkDelegate::OnBeforeRedirect(URLRequest* request,
453 const GURL& new_location) {
454 load_timing_info_before_redirect_ = LoadTimingInfo();
455 request->GetLoadTimingInfo(&load_timing_info_before_redirect_);
456 has_load_timing_info_before_redirect_ = true;
457 EXPECT_FALSE(load_timing_info_before_redirect_.request_start_time.is_null());
458 EXPECT_FALSE(load_timing_info_before_redirect_.request_start.is_null());
460 int req_id = request->identifier();
461 InitRequestStatesIfNew(req_id);
462 event_order_[req_id] += "OnBeforeRedirect\n";
463 EXPECT_TRUE(next_states_[req_id] & kStageBeforeRedirect) <<
464 event_order_[req_id];
465 next_states_[req_id] =
466 kStageBeforeURLRequest | // HTTP redirects trigger this.
467 kStageBeforeSendHeaders | // Redirects from the network delegate do not
468 // trigger onBeforeURLRequest.
469 kStageCompletedError;
471 // A redirect can lead to a file or a data URL. In this case, we do not send
472 // headers.
473 next_states_[req_id] |= kStageResponseStarted;
476 void TestNetworkDelegate::OnResponseStarted(URLRequest* request) {
477 LoadTimingInfo load_timing_info;
478 request->GetLoadTimingInfo(&load_timing_info);
479 EXPECT_FALSE(load_timing_info.request_start_time.is_null());
480 EXPECT_FALSE(load_timing_info.request_start.is_null());
482 int req_id = request->identifier();
483 InitRequestStatesIfNew(req_id);
484 event_order_[req_id] += "OnResponseStarted\n";
485 EXPECT_TRUE(next_states_[req_id] & kStageResponseStarted) <<
486 event_order_[req_id];
487 next_states_[req_id] = kStageCompletedSuccess | kStageCompletedError;
488 if (request->status().status() == URLRequestStatus::FAILED) {
489 error_count_++;
490 last_error_ = request->status().error();
494 void TestNetworkDelegate::OnRawBytesRead(const URLRequest& request,
495 int bytes_read) {
498 void TestNetworkDelegate::OnCompleted(URLRequest* request, bool started) {
499 int req_id = request->identifier();
500 InitRequestStatesIfNew(req_id);
501 event_order_[req_id] += "OnCompleted\n";
502 // Expect "Success -> (next_states_ & kStageCompletedSuccess)"
503 // is logically identical to
504 // Expect "!(Success) || (next_states_ & kStageCompletedSuccess)"
505 EXPECT_TRUE(!request->status().is_success() ||
506 (next_states_[req_id] & kStageCompletedSuccess)) <<
507 event_order_[req_id];
508 EXPECT_TRUE(request->status().is_success() ||
509 (next_states_[req_id] & kStageCompletedError)) <<
510 event_order_[req_id];
511 next_states_[req_id] = kStageURLRequestDestroyed;
512 completed_requests_++;
513 if (request->status().status() == URLRequestStatus::FAILED) {
514 error_count_++;
515 last_error_ = request->status().error();
516 } else if (request->status().status() == URLRequestStatus::CANCELED) {
517 canceled_requests_++;
518 } else {
519 DCHECK_EQ(URLRequestStatus::SUCCESS, request->status().status());
523 void TestNetworkDelegate::OnURLRequestDestroyed(URLRequest* request) {
524 int req_id = request->identifier();
525 InitRequestStatesIfNew(req_id);
526 event_order_[req_id] += "OnURLRequestDestroyed\n";
527 EXPECT_TRUE(next_states_[req_id] & kStageURLRequestDestroyed) <<
528 event_order_[req_id];
529 next_states_[req_id] = kStageDestruction;
530 destroyed_requests_++;
533 void TestNetworkDelegate::OnPACScriptError(int line_number,
534 const base::string16& error) {
537 NetworkDelegate::AuthRequiredResponse TestNetworkDelegate::OnAuthRequired(
538 URLRequest* request,
539 const AuthChallengeInfo& auth_info,
540 const AuthCallback& callback,
541 AuthCredentials* credentials) {
542 load_timing_info_before_auth_ = LoadTimingInfo();
543 request->GetLoadTimingInfo(&load_timing_info_before_auth_);
544 has_load_timing_info_before_auth_ = true;
545 EXPECT_FALSE(load_timing_info_before_auth_.request_start_time.is_null());
546 EXPECT_FALSE(load_timing_info_before_auth_.request_start.is_null());
548 int req_id = request->identifier();
549 InitRequestStatesIfNew(req_id);
550 event_order_[req_id] += "OnAuthRequired\n";
551 EXPECT_TRUE(next_states_[req_id] & kStageAuthRequired) <<
552 event_order_[req_id];
553 next_states_[req_id] = kStageBeforeSendHeaders |
554 kStageAuthRequired | // For example, proxy auth followed by server auth.
555 kStageHeadersReceived | // Request canceled by delegate simulates empty
556 // response.
557 kStageResponseStarted | // data: URLs do not trigger sending headers
558 kStageBeforeRedirect | // a delegate can trigger a redirection
559 kStageCompletedError; // request cancelled before callback
560 return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
563 bool TestNetworkDelegate::OnCanGetCookies(const URLRequest& request,
564 const CookieList& cookie_list) {
565 bool allow = true;
566 if (cookie_options_bit_mask_ & NO_GET_COOKIES)
567 allow = false;
569 if (!allow) {
570 blocked_get_cookies_count_++;
573 return allow;
576 bool TestNetworkDelegate::OnCanSetCookie(const URLRequest& request,
577 const std::string& cookie_line,
578 CookieOptions* options) {
579 bool allow = true;
580 if (cookie_options_bit_mask_ & NO_SET_COOKIE)
581 allow = false;
583 if (!allow) {
584 blocked_set_cookie_count_++;
585 } else {
586 set_cookie_count_++;
589 return allow;
592 bool TestNetworkDelegate::OnCanAccessFile(const URLRequest& request,
593 const base::FilePath& path) const {
594 return can_access_files_;
597 bool TestNetworkDelegate::OnCanThrottleRequest(
598 const URLRequest& request) const {
599 return can_throttle_requests_;
602 int TestNetworkDelegate::OnBeforeSocketStreamConnect(
603 SocketStream* socket,
604 const CompletionCallback& callback) {
605 return OK;
608 bool TestNetworkDelegate::OnCancelURLRequestWithPolicyViolatingReferrerHeader(
609 const URLRequest& request,
610 const GURL& target_url,
611 const GURL& referrer_url) const {
612 return cancel_request_with_policy_violating_referrer_;
615 // static
616 std::string ScopedCustomUrlRequestTestHttpHost::value_("127.0.0.1");
618 ScopedCustomUrlRequestTestHttpHost::ScopedCustomUrlRequestTestHttpHost(
619 const std::string& new_value)
620 : old_value_(value_),
621 new_value_(new_value) {
622 value_ = new_value_;
625 ScopedCustomUrlRequestTestHttpHost::~ScopedCustomUrlRequestTestHttpHost() {
626 DCHECK_EQ(value_, new_value_);
627 value_ = old_value_;
630 // static
631 const std::string& ScopedCustomUrlRequestTestHttpHost::value() {
632 return value_;
635 TestJobInterceptor::TestJobInterceptor() : main_intercept_job_(NULL) {
638 URLRequestJob* TestJobInterceptor::MaybeCreateJob(
639 URLRequest* request,
640 NetworkDelegate* network_delegate) const {
641 URLRequestJob* job = main_intercept_job_;
642 main_intercept_job_ = NULL;
643 return job;
646 void TestJobInterceptor::set_main_intercept_job(URLRequestJob* job) {
647 main_intercept_job_ = job;
650 } // namespace net