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

Unified Diff: net/url_request/url_request_test_util.cc

Issue 9368031: Expose a static configuration value for the host to use for URLRequestTestHTTP tests. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Respond to nits, fix compiler error. Created 8 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/url_request/url_request_test_util.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/url_request/url_request_test_util.cc
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index c296745969d1bb288c3cde713ac2bf6c9ca97439..2f3dd6e14c9e50527f475148b4bc23ea585ddf03 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -1,506 +1,526 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/url_request/url_request_test_util.h"
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/message_loop.h"
-#include "base/threading/thread.h"
-#include "net/base/default_origin_bound_cert_store.h"
-#include "net/base/host_port_pair.h"
-#include "net/base/origin_bound_cert_service.h"
-#include "net/http/http_network_session.h"
-#include "net/http/http_server_properties_impl.h"
-#include "net/url_request/url_request_job_factory.h"
-
-namespace {
-
-// These constants put the net::NetworkDelegate events of TestNetworkDelegate
-// into an order. They are used in conjunction with
-// |TestNetworkDelegate::next_states_| to check that we do not send
-// events in the wrong order.
-const int kStageBeforeURLRequest = 1 << 0;
-const int kStageBeforeSendHeaders = 1 << 1;
-const int kStageSendHeaders = 1 << 2;
-const int kStageHeadersReceived = 1 << 3;
-const int kStageAuthRequired = 1 << 4;
-const int kStageBeforeRedirect = 1 << 5;
-const int kStageResponseStarted = 1 << 6;
-const int kStageCompletedSuccess = 1 << 7;
-const int kStageCompletedError = 1 << 8;
-const int kStageURLRequestDestroyed = 1 << 9;
-const int kStageDestruction = 1 << 10;
-
-} // namespace
-
-TestURLRequestContext::TestURLRequestContext()
- : initialized_(false),
- ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
- context_storage_.set_host_resolver(
- net::CreateSystemHostResolver(net::HostResolver::kDefaultParallelism,
- net::HostResolver::kDefaultRetryAttempts,
- NULL));
- SetProxyDirect();
- Init();
-}
-
-TestURLRequestContext::TestURLRequestContext(bool delay_initialization)
- : initialized_(false),
- ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
- context_storage_.set_host_resolver(
- net::CreateSystemHostResolver(net::HostResolver::kDefaultParallelism,
- net::HostResolver::kDefaultRetryAttempts,
- NULL));
- SetProxyDirect();
- if (!delay_initialization)
- Init();
-}
-
-TestURLRequestContext::TestURLRequestContext(const std::string& proxy)
- : initialized_(false),
- ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
- context_storage_.set_host_resolver(
- net::CreateSystemHostResolver(net::HostResolver::kDefaultParallelism,
- net::HostResolver::kDefaultRetryAttempts,
- NULL));
- SetProxyFromString(proxy);
- Init();
-}
-
-TestURLRequestContext::TestURLRequestContext(const char* proxy)
- : initialized_(false),
- ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
- context_storage_.set_host_resolver(
- net::CreateSystemHostResolver(net::HostResolver::kDefaultParallelism,
- net::HostResolver::kDefaultRetryAttempts,
- NULL));
- SetProxyFromString(proxy);
- Init();
-}
-
-TestURLRequestContext::TestURLRequestContext(const std::string& proxy,
- net::HostResolver* host_resolver)
- : initialized_(false),
- ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
- context_storage_.set_host_resolver(host_resolver);
- SetProxyFromString(proxy);
- Init();
-}
-
-void TestURLRequestContext::SetProxyFromString(const std::string& proxy) {
- DCHECK(!initialized_);
- net::ProxyConfig proxy_config;
- proxy_config.proxy_rules().ParseFromString(proxy);
- context_storage_.set_proxy_service(
- net::ProxyService::CreateFixed(proxy_config));
-}
-
-void TestURLRequestContext::SetProxyDirect() {
- DCHECK(!initialized_);
- context_storage_.set_proxy_service(net::ProxyService::CreateDirect());
-}
-
-TestURLRequestContext::~TestURLRequestContext() {
- DCHECK(initialized_);
-}
-
-void TestURLRequestContext::Init() {
- DCHECK(!initialized_);
- initialized_ = true;
- if (!cert_verifier())
- context_storage_.set_cert_verifier(new net::CertVerifier);
- if (!ftp_transaction_factory()) {
- context_storage_.set_ftp_transaction_factory(
- new net::FtpNetworkLayer(host_resolver()));
- }
- if (!ssl_config_service())
- context_storage_.set_ssl_config_service(new net::SSLConfigServiceDefaults);
- if (!http_auth_handler_factory()) {
- context_storage_.set_http_auth_handler_factory(
- net::HttpAuthHandlerFactory::CreateDefault(host_resolver()));
- }
- if (!http_server_properties()) {
- context_storage_.set_http_server_properties(
- new net::HttpServerPropertiesImpl);
- }
- net::HttpNetworkSession::Params params;
- params.host_resolver = host_resolver();
- params.cert_verifier = cert_verifier();
- params.proxy_service = proxy_service();
- params.ssl_config_service = ssl_config_service();
- params.http_auth_handler_factory = http_auth_handler_factory();
- params.network_delegate = network_delegate();
- params.http_server_properties = http_server_properties();
-
- if (!http_transaction_factory()) {
- context_storage_.set_http_transaction_factory(new net::HttpCache(
- new net::HttpNetworkSession(params),
- net::HttpCache::DefaultBackend::InMemory(0)));
- }
- // In-memory cookie store.
- if (!cookie_store())
- context_storage_.set_cookie_store(new net::CookieMonster(NULL, NULL));
- // In-memory origin bound cert service.
- if (!origin_bound_cert_service()) {
- context_storage_.set_origin_bound_cert_service(
- new net::OriginBoundCertService(
- new net::DefaultOriginBoundCertStore(NULL)));
- }
- if (accept_language().empty())
- set_accept_language("en-us,fr");
- if (accept_charset().empty())
- set_accept_charset("iso-8859-1,*,utf-8");
- if (!job_factory())
- context_storage_.set_job_factory(new net::URLRequestJobFactory);
-}
-
-
-TestURLRequest::TestURLRequest(const GURL& url, Delegate* delegate)
- : net::URLRequest(url, delegate) {
- set_context(new TestURLRequestContext());
-}
-
-TestURLRequest::~TestURLRequest() {}
-
-TestDelegate::TestDelegate()
- : cancel_in_rr_(false),
- cancel_in_rs_(false),
- cancel_in_rd_(false),
- cancel_in_rd_pending_(false),
- quit_on_complete_(true),
- quit_on_redirect_(false),
- allow_certificate_errors_(false),
- cookie_options_bit_mask_(0),
- response_started_count_(0),
- received_bytes_count_(0),
- received_redirect_count_(0),
- blocked_get_cookies_count_(0),
- blocked_set_cookie_count_(0),
- set_cookie_count_(0),
- received_data_before_response_(false),
- request_failed_(false),
- have_certificate_errors_(false),
- certificate_errors_are_fatal_(false),
- auth_required_(false),
- buf_(new net::IOBuffer(kBufferSize)) {
-}
-
-TestDelegate::~TestDelegate() {}
-
-void TestDelegate::OnReceivedRedirect(net::URLRequest* request,
- const GURL& new_url,
- bool* defer_redirect) {
- received_redirect_count_++;
- if (quit_on_redirect_) {
- *defer_redirect = true;
- MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
- } else if (cancel_in_rr_) {
- request->Cancel();
- }
-}
-
-void TestDelegate::OnAuthRequired(net::URLRequest* request,
- net::AuthChallengeInfo* auth_info) {
- auth_required_ = true;
- if (!credentials_.Empty()) {
- request->SetAuth(credentials_);
- } else {
- request->CancelAuth();
- }
-}
-
-void TestDelegate::OnSSLCertificateError(net::URLRequest* request,
- const net::SSLInfo& ssl_info,
- bool fatal) {
- // The caller can control whether it needs all SSL requests to go through,
- // independent of any possible errors, or whether it wants SSL errors to
- // cancel the request.
- have_certificate_errors_ = true;
- certificate_errors_are_fatal_ = fatal;
- if (allow_certificate_errors_)
- request->ContinueDespiteLastError();
- else
- request->Cancel();
-}
-
-bool TestDelegate::CanGetCookies(const net::URLRequest* request,
- const net::CookieList& cookie_list) const {
- bool allow = true;
- if (cookie_options_bit_mask_ & NO_GET_COOKIES)
- allow = false;
-
- if (!allow) {
- blocked_get_cookies_count_++;
- }
-
- return allow;
-}
-
-bool TestDelegate::CanSetCookie(const net::URLRequest* request,
- const std::string& cookie_line,
- net::CookieOptions* options) const {
- bool allow = true;
- if (cookie_options_bit_mask_ & NO_SET_COOKIE)
- allow = false;
-
- if (cookie_options_bit_mask_ & FORCE_SESSION)
- options->set_force_session();
-
-
- if (!allow) {
- blocked_set_cookie_count_++;
- } else {
- set_cookie_count_++;
- }
-
- return allow;
-}
-
-void TestDelegate::OnResponseStarted(net::URLRequest* request) {
- // It doesn't make sense for the request to have IO pending at this point.
- DCHECK(!request->status().is_io_pending());
-
- response_started_count_++;
- if (cancel_in_rs_) {
- request->Cancel();
- OnResponseCompleted(request);
- } else if (!request->status().is_success()) {
- DCHECK(request->status().status() == net::URLRequestStatus::FAILED ||
- request->status().status() == net::URLRequestStatus::CANCELED);
- request_failed_ = true;
- OnResponseCompleted(request);
- } else {
- // Initiate the first read.
- int bytes_read = 0;
- if (request->Read(buf_, kBufferSize, &bytes_read))
- OnReadCompleted(request, bytes_read);
- else if (!request->status().is_io_pending())
- OnResponseCompleted(request);
- }
-}
-
-void TestDelegate::OnReadCompleted(net::URLRequest* request, int bytes_read) {
- // It doesn't make sense for the request to have IO pending at this point.
- DCHECK(!request->status().is_io_pending());
-
- if (response_started_count_ == 0)
- received_data_before_response_ = true;
-
- if (cancel_in_rd_)
- request->Cancel();
-
- if (bytes_read >= 0) {
- // There is data to read.
- received_bytes_count_ += bytes_read;
-
- // consume the data
- data_received_.append(buf_->data(), bytes_read);
- }
-
- // If it was not end of stream, request to read more.
- if (request->status().is_success() && bytes_read > 0) {
- bytes_read = 0;
- while (request->Read(buf_, kBufferSize, &bytes_read)) {
- if (bytes_read > 0) {
- data_received_.append(buf_->data(), bytes_read);
- received_bytes_count_ += bytes_read;
- } else {
- break;
- }
- }
- }
- if (!request->status().is_io_pending())
- OnResponseCompleted(request);
- else if (cancel_in_rd_pending_)
- request->Cancel();
-}
-
-void TestDelegate::OnResponseCompleted(net::URLRequest* request) {
- if (quit_on_complete_)
- MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
-}
-
-TestNetworkDelegate::TestNetworkDelegate()
- : last_error_(0),
- error_count_(0),
- created_requests_(0),
- destroyed_requests_(0),
- completed_requests_(0) {
-}
-
-TestNetworkDelegate::~TestNetworkDelegate() {
- for (std::map<int, int>::iterator i = next_states_.begin();
- i != next_states_.end(); ++i) {
- event_order_[i->first] += "~TestNetworkDelegate\n";
- EXPECT_TRUE(i->second & kStageDestruction) << event_order_[i->first];
- }
-}
-
-void TestNetworkDelegate::InitRequestStatesIfNew(int request_id) {
- if (next_states_.find(request_id) == next_states_.end()) {
- next_states_[request_id] = kStageBeforeURLRequest;
- event_order_[request_id] = "";
- }
-}
-
-int TestNetworkDelegate::OnBeforeURLRequest(
- net::URLRequest* request,
- const net::CompletionCallback& callback,
- GURL* new_url ) {
- int req_id = request->identifier();
- InitRequestStatesIfNew(req_id);
- event_order_[req_id] += "OnBeforeURLRequest\n";
- EXPECT_TRUE(next_states_[req_id] & kStageBeforeURLRequest) <<
- event_order_[req_id];
- next_states_[req_id] =
- kStageBeforeSendHeaders |
- kStageResponseStarted | // data: URLs do not trigger sending headers
- kStageBeforeRedirect | // a delegate can trigger a redirection
- kStageCompletedError | // request canceled by delegate
- kStageAuthRequired; // Auth can come next for FTP requests
- created_requests_++;
- return net::OK;
-}
-
-int TestNetworkDelegate::OnBeforeSendHeaders(
- net::URLRequest* request,
- const net::CompletionCallback& callback,
- net::HttpRequestHeaders* headers) {
- int req_id = request->identifier();
- InitRequestStatesIfNew(req_id);
- event_order_[req_id] += "OnBeforeSendHeaders\n";
- EXPECT_TRUE(next_states_[req_id] & kStageBeforeSendHeaders) <<
- event_order_[req_id];
- next_states_[req_id] =
- kStageSendHeaders |
- kStageCompletedError; // request canceled by delegate
-
- return net::OK;
-}
-
-void TestNetworkDelegate::OnSendHeaders(
- net::URLRequest* request,
- const net::HttpRequestHeaders& headers) {
- int req_id = request->identifier();
- InitRequestStatesIfNew(req_id);
- event_order_[req_id] += "OnSendHeaders\n";
- EXPECT_TRUE(next_states_[req_id] & kStageSendHeaders) <<
- event_order_[req_id];
- next_states_[req_id] =
- kStageHeadersReceived |
- kStageCompletedError;
-}
-
-int TestNetworkDelegate::OnHeadersReceived(
- net::URLRequest* request,
- const net::CompletionCallback& callback,
- net::HttpResponseHeaders* original_response_headers,
- scoped_refptr<net::HttpResponseHeaders>* override_response_headers) {
- int req_id = request->identifier();
- event_order_[req_id] += "OnHeadersReceived\n";
- InitRequestStatesIfNew(req_id);
- EXPECT_TRUE(next_states_[req_id] & kStageHeadersReceived) <<
- event_order_[req_id];
- next_states_[req_id] =
- kStageBeforeRedirect |
- kStageResponseStarted |
- kStageAuthRequired |
- kStageCompletedError; // e.g. proxy resolution problem
-
- // Basic authentication sends a second request from the URLRequestHttpJob
- // layer before the URLRequest reports that a response has started.
- next_states_[req_id] |= kStageBeforeSendHeaders;
-
- return net::OK;
-}
-
-void TestNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
- const GURL& new_location) {
- int req_id = request->identifier();
- InitRequestStatesIfNew(req_id);
- event_order_[req_id] += "OnBeforeRedirect\n";
- EXPECT_TRUE(next_states_[req_id] & kStageBeforeRedirect) <<
- event_order_[req_id];
- next_states_[req_id] =
- kStageBeforeURLRequest | // HTTP redirects trigger this.
- kStageBeforeSendHeaders | // Redirects from the network delegate do not
- // trigger onBeforeURLRequest.
- kStageCompletedError;
-
- // A redirect can lead to a file or a data URL. In this case, we do not send
- // headers.
- next_states_[req_id] |= kStageResponseStarted;
-}
-
-void TestNetworkDelegate::OnResponseStarted(net::URLRequest* request) {
- int req_id = request->identifier();
- InitRequestStatesIfNew(req_id);
- event_order_[req_id] += "OnResponseStarted\n";
- EXPECT_TRUE(next_states_[req_id] & kStageResponseStarted) <<
- event_order_[req_id];
- next_states_[req_id] = kStageCompletedSuccess | kStageCompletedError;
- if (request->status().status() == net::URLRequestStatus::FAILED) {
- error_count_++;
- last_error_ = request->status().error();
- }
-}
-
-void TestNetworkDelegate::OnRawBytesRead(const net::URLRequest& request,
- int bytes_read) {
-}
-
-void TestNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) {
- int req_id = request->identifier();
- InitRequestStatesIfNew(req_id);
- event_order_[req_id] += "OnCompleted\n";
- // Expect "Success -> (next_states_ & kStageCompletedSuccess)"
- // is logically identical to
- // Expect "!(Success) || (next_states_ & kStageCompletedSuccess)"
- EXPECT_TRUE(!request->status().is_success() ||
- (next_states_[req_id] & kStageCompletedSuccess)) <<
- event_order_[req_id];
- EXPECT_TRUE(request->status().is_success() ||
- (next_states_[req_id] & kStageCompletedError)) <<
- event_order_[req_id];
- next_states_[req_id] = kStageURLRequestDestroyed;
- completed_requests_++;
- if (request->status().status() == net::URLRequestStatus::FAILED) {
- error_count_++;
- last_error_ = request->status().error();
- }
-}
-
-void TestNetworkDelegate::OnURLRequestDestroyed(
- net::URLRequest* request) {
- int req_id = request->identifier();
- InitRequestStatesIfNew(req_id);
- event_order_[req_id] += "OnURLRequestDestroyed\n";
- EXPECT_TRUE(next_states_[req_id] & kStageURLRequestDestroyed) <<
- event_order_[req_id];
- next_states_[req_id] = kStageDestruction;
- destroyed_requests_++;
-}
-
-void TestNetworkDelegate::OnPACScriptError(int line_number,
- const string16& error) {
-}
-
-net::NetworkDelegate::AuthRequiredResponse TestNetworkDelegate::OnAuthRequired(
- net::URLRequest* request,
- const net::AuthChallengeInfo& auth_info,
- const AuthCallback& callback,
- net::AuthCredentials* credentials) {
- int req_id = request->identifier();
- InitRequestStatesIfNew(req_id);
- event_order_[req_id] += "OnAuthRequired\n";
- EXPECT_TRUE(next_states_[req_id] & kStageAuthRequired) <<
- event_order_[req_id];
- next_states_[req_id] = kStageBeforeSendHeaders |
- kStageHeadersReceived | // Request canceled by delegate simulates empty
- // response.
- kStageResponseStarted | // data: URLs do not trigger sending headers
- kStageBeforeRedirect; // a delegate can trigger a redirection
- return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
-}
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/url_request/url_request_test_util.h"
+
+#include "base/compiler_specific.h"
+#include "base/logging.h"
+#include "base/message_loop.h"
+#include "base/threading/thread.h"
+#include "net/base/default_origin_bound_cert_store.h"
+#include "net/base/host_port_pair.h"
+#include "net/base/origin_bound_cert_service.h"
+#include "net/http/http_network_session.h"
+#include "net/http/http_server_properties_impl.h"
+#include "net/url_request/url_request_job_factory.h"
+
+namespace {
+
+// These constants put the net::NetworkDelegate events of TestNetworkDelegate
+// into an order. They are used in conjunction with
+// |TestNetworkDelegate::next_states_| to check that we do not send
+// events in the wrong order.
+const int kStageBeforeURLRequest = 1 << 0;
+const int kStageBeforeSendHeaders = 1 << 1;
+const int kStageSendHeaders = 1 << 2;
+const int kStageHeadersReceived = 1 << 3;
+const int kStageAuthRequired = 1 << 4;
+const int kStageBeforeRedirect = 1 << 5;
+const int kStageResponseStarted = 1 << 6;
+const int kStageCompletedSuccess = 1 << 7;
+const int kStageCompletedError = 1 << 8;
+const int kStageURLRequestDestroyed = 1 << 9;
+const int kStageDestruction = 1 << 10;
+
+} // namespace
+
+TestURLRequestContext::TestURLRequestContext()
+ : initialized_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
+ context_storage_.set_host_resolver(
+ net::CreateSystemHostResolver(net::HostResolver::kDefaultParallelism,
+ net::HostResolver::kDefaultRetryAttempts,
+ NULL));
+ SetProxyDirect();
+ Init();
+}
+
+TestURLRequestContext::TestURLRequestContext(bool delay_initialization)
+ : initialized_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
+ context_storage_.set_host_resolver(
+ net::CreateSystemHostResolver(net::HostResolver::kDefaultParallelism,
+ net::HostResolver::kDefaultRetryAttempts,
+ NULL));
+ SetProxyDirect();
+ if (!delay_initialization)
+ Init();
+}
+
+TestURLRequestContext::TestURLRequestContext(const std::string& proxy)
+ : initialized_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
+ context_storage_.set_host_resolver(
+ net::CreateSystemHostResolver(net::HostResolver::kDefaultParallelism,
+ net::HostResolver::kDefaultRetryAttempts,
+ NULL));
+ SetProxyFromString(proxy);
+ Init();
+}
+
+TestURLRequestContext::TestURLRequestContext(const char* proxy)
+ : initialized_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
+ context_storage_.set_host_resolver(
+ net::CreateSystemHostResolver(net::HostResolver::kDefaultParallelism,
+ net::HostResolver::kDefaultRetryAttempts,
+ NULL));
+ SetProxyFromString(proxy);
+ Init();
+}
+
+TestURLRequestContext::TestURLRequestContext(const std::string& proxy,
+ net::HostResolver* host_resolver)
+ : initialized_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(context_storage_(this)) {
+ context_storage_.set_host_resolver(host_resolver);
+ SetProxyFromString(proxy);
+ Init();
+}
+
+void TestURLRequestContext::SetProxyFromString(const std::string& proxy) {
+ DCHECK(!initialized_);
+ net::ProxyConfig proxy_config;
+ proxy_config.proxy_rules().ParseFromString(proxy);
+ context_storage_.set_proxy_service(
+ net::ProxyService::CreateFixed(proxy_config));
+}
+
+void TestURLRequestContext::SetProxyDirect() {
+ DCHECK(!initialized_);
+ context_storage_.set_proxy_service(net::ProxyService::CreateDirect());
+}
+
+TestURLRequestContext::~TestURLRequestContext() {
+ DCHECK(initialized_);
+}
+
+void TestURLRequestContext::Init() {
+ DCHECK(!initialized_);
+ initialized_ = true;
+ if (!cert_verifier())
+ context_storage_.set_cert_verifier(new net::CertVerifier);
+ if (!ftp_transaction_factory()) {
+ context_storage_.set_ftp_transaction_factory(
+ new net::FtpNetworkLayer(host_resolver()));
+ }
+ if (!ssl_config_service())
+ context_storage_.set_ssl_config_service(new net::SSLConfigServiceDefaults);
+ if (!http_auth_handler_factory()) {
+ context_storage_.set_http_auth_handler_factory(
+ net::HttpAuthHandlerFactory::CreateDefault(host_resolver()));
+ }
+ if (!http_server_properties()) {
+ context_storage_.set_http_server_properties(
+ new net::HttpServerPropertiesImpl);
+ }
+ net::HttpNetworkSession::Params params;
+ params.host_resolver = host_resolver();
+ params.cert_verifier = cert_verifier();
+ params.proxy_service = proxy_service();
+ params.ssl_config_service = ssl_config_service();
+ params.http_auth_handler_factory = http_auth_handler_factory();
+ params.network_delegate = network_delegate();
+ params.http_server_properties = http_server_properties();
+
+ if (!http_transaction_factory()) {
+ context_storage_.set_http_transaction_factory(new net::HttpCache(
+ new net::HttpNetworkSession(params),
+ net::HttpCache::DefaultBackend::InMemory(0)));
+ }
+ // In-memory cookie store.
+ if (!cookie_store())
+ context_storage_.set_cookie_store(new net::CookieMonster(NULL, NULL));
+ // In-memory origin bound cert service.
+ if (!origin_bound_cert_service()) {
+ context_storage_.set_origin_bound_cert_service(
+ new net::OriginBoundCertService(
+ new net::DefaultOriginBoundCertStore(NULL)));
+ }
+ if (accept_language().empty())
+ set_accept_language("en-us,fr");
+ if (accept_charset().empty())
+ set_accept_charset("iso-8859-1,*,utf-8");
+ if (!job_factory())
+ context_storage_.set_job_factory(new net::URLRequestJobFactory);
+}
+
+
+TestURLRequest::TestURLRequest(const GURL& url, Delegate* delegate)
+ : net::URLRequest(url, delegate) {
+ set_context(new TestURLRequestContext());
+}
+
+TestURLRequest::~TestURLRequest() {}
+
+TestDelegate::TestDelegate()
+ : cancel_in_rr_(false),
+ cancel_in_rs_(false),
+ cancel_in_rd_(false),
+ cancel_in_rd_pending_(false),
+ quit_on_complete_(true),
+ quit_on_redirect_(false),
+ allow_certificate_errors_(false),
+ cookie_options_bit_mask_(0),
+ response_started_count_(0),
+ received_bytes_count_(0),
+ received_redirect_count_(0),
+ blocked_get_cookies_count_(0),
+ blocked_set_cookie_count_(0),
+ set_cookie_count_(0),
+ received_data_before_response_(false),
+ request_failed_(false),
+ have_certificate_errors_(false),
+ certificate_errors_are_fatal_(false),
+ auth_required_(false),
+ buf_(new net::IOBuffer(kBufferSize)) {
+}
+
+TestDelegate::~TestDelegate() {}
+
+void TestDelegate::OnReceivedRedirect(net::URLRequest* request,
+ const GURL& new_url,
+ bool* defer_redirect) {
+ received_redirect_count_++;
+ if (quit_on_redirect_) {
+ *defer_redirect = true;
+ MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
+ } else if (cancel_in_rr_) {
+ request->Cancel();
+ }
+}
+
+void TestDelegate::OnAuthRequired(net::URLRequest* request,
+ net::AuthChallengeInfo* auth_info) {
+ auth_required_ = true;
+ if (!credentials_.Empty()) {
+ request->SetAuth(credentials_);
+ } else {
+ request->CancelAuth();
+ }
+}
+
+void TestDelegate::OnSSLCertificateError(net::URLRequest* request,
+ const net::SSLInfo& ssl_info,
+ bool fatal) {
+ // The caller can control whether it needs all SSL requests to go through,
+ // independent of any possible errors, or whether it wants SSL errors to
+ // cancel the request.
+ have_certificate_errors_ = true;
+ certificate_errors_are_fatal_ = fatal;
+ if (allow_certificate_errors_)
+ request->ContinueDespiteLastError();
+ else
+ request->Cancel();
+}
+
+bool TestDelegate::CanGetCookies(const net::URLRequest* request,
+ const net::CookieList& cookie_list) const {
+ bool allow = true;
+ if (cookie_options_bit_mask_ & NO_GET_COOKIES)
+ allow = false;
+
+ if (!allow) {
+ blocked_get_cookies_count_++;
+ }
+
+ return allow;
+}
+
+bool TestDelegate::CanSetCookie(const net::URLRequest* request,
+ const std::string& cookie_line,
+ net::CookieOptions* options) const {
+ bool allow = true;
+ if (cookie_options_bit_mask_ & NO_SET_COOKIE)
+ allow = false;
+
+ if (cookie_options_bit_mask_ & FORCE_SESSION)
+ options->set_force_session();
+
+
+ if (!allow) {
+ blocked_set_cookie_count_++;
+ } else {
+ set_cookie_count_++;
+ }
+
+ return allow;
+}
+
+void TestDelegate::OnResponseStarted(net::URLRequest* request) {
+ // It doesn't make sense for the request to have IO pending at this point.
+ DCHECK(!request->status().is_io_pending());
+
+ response_started_count_++;
+ if (cancel_in_rs_) {
+ request->Cancel();
+ OnResponseCompleted(request);
+ } else if (!request->status().is_success()) {
+ DCHECK(request->status().status() == net::URLRequestStatus::FAILED ||
+ request->status().status() == net::URLRequestStatus::CANCELED);
+ request_failed_ = true;
+ OnResponseCompleted(request);
+ } else {
+ // Initiate the first read.
+ int bytes_read = 0;
+ if (request->Read(buf_, kBufferSize, &bytes_read))
+ OnReadCompleted(request, bytes_read);
+ else if (!request->status().is_io_pending())
+ OnResponseCompleted(request);
+ }
+}
+
+void TestDelegate::OnReadCompleted(net::URLRequest* request, int bytes_read) {
+ // It doesn't make sense for the request to have IO pending at this point.
+ DCHECK(!request->status().is_io_pending());
+
+ if (response_started_count_ == 0)
+ received_data_before_response_ = true;
+
+ if (cancel_in_rd_)
+ request->Cancel();
+
+ if (bytes_read >= 0) {
+ // There is data to read.
+ received_bytes_count_ += bytes_read;
+
+ // consume the data
+ data_received_.append(buf_->data(), bytes_read);
+ }
+
+ // If it was not end of stream, request to read more.
+ if (request->status().is_success() && bytes_read > 0) {
+ bytes_read = 0;
+ while (request->Read(buf_, kBufferSize, &bytes_read)) {
+ if (bytes_read > 0) {
+ data_received_.append(buf_->data(), bytes_read);
+ received_bytes_count_ += bytes_read;
+ } else {
+ break;
+ }
+ }
+ }
+ if (!request->status().is_io_pending())
+ OnResponseCompleted(request);
+ else if (cancel_in_rd_pending_)
+ request->Cancel();
+}
+
+void TestDelegate::OnResponseCompleted(net::URLRequest* request) {
+ if (quit_on_complete_)
+ MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
+}
+
+TestNetworkDelegate::TestNetworkDelegate()
+ : last_error_(0),
+ error_count_(0),
+ created_requests_(0),
+ destroyed_requests_(0),
+ completed_requests_(0) {
+}
+
+TestNetworkDelegate::~TestNetworkDelegate() {
+ for (std::map<int, int>::iterator i = next_states_.begin();
+ i != next_states_.end(); ++i) {
+ event_order_[i->first] += "~TestNetworkDelegate\n";
+ EXPECT_TRUE(i->second & kStageDestruction) << event_order_[i->first];
+ }
+}
+
+void TestNetworkDelegate::InitRequestStatesIfNew(int request_id) {
+ if (next_states_.find(request_id) == next_states_.end()) {
+ next_states_[request_id] = kStageBeforeURLRequest;
+ event_order_[request_id] = "";
+ }
+}
+
+int TestNetworkDelegate::OnBeforeURLRequest(
+ net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ GURL* new_url ) {
+ int req_id = request->identifier();
+ InitRequestStatesIfNew(req_id);
+ event_order_[req_id] += "OnBeforeURLRequest\n";
+ EXPECT_TRUE(next_states_[req_id] & kStageBeforeURLRequest) <<
+ event_order_[req_id];
+ next_states_[req_id] =
+ kStageBeforeSendHeaders |
+ kStageResponseStarted | // data: URLs do not trigger sending headers
+ kStageBeforeRedirect | // a delegate can trigger a redirection
+ kStageCompletedError | // request canceled by delegate
+ kStageAuthRequired; // Auth can come next for FTP requests
+ created_requests_++;
+ return net::OK;
+}
+
+int TestNetworkDelegate::OnBeforeSendHeaders(
+ net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ net::HttpRequestHeaders* headers) {
+ int req_id = request->identifier();
+ InitRequestStatesIfNew(req_id);
+ event_order_[req_id] += "OnBeforeSendHeaders\n";
+ EXPECT_TRUE(next_states_[req_id] & kStageBeforeSendHeaders) <<
+ event_order_[req_id];
+ next_states_[req_id] =
+ kStageSendHeaders |
+ kStageCompletedError; // request canceled by delegate
+
+ return net::OK;
+}
+
+void TestNetworkDelegate::OnSendHeaders(
+ net::URLRequest* request,
+ const net::HttpRequestHeaders& headers) {
+ int req_id = request->identifier();
+ InitRequestStatesIfNew(req_id);
+ event_order_[req_id] += "OnSendHeaders\n";
+ EXPECT_TRUE(next_states_[req_id] & kStageSendHeaders) <<
+ event_order_[req_id];
+ next_states_[req_id] =
+ kStageHeadersReceived |
+ kStageCompletedError;
+}
+
+int TestNetworkDelegate::OnHeadersReceived(
+ net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ net::HttpResponseHeaders* original_response_headers,
+ scoped_refptr<net::HttpResponseHeaders>* override_response_headers) {
+ int req_id = request->identifier();
+ event_order_[req_id] += "OnHeadersReceived\n";
+ InitRequestStatesIfNew(req_id);
+ EXPECT_TRUE(next_states_[req_id] & kStageHeadersReceived) <<
+ event_order_[req_id];
+ next_states_[req_id] =
+ kStageBeforeRedirect |
+ kStageResponseStarted |
+ kStageAuthRequired |
+ kStageCompletedError; // e.g. proxy resolution problem
+
+ // Basic authentication sends a second request from the URLRequestHttpJob
+ // layer before the URLRequest reports that a response has started.
+ next_states_[req_id] |= kStageBeforeSendHeaders;
+
+ return net::OK;
+}
+
+void TestNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
+ const GURL& new_location) {
+ int req_id = request->identifier();
+ InitRequestStatesIfNew(req_id);
+ event_order_[req_id] += "OnBeforeRedirect\n";
+ EXPECT_TRUE(next_states_[req_id] & kStageBeforeRedirect) <<
+ event_order_[req_id];
+ next_states_[req_id] =
+ kStageBeforeURLRequest | // HTTP redirects trigger this.
+ kStageBeforeSendHeaders | // Redirects from the network delegate do not
+ // trigger onBeforeURLRequest.
+ kStageCompletedError;
+
+ // A redirect can lead to a file or a data URL. In this case, we do not send
+ // headers.
+ next_states_[req_id] |= kStageResponseStarted;
+}
+
+void TestNetworkDelegate::OnResponseStarted(net::URLRequest* request) {
+ int req_id = request->identifier();
+ InitRequestStatesIfNew(req_id);
+ event_order_[req_id] += "OnResponseStarted\n";
+ EXPECT_TRUE(next_states_[req_id] & kStageResponseStarted) <<
+ event_order_[req_id];
+ next_states_[req_id] = kStageCompletedSuccess | kStageCompletedError;
+ if (request->status().status() == net::URLRequestStatus::FAILED) {
+ error_count_++;
+ last_error_ = request->status().error();
+ }
+}
+
+void TestNetworkDelegate::OnRawBytesRead(const net::URLRequest& request,
+ int bytes_read) {
+}
+
+void TestNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) {
+ int req_id = request->identifier();
+ InitRequestStatesIfNew(req_id);
+ event_order_[req_id] += "OnCompleted\n";
+ // Expect "Success -> (next_states_ & kStageCompletedSuccess)"
+ // is logically identical to
+ // Expect "!(Success) || (next_states_ & kStageCompletedSuccess)"
+ EXPECT_TRUE(!request->status().is_success() ||
+ (next_states_[req_id] & kStageCompletedSuccess)) <<
+ event_order_[req_id];
+ EXPECT_TRUE(request->status().is_success() ||
+ (next_states_[req_id] & kStageCompletedError)) <<
+ event_order_[req_id];
+ next_states_[req_id] = kStageURLRequestDestroyed;
+ completed_requests_++;
+ if (request->status().status() == net::URLRequestStatus::FAILED) {
+ error_count_++;
+ last_error_ = request->status().error();
+ }
+}
+
+void TestNetworkDelegate::OnURLRequestDestroyed(
+ net::URLRequest* request) {
+ int req_id = request->identifier();
+ InitRequestStatesIfNew(req_id);
+ event_order_[req_id] += "OnURLRequestDestroyed\n";
+ EXPECT_TRUE(next_states_[req_id] & kStageURLRequestDestroyed) <<
+ event_order_[req_id];
+ next_states_[req_id] = kStageDestruction;
+ destroyed_requests_++;
+}
+
+void TestNetworkDelegate::OnPACScriptError(int line_number,
+ const string16& error) {
+}
+
+net::NetworkDelegate::AuthRequiredResponse TestNetworkDelegate::OnAuthRequired(
+ net::URLRequest* request,
+ const net::AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ net::AuthCredentials* credentials) {
+ int req_id = request->identifier();
+ InitRequestStatesIfNew(req_id);
+ event_order_[req_id] += "OnAuthRequired\n";
+ EXPECT_TRUE(next_states_[req_id] & kStageAuthRequired) <<
+ event_order_[req_id];
+ next_states_[req_id] = kStageBeforeSendHeaders |
+ kStageHeadersReceived | // Request canceled by delegate simulates empty
+ // response.
+ kStageResponseStarted | // data: URLs do not trigger sending headers
+ kStageBeforeRedirect; // a delegate can trigger a redirection
+ return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
+}
+
+// static
+std::string ScopedCustomUrlRequestTestHttpHost::value_("127.0.0.1");
+
+ScopedCustomUrlRequestTestHttpHost::ScopedCustomUrlRequestTestHttpHost(
+ const std::string& new_value)
+ : old_value_(value_),
+ new_value_(new_value) {
+ value_ = new_value_;
+}
+
+ScopedCustomUrlRequestTestHttpHost::~ScopedCustomUrlRequestTestHttpHost() {
+ DCHECK_EQ(value_, new_value_);
+ value_ = old_value_;
+}
+
+// static
+const std::string& ScopedCustomUrlRequestTestHttpHost::value() {
+ return value_;
+}
« no previous file with comments | « net/url_request/url_request_test_util.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698