diff options
42 files changed, 702 insertions, 816 deletions
diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chrome_browser_field_trials.cc index eae684c..0d7d198 100644 --- a/chrome/browser/chrome_browser_field_trials.cc +++ b/chrome/browser/chrome_browser_field_trials.cc @@ -169,15 +169,6 @@ void ChromeBrowserFieldTrials::SpdyFieldTrial() { trial->AppendGroup("cwnd16", kSpdyCwnd16); trial->AppendGroup("cwndMin16", kSpdyCwndMin16); trial->AppendGroup("cwndMin10", kSpdyCwndMin10); - - if (parsed_command_line_.HasSwitch(switches::kMaxSpdyConcurrentStreams)) { - int value = 0; - base::StringToInt(parsed_command_line_.GetSwitchValueASCII( - switches::kMaxSpdyConcurrentStreams), - &value); - if (value > 0) - net::SpdySession::set_max_concurrent_streams(value); - } } // If --socket-reuse-policy is not specified, run an A/B test for choosing the diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index fff9a7d..0812638 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc @@ -53,7 +53,6 @@ #include "net/http/http_auth_filter.h" #include "net/http/http_auth_handler_factory.h" #include "net/http/http_network_layer.h" -#include "net/http/http_network_session.h" #include "net/http/http_server_properties_impl.h" #include "net/proxy/proxy_config_service.h" #include "net/proxy/proxy_script_fetcher_impl.h" @@ -222,23 +221,14 @@ ConstructSystemRequestContext(IOThread::Globals* globals, return context; } -void InitializeNetworkSessionParams( - const IOThread::Globals& globals, - net::HttpNetworkSession::Params* params) { - params->host_resolver = globals.host_resolver.get(); - params->cert_verifier = globals.cert_verifier.get(); - params->server_bound_cert_service = - globals.system_server_bound_cert_service.get(); - params->transport_security_state = globals.transport_security_state.get(); - params->ssl_config_service = globals.ssl_config_service.get(); - params->http_auth_handler_factory = globals.http_auth_handler_factory.get(); - params->http_server_properties = globals.http_server_properties.get(); - params->network_delegate = globals.system_network_delegate.get(); - params->host_mapping_rules = globals.host_mapping_rules.get(); - params->ignore_certificate_errors = globals.ignore_certificate_errors; - params->http_pipelining_enabled = globals.http_pipelining_enabled; - params->testing_fixed_http_port = globals.testing_fixed_http_port; - params->testing_fixed_https_port = globals.testing_fixed_https_port; +int GetSwitchValueAsInt(const CommandLine& command_line, + const std::string& switch_name) { + int value; + if (!base::StringToInt(command_line.GetSwitchValueASCII(switch_name), + &value)) { + return 0; + } + return value; } } // namespace @@ -498,30 +488,22 @@ void IOThread::Init() { if (command_line.HasSwitch(switches::kEnableHttpPipelining)) globals_->http_pipelining_enabled = true; if (command_line.HasSwitch(switches::kTestingFixedHttpPort)) { - int value; - base::StringToInt( - command_line.GetSwitchValueASCII( - switches::kTestingFixedHttpPort), - &value); - globals_->testing_fixed_http_port = value; + globals_->testing_fixed_http_port = + GetSwitchValueAsInt(command_line, switches::kTestingFixedHttpPort); } if (command_line.HasSwitch(switches::kTestingFixedHttpsPort)) { - int value; - base::StringToInt( - command_line.GetSwitchValueASCII( - switches::kTestingFixedHttpsPort), - &value); - globals_->testing_fixed_https_port = value; + globals_->testing_fixed_https_port = + GetSwitchValueAsInt(command_line, switches::kTestingFixedHttpsPort); } + InitializeNetworkOptions(command_line); + net::HttpNetworkSession::Params session_params; - InitializeNetworkSessionParams(*globals_, &session_params); + InitializeNetworkSessionParams(&session_params); session_params.net_log = net_log_; session_params.proxy_service = globals_->proxy_script_fetcher_proxy_service.get(); - InitializeNetworkOptions(command_line); - scoped_refptr<net::HttpNetworkSession> network_session( new net::HttpNetworkSession(session_params)); globals_->proxy_script_fetcher_http_transaction_factory.reset( @@ -594,9 +576,8 @@ void IOThread::CleanUp() { base::debug::LeakTracker<SystemURLRequestContextGetter>::CheckForLeaks(); } -void IOThread::InitializeNetworkOptions( - const CommandLine& parsed_command_line) { - if (parsed_command_line.HasSwitch(switches::kEnableFileCookies)) { +void IOThread::InitializeNetworkOptions(const CommandLine& command_line) { + if (command_line.HasSwitch(switches::kEnableFileCookies)) { // Enable cookie storage for file:// URLs. Must do this before the first // Profile (and therefore the first CookieMonster) is created. net::CookieMonster::EnableFileScheme(); @@ -607,42 +588,42 @@ void IOThread::InitializeNetworkOptions( if (is_spdy_disabled_by_policy_) return; - if (parsed_command_line.HasSwitch(switches::kEnableIPPooling)) - net::SpdySessionPool::enable_ip_pooling(true); - - if (parsed_command_line.HasSwitch(switches::kDisableIPPooling)) - net::SpdySessionPool::enable_ip_pooling(false); - - if (parsed_command_line.HasSwitch(switches::kEnableSpdyCredentialFrames)) - net::SpdySession::set_enable_credential_frames(true); - if (parsed_command_line.HasSwitch(switches::kMaxSpdySessionsPerDomain)) { - int value; - base::StringToInt( - parsed_command_line.GetSwitchValueASCII( - switches::kMaxSpdySessionsPerDomain), - &value); - net::SpdySessionPool::set_max_sessions_per_domain(value); - } + if (command_line.HasSwitch(switches::kEnableIPPooling)) + globals_->enable_spdy_ip_pooling.set(true); - if (parsed_command_line.HasSwitch(switches::kEnableWebSocketOverSpdy)) { + if (command_line.HasSwitch(switches::kDisableIPPooling)) + globals_->enable_spdy_ip_pooling.set(false); + + if (command_line.HasSwitch(switches::kEnableSpdyCredentialFrames)) + globals_->enable_spdy_credential_frames.set(true); + + if (command_line.HasSwitch(switches::kEnableWebSocketOverSpdy)) { // Enable WebSocket over SPDY. net::WebSocketJob::set_websocket_over_spdy_enabled(true); } + if (command_line.HasSwitch(switches::kMaxSpdySessionsPerDomain)) { + globals_->max_spdy_sessions_per_domain.set( + GetSwitchValueAsInt(command_line, switches::kMaxSpdySessionsPerDomain)); + } + if (command_line.HasSwitch(switches::kMaxSpdyConcurrentStreams)) { + globals_->max_spdy_concurrent_streams_limit.set( + GetSwitchValueAsInt(command_line, switches::kMaxSpdyConcurrentStreams)); + } bool used_spdy_switch = false; - if (parsed_command_line.HasSwitch(switches::kUseSpdy)) { + if (command_line.HasSwitch(switches::kUseSpdy)) { std::string spdy_mode = - parsed_command_line.GetSwitchValueASCII(switches::kUseSpdy); + command_line.GetSwitchValueASCII(switches::kUseSpdy); EnableSpdy(spdy_mode); used_spdy_switch = true; } - if (parsed_command_line.HasSwitch(switches::kEnableSpdy3)) { + if (command_line.HasSwitch(switches::kEnableSpdy3)) { net::HttpStreamFactory::EnableNpnSpdy3(); used_spdy_switch = true; - } else if (parsed_command_line.HasSwitch(switches::kEnableNpn)) { + } else if (command_line.HasSwitch(switches::kEnableNpn)) { net::HttpStreamFactory::EnableNpnSpdy(); used_spdy_switch = true; - } else if (parsed_command_line.HasSwitch(switches::kEnableNpnHttpOnly)) { + } else if (command_line.HasSwitch(switches::kEnableNpnHttpOnly)) { net::HttpStreamFactory::EnableNpnHttpOnly(); used_spdy_switch = true; } @@ -678,19 +659,19 @@ void IOThread::EnableSpdy(const std::string& mode) { if (option == kOff) { net::HttpStreamFactory::set_spdy_enabled(false); } else if (option == kDisableSSL) { - net::SpdySession::set_default_protocol(net::kProtoSPDY2); + globals_->spdy_default_protocol.set(net::kProtoSPDY2); net::HttpStreamFactory::set_force_spdy_over_ssl(false); net::HttpStreamFactory::set_force_spdy_always(true); } else if (option == kSSL) { - net::SpdySession::set_default_protocol(net::kProtoSPDY2); + globals_->spdy_default_protocol.set(net::kProtoSPDY2); net::HttpStreamFactory::set_force_spdy_over_ssl(true); net::HttpStreamFactory::set_force_spdy_always(true); } else if (option == kDisablePing) { - net::SpdySession::set_enable_ping_based_connection_checking(false); + globals_->enable_spdy_ping_based_connection_checking.set(false); } else if (option == kExclude) { net::HttpStreamFactory::add_forced_spdy_exclusion(value); } else if (option == kDisableCompression) { - net::BufferedSpdyFramer::set_enable_compression_default(false); + globals_->enable_spdy_compression.set(false); } else if (option == kDisableAltProtocols) { net::HttpStreamFactory::set_use_alternate_protocols(false); } else if (option == kForceAltProtocols) { @@ -700,11 +681,11 @@ void IOThread::EnableSpdy(const std::string& mode) { net::HttpServerPropertiesImpl::ForceAlternateProtocol(pair); } else if (option == kSingleDomain) { DLOG(INFO) << "FORCING SINGLE DOMAIN"; - net::SpdySessionPool::ForceSingleDomain(); + globals_->force_spdy_single_domain.set(true); } else if (option == kInitialMaxConcurrentStreams) { int streams; - if (base::StringToInt(value, &streams) && streams > 0) - net::SpdySession::set_init_max_concurrent_streams(streams); + if (base::StringToInt(value, &streams)) + globals_->initial_max_spdy_concurrent_streams.set(streams); } else if (option.empty() && it == spdy_options.begin()) { continue; } else { @@ -781,6 +762,43 @@ void IOThread::ClearHostCache() { host_cache->clear(); } +void IOThread::InitializeNetworkSessionParams( + net::HttpNetworkSession::Params* params) { + params->host_resolver = globals_->host_resolver.get(); + params->cert_verifier = globals_->cert_verifier.get(); + params->server_bound_cert_service = + globals_->system_server_bound_cert_service.get(); + params->transport_security_state = globals_->transport_security_state.get(); + params->ssl_config_service = globals_->ssl_config_service.get(); + params->http_auth_handler_factory = globals_->http_auth_handler_factory.get(); + params->http_server_properties = globals_->http_server_properties.get(); + params->network_delegate = globals_->system_network_delegate.get(); + params->host_mapping_rules = globals_->host_mapping_rules.get(); + params->ignore_certificate_errors = globals_->ignore_certificate_errors; + params->http_pipelining_enabled = globals_->http_pipelining_enabled; + params->testing_fixed_http_port = globals_->testing_fixed_http_port; + params->testing_fixed_https_port = globals_->testing_fixed_https_port; + + globals_->max_spdy_sessions_per_domain.CopyToIfSet( + ¶ms->max_spdy_sessions_per_domain); + globals_->initial_max_spdy_concurrent_streams.CopyToIfSet( + ¶ms->spdy_initial_max_concurrent_streams); + globals_->max_spdy_concurrent_streams_limit.CopyToIfSet( + ¶ms->spdy_max_concurrent_streams_limit); + globals_->force_spdy_single_domain.CopyToIfSet( + ¶ms->force_spdy_single_domain); + globals_->enable_spdy_ip_pooling.CopyToIfSet( + ¶ms->enable_spdy_ip_pooling); + globals_->enable_spdy_credential_frames.CopyToIfSet( + ¶ms->enable_spdy_credential_frames); + globals_->enable_spdy_compression.CopyToIfSet( + ¶ms->enable_spdy_compression); + globals_->enable_spdy_ping_based_connection_checking.CopyToIfSet( + ¶ms->enable_spdy_ping_based_connection_checking); + globals_->spdy_default_protocol.CopyToIfSet( + ¶ms->spdy_default_protocol); +} + net::SSLConfigService* IOThread::GetSSLConfigService() { return ssl_config_service_manager_->Get(); } @@ -832,7 +850,7 @@ void IOThread::InitSystemRequestContextOnIOThread() { command_line)); net::HttpNetworkSession::Params system_params; - InitializeNetworkSessionParams(*globals_, &system_params); + InitializeNetworkSessionParams(&system_params); system_params.net_log = net_log_; system_params.proxy_service = globals_->system_proxy_service.get(); diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h index de61126..8216614 100644 --- a/chrome/browser/io_thread.h +++ b/chrome/browser/io_thread.h @@ -17,6 +17,8 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread_delegate.h" #include "net/base/network_change_notifier.h" +#include "net/http/http_network_session.h" +#include "net/socket/next_proto.h" class ChromeNetLog; class CommandLine; @@ -70,6 +72,26 @@ class PolicyService; class IOThread : public content::BrowserThreadDelegate { public: struct Globals { + template <typename T> + class Optional { + public: + Optional() : set_(false) {} + + void set(T value) { + set_ = true; + value_ = value; + } + void CopyToIfSet(T* value) { + if (set_) { + *value = value_; + } + } + + private: + bool set_; + T value_; + }; + class SystemRequestContextLeakChecker { public: explicit SystemRequestContextLeakChecker(Globals* globals); @@ -127,6 +149,15 @@ class IOThread : public content::BrowserThreadDelegate { bool http_pipelining_enabled; uint16 testing_fixed_http_port; uint16 testing_fixed_https_port; + Optional<size_t> max_spdy_sessions_per_domain; + Optional<size_t> initial_max_spdy_concurrent_streams; + Optional<size_t> max_spdy_concurrent_streams_limit; + Optional<bool> force_spdy_single_domain; + Optional<bool> enable_spdy_ip_pooling; + Optional<bool> enable_spdy_credential_frames; + Optional<bool> enable_spdy_compression; + Optional<bool> enable_spdy_ping_based_connection_checking; + Optional<net::NextProto> spdy_default_protocol; // NetErrorTabHelper uses |dns_probe_service| to send DNS probes when a // main frame load fails with a DNS error in order to provide more useful // information to the renderer so it can show a more specific error page. @@ -157,6 +188,8 @@ class IOThread : public content::BrowserThreadDelegate { // called on the IO thread. void ClearHostCache(); + void InitializeNetworkSessionParams(net::HttpNetworkSession::Params* params); + private: // Provide SystemURLRequestContextGetter with access to // InitSystemRequestContext(). diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc index 8785d39..0c8bb33 100644 --- a/chrome/browser/profiles/profile_io_data.cc +++ b/chrome/browser/profiles/profile_io_data.cc @@ -712,7 +712,8 @@ void ProfileIOData::PopulateNetworkSessionParams( ChromeURLRequestContext* context = main_request_context(); IOThread* const io_thread = profile_params->io_thread; - IOThread::Globals* const globals = io_thread->globals(); + + io_thread->InitializeNetworkSessionParams(params); params->host_resolver = context->host_resolver(); params->cert_verifier = context->cert_verifier(); @@ -725,17 +726,6 @@ void ProfileIOData::PopulateNetworkSessionParams( params->network_delegate = context->network_delegate(); params->http_server_properties = context->http_server_properties(); params->net_log = context->net_log(); - params->host_mapping_rules = globals->host_mapping_rules.get(); - params->ignore_certificate_errors = globals->ignore_certificate_errors; - params->http_pipelining_enabled = globals->http_pipelining_enabled; - params->testing_fixed_http_port = globals->testing_fixed_http_port; - params->testing_fixed_https_port = globals->testing_fixed_https_port; - - const CommandLine& command_line = *CommandLine::ForCurrentProcess(); - if (command_line.HasSwitch(switches::kTrustedSpdyProxy)) { - params->trusted_spdy_proxy = command_line.GetSwitchValueASCII( - switches::kTrustedSpdyProxy); - } } void ProfileIOData::SetCookieSettingsForTesting( diff --git a/net/base/net_test_suite.cc b/net/base/net_test_suite.cc index bd6413f..9413058 100644 --- a/net/base/net_test_suite.cc +++ b/net/base/net_test_suite.cc @@ -17,7 +17,6 @@ class StaticReset : public ::testing::EmptyTestEventListener { virtual void OnTestStart(const ::testing::TestInfo& test_info) OVERRIDE { net::HttpStreamFactory::ResetStaticSettingsToInit(); - net::SpdySession::ResetStaticSettingsToInit(); } }; diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index c54325cf..50a18c2 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc @@ -7,6 +7,7 @@ #include <utility> #include "base/compiler_specific.h" +#include "base/debug/stack_trace.h" #include "base/logging.h" #include "base/stl_util.h" #include "base/string_util.h" @@ -18,6 +19,7 @@ #include "net/proxy/proxy_service.h" #include "net/socket/client_socket_factory.h" #include "net/socket/client_socket_pool_manager_impl.h" +#include "net/socket/next_proto.h" #include "net/spdy/spdy_session_pool.h" namespace { @@ -63,7 +65,19 @@ HttpNetworkSession::Params::Params() ignore_certificate_errors(false), http_pipelining_enabled(false), testing_fixed_http_port(0), - testing_fixed_https_port(0) {} + testing_fixed_https_port(0), + max_spdy_sessions_per_domain(0), + force_spdy_single_domain(false), + enable_spdy_ip_pooling(true), + enable_spdy_credential_frames(false), + enable_spdy_compression(true), + enable_spdy_ping_based_connection_checking(true), + spdy_default_protocol(kProtoUnknown), + spdy_initial_recv_window_size(0), + spdy_initial_max_concurrent_streams(0), + spdy_max_concurrent_streams_limit(0), + time_func(&base::TimeTicks::Now) { +} // TODO(mbelshe): Move the socket factories into HttpStreamFactory. HttpNetworkSession::HttpNetworkSession(const Params& params) @@ -82,6 +96,17 @@ HttpNetworkSession::HttpNetworkSession(const Params& params) spdy_session_pool_(params.host_resolver, params.ssl_config_service, params.http_server_properties, + params.max_spdy_sessions_per_domain, + params.force_spdy_single_domain, + params.enable_spdy_ip_pooling, + params.enable_spdy_credential_frames, + params.enable_spdy_compression, + params.enable_spdy_ping_based_connection_checking, + params.spdy_default_protocol, + params.spdy_initial_recv_window_size, + params.spdy_initial_max_concurrent_streams, + params.spdy_max_concurrent_streams_limit, + params.time_func, params.trusted_spdy_proxy), ALLOW_THIS_IN_INITIALIZER_LIST(http_stream_factory_( new HttpStreamFactoryImpl(this))), diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index 47abaec..d47b5a4 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h @@ -67,6 +67,17 @@ class NET_EXPORT HttpNetworkSession bool http_pipelining_enabled; uint16 testing_fixed_http_port; uint16 testing_fixed_https_port; + size_t max_spdy_sessions_per_domain; + bool force_spdy_single_domain; + bool enable_spdy_ip_pooling; + bool enable_spdy_credential_frames; + bool enable_spdy_compression; + bool enable_spdy_ping_based_connection_checking; + NextProto spdy_default_protocol; + size_t spdy_initial_recv_window_size; + size_t spdy_initial_max_concurrent_streams; + size_t spdy_max_concurrent_streams_limit; + SpdySessionPool::TimeFunc time_func; std::string trusted_spdy_proxy; }; diff --git a/net/http/http_network_transaction_spdy2_unittest.cc b/net/http/http_network_transaction_spdy2_unittest.cc index ebeb2d9..29ec3fb 100644 --- a/net/http/http_network_transaction_spdy2_unittest.cc +++ b/net/http/http_network_transaction_spdy2_unittest.cc @@ -152,7 +152,6 @@ class HttpNetworkTransactionSpdy2Test : public PlatformTest { }; virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY2); NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); MessageLoop::current()->RunUntilIdle(); } @@ -249,9 +248,6 @@ class HttpNetworkTransactionSpdy2Test : public PlatformTest { int expected_status); void ConnectStatusHelper(const MockRead& status); - - private: - SpdyTestStateHelper spdy_state_; }; namespace { diff --git a/net/http/http_network_transaction_spdy3_unittest.cc b/net/http/http_network_transaction_spdy3_unittest.cc index 56f42eb..f9d057c 100644 --- a/net/http/http_network_transaction_spdy3_unittest.cc +++ b/net/http/http_network_transaction_spdy3_unittest.cc @@ -152,7 +152,6 @@ class HttpNetworkTransactionSpdy3Test : public PlatformTest { }; virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY3); NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); MessageLoop::current()->RunUntilIdle(); } @@ -249,9 +248,6 @@ class HttpNetworkTransactionSpdy3Test : public PlatformTest { int expected_status); void ConnectStatusHelper(const MockRead& status); - - private: - SpdyTestStateHelper spdy_state_; }; namespace { diff --git a/net/http/http_proxy_client_socket_pool_spdy2_unittest.cc b/net/http/http_proxy_client_socket_pool_spdy2_unittest.cc index 3557fd7..4938628 100644 --- a/net/http/http_proxy_client_socket_pool_spdy2_unittest.cc +++ b/net/http/http_proxy_client_socket_pool_spdy2_unittest.cc @@ -190,7 +190,6 @@ class HttpProxyClientSocketPoolSpdy2Test : public TestWithHttpParam { const scoped_refptr<HttpNetworkSession> session_; ClientSocketPoolHistograms http_proxy_histograms_; - SpdyTestStateHelper spdy_state_; protected: scoped_ptr<SSLSocketDataProvider> ssl_data_; diff --git a/net/http/http_proxy_client_socket_pool_spdy3_unittest.cc b/net/http/http_proxy_client_socket_pool_spdy3_unittest.cc index b3bf87f..64cfd8e 100644 --- a/net/http/http_proxy_client_socket_pool_spdy3_unittest.cc +++ b/net/http/http_proxy_client_socket_pool_spdy3_unittest.cc @@ -190,7 +190,6 @@ class HttpProxyClientSocketPoolSpdy3Test : public TestWithHttpParam { const scoped_refptr<HttpNetworkSession> session_; ClientSocketPoolHistograms http_proxy_histograms_; - SpdyTestStateHelper spdy_state_; protected: scoped_ptr<SSLSocketDataProvider> ssl_data_; diff --git a/net/socket/ssl_client_socket_pool_unittest.cc b/net/socket/ssl_client_socket_pool_unittest.cc index 41ce4f9..92f0ce65 100644 --- a/net/socket/ssl_client_socket_pool_unittest.cc +++ b/net/socket/ssl_client_socket_pool_unittest.cc @@ -143,6 +143,7 @@ class SSLClientSocketPoolTest : public testing::Test { params.ssl_config_service = ssl_config_service_; params.http_auth_handler_factory = http_auth_handler_factory_.get(); params.http_server_properties = &http_server_properties_; + params.enable_spdy_compression = false; return new HttpNetworkSession(params); } diff --git a/net/spdy/buffered_spdy_framer.cc b/net/spdy/buffered_spdy_framer.cc index bafb5ce..50a0d931 100644 --- a/net/spdy/buffered_spdy_framer.cc +++ b/net/spdy/buffered_spdy_framer.cc @@ -6,22 +6,16 @@ #include "base/logging.h" -namespace { - -bool g_enable_compression_default = true; - -} // namespace - namespace net { -BufferedSpdyFramer::BufferedSpdyFramer(int version) +BufferedSpdyFramer::BufferedSpdyFramer(int version, bool enable_compression) : spdy_framer_(version), visitor_(NULL), header_buffer_used_(0), header_buffer_valid_(false), header_stream_id_(SpdyFramer::kInvalidStream), frames_received_(0) { - spdy_framer_.set_enable_compression(g_enable_compression_default); + spdy_framer_.set_enable_compression(enable_compression); memset(header_buffer_, 0, sizeof(header_buffer_)); } @@ -296,11 +290,6 @@ bool BufferedSpdyFramer::IsCompressible(const SpdyFrame& frame) const { return spdy_framer_.IsCompressible(frame); } -// static -void BufferedSpdyFramer::set_enable_compression_default(bool value) { - g_enable_compression_default = value; -} - void BufferedSpdyFramer::InitHeaderStreaming(SpdyStreamId stream_id) { memset(header_buffer_, 0, kHeaderBufferSize); header_buffer_used_ = 0; diff --git a/net/spdy/buffered_spdy_framer.h b/net/spdy/buffered_spdy_framer.h index aa4163e..ea64151 100644 --- a/net/spdy/buffered_spdy_framer.h +++ b/net/spdy/buffered_spdy_framer.h @@ -92,7 +92,8 @@ class NET_EXPORT_PRIVATE BufferedSpdyFramerVisitorInterface { class NET_EXPORT_PRIVATE BufferedSpdyFramer : public SpdyFramerVisitorInterface { public: - explicit BufferedSpdyFramer(int version); + BufferedSpdyFramer(int version, + bool enable_compression); virtual ~BufferedSpdyFramer(); // Sets callbacks to be called from the buffered spdy framer. A visitor must @@ -178,8 +179,6 @@ class NET_EXPORT_PRIVATE BufferedSpdyFramer SpdyDataFlags flags); SpdyPriority GetHighestPriority() const; bool IsCompressible(const SpdyFrame& frame) const; - // Specify if newly created SpdySessions should have compression enabled. - static void set_enable_compression_default(bool value); int frames_received() const { return frames_received_; } diff --git a/net/spdy/buffered_spdy_framer_spdy2_unittest.cc b/net/spdy/buffered_spdy_framer_spdy2_unittest.cc index 3814128..4bbdf6e 100644 --- a/net/spdy/buffered_spdy_framer_spdy2_unittest.cc +++ b/net/spdy/buffered_spdy_framer_spdy2_unittest.cc @@ -16,13 +16,13 @@ namespace { class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { public: TestBufferedSpdyVisitor() - : buffered_spdy_framer_(2), - error_count_(0), - setting_count_(0), - syn_frame_count_(0), - syn_reply_frame_count_(0), - headers_frame_count_(0), - header_stream_id_(-1) { + : buffered_spdy_framer_(2, true), + error_count_(0), + setting_count_(0), + syn_frame_count_(0), + syn_reply_frame_count_(0), + headers_frame_count_(0), + header_stream_id_(-1) { } void OnError(SpdyFramer::SpdyError error_code) { @@ -174,9 +174,6 @@ class BufferedSpdyFramerSpdy2Test : public PlatformTest { } return true; } - - private: - SpdyTestStateHelper spdy_state_; }; TEST_F(BufferedSpdyFramerSpdy2Test, OnSetting) { @@ -201,7 +198,7 @@ TEST_F(BufferedSpdyFramerSpdy2Test, ReadSynStreamHeaderBlock) { SpdyHeaderBlock headers; headers["aa"] = "vv"; headers["bb"] = "ww"; - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, true); scoped_ptr<SpdySynStreamControlFrame> control_frame( framer.CreateSynStream(1, // stream_id 0, // associated_stream_id @@ -227,7 +224,7 @@ TEST_F(BufferedSpdyFramerSpdy2Test, ReadSynReplyHeaderBlock) { SpdyHeaderBlock headers; headers["alpha"] = "beta"; headers["gamma"] = "delta"; - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, true); scoped_ptr<SpdySynReplyControlFrame> control_frame( framer.CreateSynReply(1, // stream_id CONTROL_FLAG_NONE, @@ -250,7 +247,7 @@ TEST_F(BufferedSpdyFramerSpdy2Test, ReadHeadersHeaderBlock) { SpdyHeaderBlock headers; headers["alpha"] = "beta"; headers["gamma"] = "delta"; - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, true); scoped_ptr<SpdyHeadersControlFrame> control_frame( framer.CreateHeaders(1, // stream_id CONTROL_FLAG_NONE, diff --git a/net/spdy/buffered_spdy_framer_spdy3_unittest.cc b/net/spdy/buffered_spdy_framer_spdy3_unittest.cc index c69ac4d..ca9edf3 100644 --- a/net/spdy/buffered_spdy_framer_spdy3_unittest.cc +++ b/net/spdy/buffered_spdy_framer_spdy3_unittest.cc @@ -16,13 +16,13 @@ namespace { class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { public: TestBufferedSpdyVisitor() - : buffered_spdy_framer_(3), - error_count_(0), - setting_count_(0), - syn_frame_count_(0), - syn_reply_frame_count_(0), - headers_frame_count_(0), - header_stream_id_(-1) { + : buffered_spdy_framer_(3, true), + error_count_(0), + setting_count_(0), + syn_frame_count_(0), + syn_reply_frame_count_(0), + headers_frame_count_(0), + header_stream_id_(-1) { } void OnError(SpdyFramer::SpdyError error_code) { @@ -174,13 +174,11 @@ class BufferedSpdyFramerSpdy3Test : public PlatformTest { } return true; } - - private: - SpdyTestStateHelper spdy_state_; }; TEST_F(BufferedSpdyFramerSpdy3Test, OnSetting) { SpdyFramer framer(3); + framer.set_enable_compression(false); SettingsMap settings; settings[SETTINGS_UPLOAD_BANDWIDTH] = SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 0x00000002); @@ -201,7 +199,7 @@ TEST_F(BufferedSpdyFramerSpdy3Test, ReadSynStreamHeaderBlock) { SpdyHeaderBlock headers; headers["aa"] = "vv"; headers["bb"] = "ww"; - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, true); scoped_ptr<SpdySynStreamControlFrame> control_frame( framer.CreateSynStream(1, // stream_id 0, // associated_stream_id @@ -227,7 +225,7 @@ TEST_F(BufferedSpdyFramerSpdy3Test, ReadSynReplyHeaderBlock) { SpdyHeaderBlock headers; headers["alpha"] = "beta"; headers["gamma"] = "delta"; - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, true); scoped_ptr<SpdySynReplyControlFrame> control_frame( framer.CreateSynReply(1, // stream_id CONTROL_FLAG_NONE, @@ -250,7 +248,7 @@ TEST_F(BufferedSpdyFramerSpdy3Test, ReadHeadersHeaderBlock) { SpdyHeaderBlock headers; headers["alpha"] = "beta"; headers["gamma"] = "delta"; - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, true); scoped_ptr<SpdyHeadersControlFrame> control_frame( framer.CreateHeaders(1, // stream_id CONTROL_FLAG_NONE, diff --git a/net/spdy/spdy_credential_builder_unittest.cc b/net/spdy/spdy_credential_builder_unittest.cc index 825e97d..067fdb7 100644 --- a/net/spdy/spdy_credential_builder_unittest.cc +++ b/net/spdy/spdy_credential_builder_unittest.cc @@ -69,10 +69,10 @@ class SpdyCredentialBuilderTest : public testing::Test { MockClientSocket::kTlsUnique); } - SpdyTestStateHelper helper_; // Provides deterministic EC signatures. std::string cert_; std::string key_; SpdyCredential credential_; + MockECSignatureCreatorFactory ec_signature_creator_factory_; }; // http://crbug.com/142833, http://crbug.com/140991. The following tests fail diff --git a/net/spdy/spdy_http_stream_spdy2_unittest.cc b/net/spdy/spdy_http_stream_spdy2_unittest.cc index 3c203de..f72d9a6 100644 --- a/net/spdy/spdy_http_stream_spdy2_unittest.cc +++ b/net/spdy/spdy_http_stream_spdy2_unittest.cc @@ -28,10 +28,6 @@ class SpdyHttpStreamSpdy2Test : public testing::Test { protected: SpdyHttpStreamSpdy2Test() {} - virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY2); - } - virtual void TearDown() { crypto::ECSignatureCreator::SetFactoryForTesting(NULL); UploadDataStream::ResetMergeChunks(); @@ -73,9 +69,6 @@ class SpdyHttpStreamSpdy2Test : public testing::Test { scoped_refptr<HttpNetworkSession> http_session_; scoped_refptr<SpdySession> session_; scoped_refptr<TransportSocketParams> transport_params_; - - private: - SpdyTestStateHelper spdy_state_; }; TEST_F(SpdyHttpStreamSpdy2Test, SendRequest) { diff --git a/net/spdy/spdy_http_stream_spdy3_unittest.cc b/net/spdy/spdy_http_stream_spdy3_unittest.cc index 46a1816..49e4791 100644 --- a/net/spdy/spdy_http_stream_spdy3_unittest.cc +++ b/net/spdy/spdy_http_stream_spdy3_unittest.cc @@ -29,15 +29,9 @@ namespace net { class SpdyHttpStreamSpdy3Test : public testing::Test { public: OrderedSocketData* data() { return data_.get(); } - protected: - SpdyHttpStreamSpdy3Test() {} - - virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY3); - } + protected: virtual void TearDown() { - crypto::ECSignatureCreator::SetFactoryForTesting(NULL); UploadDataStream::ResetMergeChunks(); MessageLoop::current()->RunUntilIdle(); } @@ -84,7 +78,7 @@ class SpdyHttpStreamSpdy3Test : public testing::Test { scoped_refptr<TransportSocketParams> transport_params_; private: - SpdyTestStateHelper spdy_state_; + MockECSignatureCreatorFactory ec_signature_creator_factory_; }; TEST_F(SpdyHttpStreamSpdy3Test, SendRequest) { diff --git a/net/spdy/spdy_network_transaction_spdy2_unittest.cc b/net/spdy/spdy_network_transaction_spdy2_unittest.cc index 995d98e..fc9fdf3 100644 --- a/net/spdy/spdy_network_transaction_spdy2_unittest.cc +++ b/net/spdy/spdy_network_transaction_spdy2_unittest.cc @@ -45,7 +45,6 @@ class SpdyNetworkTransactionSpdy2Test protected: virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY2); google_get_request_initialized_ = false; google_post_request_initialized_ = false; google_chunked_post_request_initialized_ = false; @@ -576,7 +575,6 @@ class SpdyNetworkTransactionSpdy2Test HttpRequestInfo google_post_request_; HttpRequestInfo google_chunked_post_request_; HttpRequestInfo google_get_push_request_; - SpdyTestStateHelper spdy_state_; base::ScopedTempDir temp_dir_; }; @@ -3533,9 +3531,6 @@ TEST_P(SpdyNetworkTransactionSpdy2Test, PartialWrite) { // In this test, we enable compression, but get a uncompressed SynReply from // the server. Verify that teardown is all clean. TEST_P(SpdyNetworkTransactionSpdy2Test, DecompressFailureOnSynReply) { - // For this test, we turn on the normal compression. - BufferedSpdyFramer::set_enable_compression_default(true); - scoped_ptr<SpdyFrame> compressed( ConstructSpdyGet(NULL, 0, true, 1, LOWEST)); scoped_ptr<SpdyFrame> rst( @@ -3552,8 +3547,10 @@ TEST_P(SpdyNetworkTransactionSpdy2Test, DecompressFailureOnSynReply) { DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); + SpdySessionDependencies* session_deps = new SpdySessionDependencies(); + session_deps->enable_compression = true; NormalSpdyTransactionHelper helper(CreateGetRequest(), - BoundNetLog(), GetParam(), NULL); + BoundNetLog(), GetParam(), session_deps); helper.RunToCompletion(&data); TransactionHelperResult out = helper.output(); EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); @@ -3649,7 +3646,7 @@ TEST_P(SpdyNetworkTransactionSpdy2Test, NetLog) { // on the network, but issued a Read for only 5 of those bytes) that the data // flow still works correctly. TEST_P(SpdyNetworkTransactionSpdy2Test, BufferFull) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; @@ -3742,7 +3739,7 @@ TEST_P(SpdyNetworkTransactionSpdy2Test, BufferFull) { // at the same time, ensure that we don't notify a read completion for // each data frame individually. TEST_P(SpdyNetworkTransactionSpdy2Test, Buffering) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; @@ -3836,7 +3833,7 @@ TEST_P(SpdyNetworkTransactionSpdy2Test, Buffering) { // Verify the case where we buffer data but read it after it has been buffered. TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedAll) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; @@ -3927,7 +3924,7 @@ TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedAll) { // Verify the case where we buffer data and close the connection. TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedClosed) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; @@ -4017,7 +4014,7 @@ TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedClosed) { // Verify the case where we buffer data and cancel the transaction. TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedCancelled) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; diff --git a/net/spdy/spdy_network_transaction_spdy3_unittest.cc b/net/spdy/spdy_network_transaction_spdy3_unittest.cc index 5a9a40c..c8a7014 100644 --- a/net/spdy/spdy_network_transaction_spdy3_unittest.cc +++ b/net/spdy/spdy_network_transaction_spdy3_unittest.cc @@ -45,7 +45,6 @@ class SpdyNetworkTransactionSpdy3Test protected: virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY3); google_get_request_initialized_ = false; google_post_request_initialized_ = false; google_chunked_post_request_initialized_ = false; @@ -577,7 +576,6 @@ class SpdyNetworkTransactionSpdy3Test HttpRequestInfo google_post_request_; HttpRequestInfo google_chunked_post_request_; HttpRequestInfo google_get_push_request_; - SpdyTestStateHelper spdy_state_; base::ScopedTempDir temp_dir_; }; @@ -4104,9 +4102,6 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, PartialWrite) { // In this test, we enable compression, but get a uncompressed SynReply from // the server. Verify that teardown is all clean. TEST_P(SpdyNetworkTransactionSpdy3Test, DecompressFailureOnSynReply) { - // For this test, we turn on the normal compression. - BufferedSpdyFramer::set_enable_compression_default(true); - scoped_ptr<SpdyFrame> compressed( ConstructSpdyGet(NULL, 0, true, 1, LOWEST)); scoped_ptr<SpdyFrame> rst( @@ -4123,8 +4118,10 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, DecompressFailureOnSynReply) { DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); + SpdySessionDependencies* session_deps = new SpdySessionDependencies(); + session_deps->enable_compression = true; NormalSpdyTransactionHelper helper(CreateGetRequest(), - BoundNetLog(), GetParam(), NULL); + BoundNetLog(), GetParam(), session_deps); helper.RunToCompletion(&data); TransactionHelperResult out = helper.output(); EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); @@ -4220,7 +4217,7 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, NetLog) { // on the network, but issued a Read for only 5 of those bytes) that the data // flow still works correctly. TEST_P(SpdyNetworkTransactionSpdy3Test, BufferFull) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; @@ -4313,7 +4310,7 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, BufferFull) { // at the same time, ensure that we don't notify a read completion for // each data frame individually. TEST_P(SpdyNetworkTransactionSpdy3Test, Buffering) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; @@ -4407,7 +4404,7 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, Buffering) { // Verify the case where we buffer data but read it after it has been buffered. TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedAll) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; @@ -4498,7 +4495,7 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedAll) { // Verify the case where we buffer data and close the connection. TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedClosed) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; @@ -4588,7 +4585,7 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedClosed) { // Verify the case where we buffer data and cancel the transaction. TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedCancelled) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); MockWrite writes[] = { CreateMockWrite(*req) }; diff --git a/net/spdy/spdy_proxy_client_socket_spdy2_unittest.cc b/net/spdy/spdy_proxy_client_socket_spdy2_unittest.cc index 424514c..5216e4a 100644 --- a/net/spdy/spdy_proxy_client_socket_spdy2_unittest.cc +++ b/net/spdy/spdy_proxy_client_socket_spdy2_unittest.cc @@ -67,10 +67,6 @@ class SpdyProxyClientSocketSpdy2Test : public PlatformTest { virtual void TearDown(); protected: - virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY2); - } - void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, size_t writes_count); SpdyFrame* ConstructConnectRequestFrame(); @@ -131,7 +127,6 @@ class SpdyProxyClientSocketSpdy2Test : public PlatformTest { ProxyServer proxy_; HostPortProxyPair endpoint_host_port_proxy_pair_; scoped_refptr<TransportSocketParams> transport_params_; - SpdyTestStateHelper spdy_state_; DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketSpdy2Test); }; @@ -145,7 +140,7 @@ SpdyProxyClientSocketSpdy2Test::SpdyProxyClientSocketSpdy2Test() connect_data_(SYNCHRONOUS, OK), spdy_session_(NULL), spdy_stream_(NULL), - framer_(2), + framer_(2, false), user_agent_(kUserAgent), url_(kRequestUrl), proxy_host_port_(kProxyHost, kProxyPort), diff --git a/net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc b/net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc index 19ae6a7..627568f 100644 --- a/net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc +++ b/net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc @@ -67,10 +67,6 @@ class SpdyProxyClientSocketSpdy3Test : public PlatformTest { virtual void TearDown(); protected: - virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY3); - } - void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, size_t writes_count); SpdyFrame* ConstructConnectRequestFrame(); @@ -131,7 +127,6 @@ class SpdyProxyClientSocketSpdy3Test : public PlatformTest { ProxyServer proxy_; HostPortProxyPair endpoint_host_port_proxy_pair_; scoped_refptr<TransportSocketParams> transport_params_; - SpdyTestStateHelper spdy_state_; DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketSpdy3Test); }; @@ -145,7 +140,7 @@ SpdyProxyClientSocketSpdy3Test::SpdyProxyClientSocketSpdy3Test() connect_data_(SYNCHRONOUS, OK), spdy_session_(NULL), spdy_stream_(NULL), - framer_(3), + framer_(3, false), user_agent_(kUserAgent), url_(kRequestUrl), proxy_host_port_(kProxyHost, kProxyPort), diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc index 77dcb1c..d0932bf 100644 --- a/net/spdy/spdy_session.cc +++ b/net/spdy/spdy_session.cc @@ -177,20 +177,13 @@ Value* NetLogSpdyGoAwayCallback(SpdyStreamId last_stream_id, return dict; } -NextProto g_default_protocol = kProtoUnknown; // Maximum number of concurrent streams we will create, unless the server // sends a SETTINGS frame with a different value. -size_t g_init_max_concurrent_streams = 100; +const size_t kInitialMaxConcurrentStreams = 100; // The maximum number of concurrent streams we will ever create. Even if // the server permits more, we will never exceed this limit. -size_t g_max_concurrent_stream_limit = 256; -size_t g_default_initial_rcv_window_size = 10 * 1024 * 1024; // 10MB -bool g_enable_ping_based_connection_checking = true; -bool g_enable_credential_frames = false; - -typedef base::TimeTicks (*ExternalTimeFunc)(void); - -static ExternalTimeFunc g_time_func = base::TimeTicks::Now; +const size_t kMaxConcurrentStreamLimit = 256; +const size_t kDefaultInitialRecvWindowSize = 10 * 1024 * 1024; // 10MB } // namespace @@ -216,71 +209,19 @@ SpdyIOBuffer* SpdySession::SpdyIOBufferProducer::CreateIOBuffer( return new SpdyIOBuffer(buffer, size, priority, stream); } -// static -void SpdySession::set_default_protocol(NextProto default_protocol) { - g_default_protocol = default_protocol; -} - -// static -void SpdySession::set_max_concurrent_streams(size_t value) { - g_max_concurrent_stream_limit = value; -} - -// static -void SpdySession::set_enable_ping_based_connection_checking(bool enable) { - g_enable_ping_based_connection_checking = enable; -} - -// static -void SpdySession::set_enable_credential_frames(bool enable) { - g_enable_credential_frames = enable; -} - - -// static -void SpdySession::set_init_max_concurrent_streams(size_t value) { - g_init_max_concurrent_streams = - std::min(value, g_max_concurrent_stream_limit); -} - -// static -void SpdySession::set_default_initial_recv_window_size(size_t value) { - g_default_initial_rcv_window_size = value; -} - -// static -void SpdySession::ResetStaticSettingsToInit() { - // WARNING: These must match the initializers above. - g_default_protocol = kProtoUnknown; - g_init_max_concurrent_streams = 100; - g_max_concurrent_stream_limit = 256; - g_default_initial_rcv_window_size = kSpdyStreamInitialWindowSize; - g_enable_ping_based_connection_checking = true; - g_enable_credential_frames = false; - g_time_func = base::TimeTicks::Now; -} - -// Outside of tests, g_time_func will always be base::TimeTicks::Now. -// When performing linker optimization for the main executable, the compiler -// should be able to see that set_time_func() is an uncalled function, that -// the static .cc variable never changes, and thus that the extra pointer -// indirection can be removed. - - - -SpdySession::TimeFunc SpdySession::set_time_func( - SpdySession::TimeFunc time_func) { - SpdySession::TimeFunc old_time_func = - static_cast<SpdySession::TimeFunc>(g_time_func); - g_time_func = static_cast<ExternalTimeFunc>(time_func); - return old_time_func; -} - SpdySession::SpdySession(const HostPortProxyPair& host_port_proxy_pair, SpdySessionPool* spdy_session_pool, HttpServerProperties* http_server_properties, bool verify_domain_authentication, bool enable_sending_initial_settings, + bool enable_credential_frames, + bool enable_compression, + bool enable_ping_based_connection_checking, + NextProto default_protocol, + size_t initial_recv_window_size, + size_t initial_max_concurrent_streams, + size_t max_concurrent_streams_limit, + TimeFunc time_func, const HostPortPair& trusted_spdy_proxy, NetLog* net_log) : ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), @@ -297,7 +238,12 @@ SpdySession::SpdySession(const HostPortProxyPair& host_port_proxy_pair, certificate_error_code_(OK), error_(OK), state_(IDLE), - max_concurrent_streams_(g_init_max_concurrent_streams), + max_concurrent_streams_(initial_max_concurrent_streams == 0 ? + kInitialMaxConcurrentStreams : + initial_max_concurrent_streams), + max_concurrent_streams_limit_(max_concurrent_streams_limit == 0 ? + kMaxConcurrentStreamLimit : + max_concurrent_streams_limit), streams_initiated_count_(0), streams_pushed_count_(0), streams_pushed_and_claimed_count_(0), @@ -312,21 +258,29 @@ SpdySession::SpdySession(const HostPortProxyPair& host_port_proxy_pair, check_ping_status_pending_(false), flow_control_(false), initial_send_window_size_(kSpdyStreamInitialWindowSize), - initial_recv_window_size_(g_default_initial_rcv_window_size), + initial_recv_window_size_(initial_recv_window_size == 0 ? + kDefaultInitialRecvWindowSize : + initial_recv_window_size), net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SPDY_SESSION)), verify_domain_authentication_(verify_domain_authentication), enable_sending_initial_settings_(enable_sending_initial_settings), + enable_credential_frames_(enable_credential_frames), + enable_compression_(enable_compression), + enable_ping_based_connection_checking_( + enable_ping_based_connection_checking), + default_protocol_(default_protocol), credential_state_(SpdyCredentialState::kDefaultNumSlots), connection_at_risk_of_loss_time_( base::TimeDelta::FromSeconds(kDefaultConnectionAtRiskOfLossSeconds)), hung_interval_( base::TimeDelta::FromSeconds(kHungIntervalSeconds)), - trusted_spdy_proxy_(trusted_spdy_proxy) { + trusted_spdy_proxy_(trusted_spdy_proxy), + time_func_(time_func) { DCHECK(HttpStreamFactory::spdy_enabled()); net_log_.BeginEvent( NetLog::TYPE_SPDY_SESSION, base::Bind(&NetLogSpdySessionCallback, &host_port_proxy_pair_)); - next_unclaimed_push_stream_sweep_time_ = g_time_func() + + next_unclaimed_push_stream_sweep_time_ = time_func_() + base::TimeDelta::FromSeconds(kMinPushedStreamLifetimeSeconds); // TODO(mbelshe): consider randomization of the stream_hi_water_mark. } @@ -389,7 +343,7 @@ net::Error SpdySession::InitializeWithSocket( is_secure_ = is_secure; certificate_error_code_ = certificate_error_code; - NextProto protocol = g_default_protocol; + NextProto protocol = default_protocol_; NextProto protocol_negotiated = connection->socket()->GetNegotiatedProtocol(); if (protocol_negotiated != kProtoUnknown) { protocol = protocol_negotiated; @@ -408,7 +362,8 @@ net::Error SpdySession::InitializeWithSocket( int version = (protocol == kProtoSPDY3) ? 3 : 2; flow_control_ = (protocol >= kProtoSPDY3); - buffered_spdy_framer_.reset(new BufferedSpdyFramer(version)); + buffered_spdy_framer_.reset(new BufferedSpdyFramer(version, + enable_compression_)); buffered_spdy_framer_->set_visitor(this); SendInitialSettings(); UMA_HISTOGRAM_ENUMERATION("Net.SpdyVersion", protocol, kProtoMaximumVersion); @@ -435,7 +390,7 @@ bool SpdySession::VerifyDomainAuthentication(const std::string& domain) { return true; // This is not a secure session, so all domains are okay. return !ssl_info.client_cert_sent && - (g_enable_credential_frames || !ssl_info.channel_id_sent || + (enable_credential_frames_ || !ssl_info.channel_id_sent || ServerBoundCertService::GetDomainForHost(domain) == ServerBoundCertService::GetDomainForHost( host_port_proxy_pair_.first.host())) && @@ -1471,7 +1426,7 @@ void SpdySession::OnSynStream(SpdyStreamId stream_id, DeleteExpiredPushedStreams(); unclaimed_pushed_streams_[url] = std::pair<scoped_refptr<SpdyStream>, base::TimeTicks> ( - stream, g_time_func()); + stream, time_func_()); ActivateStream(stream); @@ -1490,11 +1445,11 @@ void SpdySession::DeleteExpiredPushedStreams() { return; // Check that adequate time has elapsed since the last sweep. - if (g_time_func() < next_unclaimed_push_stream_sweep_time_) + if (time_func_() < next_unclaimed_push_stream_sweep_time_) return; // Delete old streams. - base::TimeTicks minimum_freshness = g_time_func() - + base::TimeTicks minimum_freshness = time_func_() - base::TimeDelta::FromSeconds(kMinPushedStreamLifetimeSeconds); PushedStreamMap::iterator it; for (it = unclaimed_pushed_streams_.begin(); @@ -1513,7 +1468,7 @@ void SpdySession::DeleteExpiredPushedStreams() { streams_abandoned_count_++; } } - next_unclaimed_push_stream_sweep_time_ = g_time_func() + + next_unclaimed_push_stream_sweep_time_ = time_func_() + base::TimeDelta::FromSeconds(kMinPushedStreamLifetimeSeconds); } @@ -1792,7 +1747,7 @@ void SpdySession::HandleSetting(uint32 id, uint32 value) { switch (id) { case SETTINGS_MAX_CONCURRENT_STREAMS: max_concurrent_streams_ = std::min(static_cast<size_t>(value), - g_max_concurrent_stream_limit); + kMaxConcurrentStreamLimit); ProcessPendingCreateStreams(); break; case SETTINGS_INITIAL_WINDOW_SIZE: @@ -1829,7 +1784,7 @@ void SpdySession::UpdateStreamsSendWindowSize(int32 delta_window_size) { } void SpdySession::SendPrefacePingIfNoneInFlight() { - if (pings_in_flight_ || !g_enable_ping_based_connection_checking) + if (pings_in_flight_ || !enable_ping_based_connection_checking_) return; base::TimeTicks now = base::TimeTicks::Now(); diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h index 22cd612..a51daae 100644 --- a/net/spdy/spdy_session.h +++ b/net/spdy/spdy_session.h @@ -94,6 +94,8 @@ COMPILE_ASSERT(PROTOCOL_ERROR_UNEXPECTED_PING == class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, public BufferedSpdyFramerVisitorInterface { public: + typedef base::TimeTicks (*TimeFunc)(void); + // Defines an interface for producing SpdyIOBuffers. class NET_EXPORT_PRIVATE SpdyIOBufferProducer { public: @@ -132,6 +134,14 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, HttpServerProperties* http_server_properties, bool verify_domain_authentication, bool enable_sending_initial_settings, + bool enable_credential_frames, + bool enable_compression, + bool enable_ping_based_connection_checking, + NextProto default_protocol_, + size_t initial_recv_window_size, + size_t initial_max_concurrent_streams, + size_t max_concurrent_streams_limit, + TimeFunc time_func, const HostPortPair& trusted_spdy_proxy, NetLog* net_log); @@ -249,30 +259,6 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, // if server bound certs are not supported in this session. ServerBoundCertService* GetServerBoundCertService() const; - // Reset all static settings to initialized values. Used to init test suite. - static void ResetStaticSettingsToInit(); - - // Specify the SPDY protocol to be used for SPDY session which do not use NPN - // to negotiate a particular protocol. - static void set_default_protocol(NextProto default_protocol); - - // Sets the max concurrent streams per session, as a ceiling on any server - // specific SETTINGS value. - static void set_max_concurrent_streams(size_t value); - - // Enable sending of PING frame with each request. - static void set_enable_ping_based_connection_checking(bool enable); - - // Enable the sending of CREDENTIAL frames. - static void set_enable_credential_frames(bool enable); - - // The initial max concurrent streams per session, can be overridden by the - // server via SETTINGS. - static void set_init_max_concurrent_streams(size_t value); - - // Sets the initial receive window size for newly created sessions. - static void set_default_initial_recv_window_size(size_t value); - // Send WINDOW_UPDATE frame, called by a stream whenever receive window // size is increased. void SendWindowUpdate(SpdyStreamId stream_id, int32 delta_window_size); @@ -425,8 +411,6 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, CLOSED }; - typedef base::TimeTicks (*TimeFunc)(void); - virtual ~SpdySession(); void ProcessPendingCreateStreams(); @@ -560,8 +544,6 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, // Helper methods for testing // -------------------------- - static TimeFunc set_time_func(TimeFunc new_time_func); - void set_connection_at_risk_of_loss_time(base::TimeDelta duration) { connection_at_risk_of_loss_time_ = duration; } @@ -666,6 +648,7 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, // Limits size_t max_concurrent_streams_; // 0 if no limit + size_t max_concurrent_streams_limit_; // Some statistics counters for the session. int streams_initiated_count_; @@ -717,6 +700,10 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, // Outside of tests, these should always be true. bool verify_domain_authentication_; bool enable_sending_initial_settings_; + bool enable_credential_frames_; + bool enable_compression_; + bool enable_ping_based_connection_checking_; + NextProto default_protocol_; SpdyCredentialState credential_state_; @@ -745,6 +732,8 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>, // This SPDY proxy is allowed to push resources from origins that are // different from those of their associated streams. HostPortPair trusted_spdy_proxy_; + + TimeFunc time_func_; }; } // namespace net diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc index 3c9db1d..a9279d2 100644 --- a/net/spdy/spdy_session_pool.cc +++ b/net/spdy/spdy_session_pool.cc @@ -36,20 +36,41 @@ bool HostPortProxyPairsAreEqual(const HostPortProxyPair& a, // The maximum number of sessions to open to a single domain. static const size_t kMaxSessionsPerDomain = 1; -size_t SpdySessionPool::g_max_sessions_per_domain = kMaxSessionsPerDomain; -bool SpdySessionPool::g_force_single_domain = false; -bool SpdySessionPool::g_enable_ip_pooling = true; - SpdySessionPool::SpdySessionPool( HostResolver* resolver, SSLConfigService* ssl_config_service, HttpServerProperties* http_server_properties, + size_t max_sessions_per_domain, + bool force_single_domain, + bool enable_ip_pooling, + bool enable_credential_frames, + bool enable_compression, + bool enable_ping_based_connection_checking, + NextProto default_protocol, + size_t initial_recv_window_size, + size_t initial_max_concurrent_streams, + size_t max_concurrent_streams_limit, + SpdySessionPool::TimeFunc time_func, const std::string& trusted_spdy_proxy) : http_server_properties_(http_server_properties), ssl_config_service_(ssl_config_service), resolver_(resolver), verify_domain_authentication_(true), enable_sending_initial_settings_(true), + max_sessions_per_domain_(max_sessions_per_domain == 0 ? + kMaxSessionsPerDomain : + max_sessions_per_domain), + force_single_domain_(force_single_domain), + enable_ip_pooling_(enable_ip_pooling), + enable_credential_frames_(enable_credential_frames), + enable_compression_(enable_compression), + enable_ping_based_connection_checking_( + enable_ping_based_connection_checking), + default_protocol_(default_protocol), + initial_recv_window_size_(initial_recv_window_size), + initial_max_concurrent_streams_(initial_max_concurrent_streams), + max_concurrent_streams_limit_(max_concurrent_streams_limit), + time_func_(time_func), trusted_spdy_proxy_( HostPortPair::FromString(trusted_spdy_proxy)) { NetworkChangeNotifier::AddIPAddressObserver(this); @@ -107,7 +128,7 @@ scoped_refptr<SpdySession> SpdySessionPool::GetInternal( } DCHECK(list); - if (list->size() && list->size() == g_max_sessions_per_domain) { + if (list->size() && list->size() == max_sessions_per_domain_) { UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionGet", FOUND_EXISTING, SPDY_SESSION_GET_MAX); @@ -124,6 +145,14 @@ scoped_refptr<SpdySession> SpdySessionPool::GetInternal( http_server_properties_, verify_domain_authentication_, enable_sending_initial_settings_, + enable_credential_frames_, + enable_compression_, + enable_ping_based_connection_checking_, + default_protocol_, + initial_recv_window_size_, + initial_max_concurrent_streams_, + max_concurrent_streams_limit_, + time_func_, trusted_spdy_proxy_, net_log.net_log()); UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionGet", @@ -133,7 +162,7 @@ scoped_refptr<SpdySession> SpdySessionPool::GetInternal( net_log.AddEvent( NetLog::TYPE_SPDY_SESSION_POOL_CREATED_NEW_SESSION, spdy_session->net_log().source().ToEventParametersCallback()); - DCHECK_LE(list->size(), g_max_sessions_per_domain); + DCHECK_LE(list->size(), max_sessions_per_domain_); return spdy_session; } @@ -152,6 +181,14 @@ net::Error SpdySessionPool::GetSpdySessionFromSocket( http_server_properties_, verify_domain_authentication_, enable_sending_initial_settings_, + enable_credential_frames_, + enable_compression_, + enable_ping_based_connection_checking_, + default_protocol_, + initial_recv_window_size_, + initial_max_concurrent_streams_, + max_concurrent_streams_limit_, + time_func_, trusted_spdy_proxy_, net_log.net_log()); SpdySessionList* list = GetSessionList(host_port_proxy_pair); @@ -169,7 +206,7 @@ net::Error SpdySessionPool::GetSpdySessionFromSocket( // potentially be pooled with this one. Because GetPeerAddress() reports the // proxy's address instead of the origin server, check to see if this is a // direct connection. - if (g_enable_ip_pooling && host_port_proxy_pair.second.is_direct()) { + if (enable_ip_pooling_ && host_port_proxy_pair.second.is_direct()) { IPEndPoint address; if (connection->socket()->GetPeerAddress(&address) == OK) AddAlias(address, host_port_proxy_pair); @@ -267,7 +304,7 @@ scoped_refptr<SpdySession> SpdySessionPool::GetFromAlias( // We should only be checking aliases when there is no direct session. DCHECK(!GetSessionList(host_port_proxy_pair)); - if (!g_enable_ip_pooling) + if (!enable_ip_pooling_) return NULL; AddressList addresses; @@ -323,7 +360,7 @@ void SpdySessionPool::OnCertTrustChanged(const X509Certificate* cert) { const HostPortProxyPair& SpdySessionPool::NormalizeListPair( const HostPortProxyPair& host_port_proxy_pair) const { - if (!g_force_single_domain) + if (!force_single_domain_) return host_port_proxy_pair; static HostPortProxyPair* single_domain_pair = NULL; @@ -379,7 +416,7 @@ bool SpdySessionPool::LookupAddresses(const HostPortProxyPair& pair, void SpdySessionPool::AddAlias(const IPEndPoint& endpoint, const HostPortProxyPair& pair) { - DCHECK(g_enable_ip_pooling); + DCHECK(enable_ip_pooling_); aliases_[endpoint] = pair; } diff --git a/net/spdy/spdy_session_pool.h b/net/spdy/spdy_session_pool.h index ebd9668..b77f28b 100644 --- a/net/spdy/spdy_session_pool.h +++ b/net/spdy/spdy_session_pool.h @@ -21,6 +21,7 @@ #include "net/base/ssl_config_service.h" #include "net/proxy/proxy_config.h" #include "net/proxy/proxy_server.h" +#include "net/socket/next_proto.h" namespace net { @@ -45,9 +46,22 @@ class NET_EXPORT SpdySessionPool public SSLConfigService::Observer, public CertDatabase::Observer { public: + typedef base::TimeTicks (*TimeFunc)(void); + SpdySessionPool(HostResolver* host_resolver, SSLConfigService* ssl_config_service, HttpServerProperties* http_server_properties, + size_t max_sessions_per_domain, + bool force_single_domain, + bool enable_ip_pooling, + bool enable_credential_frames, + bool enable_compression, + bool enable_ping_based_connection_checking, + NextProto default_protocol, + size_t default_initial_recv_window_size, + size_t initial_max_concurrent_streams, + size_t max_concurrent_streams_limit, + SpdySessionPool::TimeFunc time_func, const std::string& trusted_spdy_proxy); virtual ~SpdySessionPool(); @@ -62,12 +76,6 @@ class NET_EXPORT SpdySessionPool const HostPortProxyPair& host_port_proxy_pair, const BoundNetLog& net_log); - // Set the maximum concurrent sessions per domain. - static void set_max_sessions_per_domain(int max) { - if (max >= 1) - g_max_sessions_per_domain = max; - } - // Builds a SpdySession from an existing SSL socket. Users should try // calling Get() first to use an existing SpdySession so we don't get // multiple SpdySessions per domain. Note that ownership of |connection| is @@ -126,13 +134,6 @@ class NET_EXPORT SpdySessionPool // We perform the same flushing as described above when SSL settings change. virtual void OnSSLConfigChanged() OVERRIDE; - // A debugging mode where we compress all accesses through a single domain. - static void ForceSingleDomain() { g_force_single_domain = true; } - - // Controls whether the pool allows use of a common session for domains - // which share IP address resolutions. - static void enable_ip_pooling(bool value) { g_enable_ip_pooling = value; } - // CertDatabase::Observer methods: virtual void OnCertAdded(const X509Certificate* cert) OVERRIDE; virtual void OnCertTrustChanged(const X509Certificate* cert) OVERRIDE; @@ -197,17 +198,25 @@ class NET_EXPORT SpdySessionPool // A map of IPEndPoint aliases for sessions. SpdyAliasMap aliases_; - static size_t g_max_sessions_per_domain; static bool g_force_single_domain; - static bool g_enable_ip_pooling; const scoped_refptr<SSLConfigService> ssl_config_service_; HostResolver* const resolver_; // Defaults to true. May be controlled via SpdySessionPoolPeer for tests. bool verify_domain_authentication_; - bool enable_sending_initial_settings_; + size_t max_sessions_per_domain_; + bool force_single_domain_; + bool enable_ip_pooling_; + bool enable_credential_frames_; + bool enable_compression_; + bool enable_ping_based_connection_checking_; + NextProto default_protocol_; + size_t initial_recv_window_size_; + size_t initial_max_concurrent_streams_; + size_t max_concurrent_streams_limit_; + TimeFunc time_func_; // This SPDY proxy is allowed to push resources from origins that are // different from those of their associated streams. diff --git a/net/spdy/spdy_session_spdy2_unittest.cc b/net/spdy/spdy_session_spdy2_unittest.cc index 636defe..17c9c53 100644 --- a/net/spdy/spdy_session_spdy2_unittest.cc +++ b/net/spdy/spdy_session_spdy2_unittest.cc @@ -19,9 +19,9 @@ namespace net { namespace { -base::TimeTicks the_near_future() { - return base::TimeTicks::Now() + - base::TimeDelta::FromSeconds(301); +static int g_delta_seconds = 0; +base::TimeTicks TheNearFuture() { + return base::TimeTicks::Now() + base::TimeDelta::FromSeconds(g_delta_seconds); } class ClosingDelegate : public SpdyStream::Delegate { @@ -57,16 +57,11 @@ class ClosingDelegate : public SpdyStream::Delegate { } // namespace -// TODO(cbentzel): Expose compression setter/getter in public SpdySession -// interface rather than going through all these contortions. class SpdySessionSpdy2Test : public PlatformTest { protected: - virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY2); + void SetUp() { + g_delta_seconds = 0; } - - private: - SpdyTestStateHelper spdy_state_; }; class TestSpdyStreamDelegate : public net::SpdyStream::Delegate { @@ -271,8 +266,6 @@ TEST_F(SpdySessionSpdy2Test, ClientPing) { base::TimeTicks before_ping_time = base::TimeTicks::Now(); - // Enable sending of PING. - SpdySession::set_enable_ping_based_connection_checking(true); session->set_connection_at_risk_of_loss_time(base::TimeDelta::FromSeconds(0)); session->set_hung_interval(base::TimeDelta::FromMilliseconds(50)); @@ -372,6 +365,7 @@ TEST_F(SpdySessionSpdy2Test, DeleteExpiredPushStreams) { SSLSocketDataProvider ssl(SYNCHRONOUS, OK); session_deps.socket_factory->AddSSLSocketDataProvider(&ssl); + session_deps.time_func = TheNearFuture; scoped_refptr<HttpNetworkSession> http_session( SpdySessionDependencies::SpdyCreateSession(&session_deps)); @@ -388,7 +382,7 @@ TEST_F(SpdySessionSpdy2Test, DeleteExpiredPushStreams) { EXPECT_TRUE(spdy_session_pool->HasSession(pair)); // Give the session a SPDY2 framer. - session->buffered_spdy_framer_.reset(new BufferedSpdyFramer(2)); + session->buffered_spdy_framer_.reset(new BufferedSpdyFramer(2, false)); // Create the associated stream and add to active streams. scoped_ptr<SpdyHeaderBlock> request_headers(new SpdyHeaderBlock); @@ -412,7 +406,7 @@ TEST_F(SpdySessionSpdy2Test, DeleteExpiredPushStreams) { EXPECT_TRUE(session->unclaimed_pushed_streams_.end() != iter); // Shift time. - SpdySession::set_time_func(the_near_future); + g_delta_seconds = 301; headers["url"] = "http://www.google.com/b.dat"; session->OnSynStream(4, 1, 0, 0, true, false, headers); @@ -490,8 +484,6 @@ TEST_F(SpdySessionSpdy2Test, FailedPing) { new TestSpdyStreamDelegate(callback1.callback())); spdy_stream1->SetDelegate(delegate.get()); - // Enable sending of PING. - SpdySession::set_enable_ping_based_connection_checking(true); session->set_connection_at_risk_of_loss_time(base::TimeDelta::FromSeconds(0)); session->set_hung_interval(base::TimeDelta::FromSeconds(0)); diff --git a/net/spdy/spdy_session_spdy3_unittest.cc b/net/spdy/spdy_session_spdy3_unittest.cc index e03156d..21fd700 100644 --- a/net/spdy/spdy_session_spdy3_unittest.cc +++ b/net/spdy/spdy_session_spdy3_unittest.cc @@ -21,9 +21,9 @@ namespace net { namespace { -base::TimeTicks the_near_future() { - return base::TimeTicks::Now() + - base::TimeDelta::FromSeconds(301); +static int g_delta_seconds = 0; +base::TimeTicks TheNearFuture() { + return base::TimeTicks::Now() + base::TimeDelta::FromSeconds(g_delta_seconds); } class ClosingDelegate : public SpdyStream::Delegate { @@ -99,17 +99,13 @@ class TestSpdyStreamDelegate : public SpdyStream::Delegate { } // namespace -// TODO(cbentzel): Expose compression setter/getter in public SpdySession -// interface rather than going through all these contortions. class SpdySessionSpdy3Test : public PlatformTest { protected: - virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY3); + void SetUp() { + g_delta_seconds = 0; } - - private: - SpdyTestStateHelper spdy_state_; }; + // Test the SpdyIOBuffer class. TEST_F(SpdySessionSpdy3Test, SpdyIOBuffer) { std::priority_queue<SpdyIOBuffer> queue_; @@ -208,6 +204,7 @@ TEST_F(SpdySessionSpdy3Test, GoAway) { TEST_F(SpdySessionSpdy3Test, ClientPing) { SpdySessionDependencies session_deps; + session_deps.enable_ping = true; session_deps.host_resolver->set_synchronous_mode(true); MockConnect connect_data(SYNCHRONOUS, OK); @@ -272,8 +269,6 @@ TEST_F(SpdySessionSpdy3Test, ClientPing) { base::TimeTicks before_ping_time = base::TimeTicks::Now(); - // Enable sending of PING. - SpdySession::set_enable_ping_based_connection_checking(true); session->set_connection_at_risk_of_loss_time(base::TimeDelta::FromSeconds(0)); session->set_hung_interval(base::TimeDelta::FromMilliseconds(50)); @@ -373,6 +368,7 @@ TEST_F(SpdySessionSpdy3Test, DeleteExpiredPushStreams) { SSLSocketDataProvider ssl(SYNCHRONOUS, OK); session_deps.socket_factory->AddSSLSocketDataProvider(&ssl); + session_deps.time_func = TheNearFuture; scoped_refptr<HttpNetworkSession> http_session( SpdySessionDependencies::SpdyCreateSession(&session_deps)); @@ -389,7 +385,7 @@ TEST_F(SpdySessionSpdy3Test, DeleteExpiredPushStreams) { EXPECT_TRUE(spdy_session_pool->HasSession(pair)); // Give the session a SPDY3 framer. - session->buffered_spdy_framer_.reset(new BufferedSpdyFramer(3)); + session->buffered_spdy_framer_.reset(new BufferedSpdyFramer(3, false)); // Create the associated stream and add to active streams. scoped_ptr<SpdyHeaderBlock> request_headers(new SpdyHeaderBlock); @@ -415,7 +411,7 @@ TEST_F(SpdySessionSpdy3Test, DeleteExpiredPushStreams) { EXPECT_TRUE(session->unclaimed_pushed_streams_.end() != iter); // Shift time. - SpdySession::set_time_func(the_near_future); + g_delta_seconds = 301; headers[":scheme"] = "http"; headers[":host"] = "www.google.com"; @@ -495,8 +491,6 @@ TEST_F(SpdySessionSpdy3Test, FailedPing) { new TestSpdyStreamDelegate(callback1.callback())); spdy_stream1->SetDelegate(delegate.get()); - // Enable sending of PING. - SpdySession::set_enable_ping_based_connection_checking(true); session->set_connection_at_risk_of_loss_time(base::TimeDelta::FromSeconds(0)); session->set_hung_interval(base::TimeDelta::FromSeconds(0)); @@ -867,7 +861,7 @@ TEST_F(SpdySessionSpdy3Test, SendInitialSettingsOnNewSession) { MockWrite writes[] = { CreateMockWrite(*settings_frame), }; - SpdySession::set_default_initial_recv_window_size(kInitialRecvWindowSize); + session_deps.initial_recv_window_size = kInitialRecvWindowSize; StaticSocketDataProvider data( reads, arraysize(reads), writes, arraysize(writes)); diff --git a/net/spdy/spdy_stream_spdy2_unittest.cc b/net/spdy/spdy_stream_spdy2_unittest.cc index 10c24a85..602ff31 100644 --- a/net/spdy/spdy_stream_spdy2_unittest.cc +++ b/net/spdy/spdy_stream_spdy2_unittest.cc @@ -23,7 +23,7 @@ namespace net { namespace { SpdyFrame* ConstructSpdyBodyFrame(const char* data, int length) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); return framer.CreateDataFrame(1, data, length, DATA_FLAG_NONE); } @@ -44,18 +44,11 @@ class SpdyStreamSpdy2Test : public testing::Test { return session; } - virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY2); - } - virtual void TearDown() { MessageLoop::current()->RunUntilIdle(); } scoped_refptr<HttpNetworkSession> session_; - - private: - SpdyTestStateHelper spdy_state_; }; TEST_F(SpdyStreamSpdy2Test, SendDataAfterOpen) { diff --git a/net/spdy/spdy_stream_spdy3_unittest.cc b/net/spdy/spdy_stream_spdy3_unittest.cc index 53a8f9a..3b07ea4 100644 --- a/net/spdy/spdy_stream_spdy3_unittest.cc +++ b/net/spdy/spdy_stream_spdy3_unittest.cc @@ -23,7 +23,7 @@ namespace net { namespace { SpdyFrame* ConstructSpdyBodyFrame(const char* data, int length) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); return framer.CreateDataFrame(1, data, length, DATA_FLAG_NONE); } @@ -44,18 +44,11 @@ class SpdyStreamSpdy3Test : public testing::Test { return session; } - virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY3); - } - virtual void TearDown() { MessageLoop::current()->RunUntilIdle(); } scoped_refptr<HttpNetworkSession> session_; - - private: - SpdyTestStateHelper spdy_state_; }; TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) { diff --git a/net/spdy/spdy_test_util_spdy2.cc b/net/spdy/spdy_test_util_spdy2.cc index 624a248..5f5e017 100644 --- a/net/spdy/spdy_test_util_spdy2.cc +++ b/net/spdy/spdy_test_util_spdy2.cc @@ -170,11 +170,11 @@ int AppendToBuffer(int val, // |buffer| is the buffer we're filling in. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyPacket(const SpdyHeaderInfo& header_info, - const char* const extra_headers[], - int extra_header_count, - const char* const tail[], - int tail_header_count) { - BufferedSpdyFramer framer(2); + const char* const extra_headers[], + int extra_header_count, + const char* const tail[], + int tail_header_count) { + BufferedSpdyFramer framer(2, header_info.compressed); SpdyHeaderBlock headers; // Copy in the extra headers to our map. AppendHeadersToSpdyFrame(extra_headers, extra_header_count, &headers); @@ -213,7 +213,7 @@ SpdyFrame* ConstructSpdyPacket(const SpdyHeaderInfo& header_info, // |settings| are the settings to set. // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdySettings(const SettingsMap& settings) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); return framer.CreateSettings(settings); } @@ -222,21 +222,21 @@ SpdyFrame* ConstructSpdySettings(const SettingsMap& settings) { // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyCredential( const SpdyCredential& credential) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); return framer.CreateCredentialFrame(credential); } // Construct a SPDY PING frame. // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyPing(uint32 ping_id) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); return framer.CreatePingFrame(ping_id); } // Construct a SPDY GOAWAY frame. // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyGoAway() { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); return framer.CreateGoAway(0, GOAWAY_OK); } @@ -244,15 +244,15 @@ SpdyFrame* ConstructSpdyGoAway() { // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyWindowUpdate( const SpdyStreamId stream_id, uint32 delta_window_size) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); return framer.CreateWindowUpdate(stream_id, delta_window_size); } // Construct a SPDY RST_STREAM frame. // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyRstStream(SpdyStreamId stream_id, - SpdyStatusCodes status) { - BufferedSpdyFramer framer(2); + SpdyStatusCodes status) { + BufferedSpdyFramer framer(2, false); return framer.CreateRstStream(stream_id, status); } @@ -297,14 +297,14 @@ int ConstructSpdyHeader(const char* const extra_headers[], } SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], - int extra_header_count, - bool compressed, - int stream_id, - RequestPriority request_priority, - SpdyControlType type, - SpdyControlFlags flags, - const char* const* kHeaders, - int kHeadersSize) { + int extra_header_count, + bool compressed, + int stream_id, + RequestPriority request_priority, + SpdyControlType type, + SpdyControlFlags flags, + const char* const* kHeaders, + int kHeadersSize) { return ConstructSpdyControlFrame(extra_headers, extra_header_count, compressed, @@ -318,15 +318,15 @@ SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], } SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], - int extra_header_count, - bool compressed, - int stream_id, - RequestPriority request_priority, - SpdyControlType type, - SpdyControlFlags flags, - const char* const* kHeaders, - int kHeadersSize, - int associated_stream_id) { + int extra_header_count, + bool compressed, + int stream_id, + RequestPriority request_priority, + SpdyControlType type, + SpdyControlFlags flags, + const char* const* kHeaders, + int kHeadersSize, + int associated_stream_id) { const SpdyHeaderInfo kSynStartHeader = { type, // Kind = Syn stream_id, // Stream ID @@ -335,10 +335,10 @@ SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], // Priority flags, // Control Flags compressed, // Compressed - INVALID, // Status + INVALID, // Status NULL, // Data 0, // Length - DATA_FLAG_NONE // Data Flags + DATA_FLAG_NONE // Data Flags }; return ConstructSpdyPacket(kSynStartHeader, extra_headers, @@ -353,20 +353,20 @@ SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGet(const char* const url, - bool compressed, - int stream_id, - RequestPriority request_priority) { + bool compressed, + int stream_id, + RequestPriority request_priority) { const SpdyHeaderInfo kSynStartHeader = { SYN_STREAM, // Kind = Syn - stream_id, // Stream ID - 0, // Associated stream ID + stream_id, // Stream ID + 0, // Associated stream ID ConvertRequestPriorityToSpdyPriority(request_priority, 2), - // Priority + // Priority CONTROL_FLAG_FIN, // Control Flags - compressed, // Compressed + compressed, // Compressed INVALID, // Status - NULL, // Data - 0, // Length + NULL, // Data + 0, // Length DATA_FLAG_NONE // Data Flags }; @@ -392,10 +392,10 @@ SpdyFrame* ConstructSpdyGet(const char* const url, // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], - int extra_header_count, - bool compressed, - int stream_id, - RequestPriority request_priority) { + int extra_header_count, + bool compressed, + int stream_id, + RequestPriority request_priority) { return ConstructSpdyGet(extra_headers, extra_header_count, compressed, stream_id, request_priority, true); } @@ -405,22 +405,17 @@ SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], - int extra_header_count, - bool compressed, - int stream_id, - RequestPriority request_priority, - bool direct) { + int extra_header_count, + bool compressed, + int stream_id, + RequestPriority request_priority, + bool direct) { const char* const kStandardGetHeaders[] = { - "method", - "GET", - "url", - (direct ? "/" : "http://www.google.com/"), - "host", - "www.google.com", - "scheme", - "http", - "version", - "HTTP/1.1" + "method", "GET", + "url", (direct ? "/" : "http://www.google.com/"), + "host", "www.google.com", + "scheme", "http", + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -435,8 +430,8 @@ SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. SpdyFrame* ConstructSpdyConnect(const char* const extra_headers[], - int extra_header_count, - int stream_id) { + int extra_header_count, + int stream_id) { const char* const kConnectHeaders[] = { "method", "CONNECT", "url", "www.google.com:443", @@ -459,16 +454,13 @@ SpdyFrame* ConstructSpdyConnect(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], - int extra_header_count, - int stream_id, - int associated_stream_id) { + int extra_header_count, + int stream_id, + int associated_stream_id) { const char* const kStandardGetHeaders[] = { - "hello", - "bye", - "status", - "200", - "version", - "HTTP/1.1" + "hello", "bye", + "status", "200", + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -483,19 +475,15 @@ SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], } SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], - int extra_header_count, - int stream_id, - int associated_stream_id, - const char* url) { + int extra_header_count, + int stream_id, + int associated_stream_id, + const char* url) { const char* const kStandardGetHeaders[] = { - "hello", - "bye", - "status", - "200 OK", - "url", - url, - "version", - "HTTP/1.1" + "hello", "bye", + "status", "200 OK", + "url", url, + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -510,23 +498,18 @@ SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], } SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], - int extra_header_count, - int stream_id, - int associated_stream_id, - const char* url, - const char* status, - const char* location) { + int extra_header_count, + int stream_id, + int associated_stream_id, + const char* url, + const char* status, + const char* location) { const char* const kStandardGetHeaders[] = { - "hello", - "bye", - "status", - status, - "location", - location, - "url", - url, - "version", - "HTTP/1.1" + "hello", "bye", + "status", status, + "location", location, + "url", url, + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -541,11 +524,10 @@ SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], } SpdyFrame* ConstructSpdyPush(int stream_id, - int associated_stream_id, - const char* url) { + int associated_stream_id, + const char* url) { const char* const kStandardGetHeaders[] = { - "url", - url + "url", url }; return ConstructSpdyControlFrame(0, 0, @@ -560,13 +542,11 @@ SpdyFrame* ConstructSpdyPush(int stream_id, } SpdyFrame* ConstructSpdyPushHeaders(int stream_id, - const char* const extra_headers[], - int extra_header_count) { + const char* const extra_headers[], + int extra_header_count) { const char* const kStandardGetHeaders[] = { - "status", - "200 OK", - "version", - "HTTP/1.1" + "status", "200 OK", + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -581,18 +561,14 @@ SpdyFrame* ConstructSpdyPushHeaders(int stream_id, // Constructs a standard SPDY SYN_REPLY packet with the specified status code. // Returns a SpdyFrame. -SpdyFrame* ConstructSpdySynReplyError( - const char* const status, - const char* const* const extra_headers, - int extra_header_count, - int stream_id) { +SpdyFrame* ConstructSpdySynReplyError(const char* const status, + const char* const* const extra_headers, + int extra_header_count, + int stream_id) { const char* const kStandardGetHeaders[] = { - "hello", - "bye", - "status", - status, - "version", - "HTTP/1.1" + "hello", "bye", + "status", status, + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -611,8 +587,7 @@ SpdyFrame* ConstructSpdySynReplyError( // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGetSynReplyRedirect(int stream_id) { static const char* const kExtraHeaders[] = { - "location", - "http://www.foo.com/index.php", + "location", "http://www.foo.com/index.php", }; return ConstructSpdySynReplyError("301 Moved Permanently", kExtraHeaders, arraysize(kExtraHeaders)/2, stream_id); @@ -625,23 +600,17 @@ SpdyFrame* ConstructSpdySynReplyError(int stream_id) { return ConstructSpdySynReplyError("500 Internal Server Error", NULL, 0, 1); } - - - // Constructs a standard SPDY SYN_REPLY packet to match the SPDY GET. // |extra_headers| are the extra header-value pairs, which typically // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGetSynReply(const char* const extra_headers[], - int extra_header_count, - int stream_id) { + int extra_header_count, + int stream_id) { static const char* const kStandardGetHeaders[] = { - "hello", - "bye", - "status", - "200", - "version", - "HTTP/1.1" + "hello", "bye", + "status", "200", + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -660,22 +629,16 @@ SpdyFrame* ConstructSpdyGetSynReply(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyPost(int64 content_length, - const char* const extra_headers[], - int extra_header_count) { + const char* const extra_headers[], + int extra_header_count) { std::string length_str = base::Int64ToString(content_length); const char* post_headers[] = { - "method", - "POST", - "url", - "/", - "host", - "www.google.com", - "scheme", - "http", - "version", - "HTTP/1.1", - "content-length", - length_str.c_str() + "method", "POST", + "url", "/", + "host", "www.google.com", + "scheme", "http", + "version", "HTTP/1.1", + "content-length", length_str.c_str() }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -693,18 +656,13 @@ SpdyFrame* ConstructSpdyPost(int64 content_length, // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructChunkedSpdyPost(const char* const extra_headers[], - int extra_header_count) { + int extra_header_count) { const char* post_headers[] = { - "method", - "POST", - "url", - "/", - "host", - "www.google.com", - "scheme", - "http", - "version", - "HTTP/1.1" + "method", "POST", + "url", "/", + "host", "www.google.com", + "scheme", "http", + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -722,16 +680,12 @@ SpdyFrame* ConstructChunkedSpdyPost(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyPostSynReply(const char* const extra_headers[], - int extra_header_count) { + int extra_header_count) { static const char* const kStandardGetHeaders[] = { - "hello", - "bye", - "status", - "200", - "url", - "/index.php", - "version", - "HTTP/1.1" + "hello", "bye", + "status", "200", + "url", "/index.php", + "version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -746,7 +700,7 @@ SpdyFrame* ConstructSpdyPostSynReply(const char* const extra_headers[], // Constructs a single SPDY data frame with the default contents. SpdyFrame* ConstructSpdyBodyFrame(int stream_id, bool fin) { - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); return framer.CreateDataFrame( stream_id, kUploadData, kUploadDataSize, fin ? DATA_FLAG_FIN : DATA_FLAG_NONE); @@ -754,16 +708,15 @@ SpdyFrame* ConstructSpdyBodyFrame(int stream_id, bool fin) { // Constructs a single SPDY data frame with the given content. SpdyFrame* ConstructSpdyBodyFrame(int stream_id, const char* data, - uint32 len, bool fin) { - BufferedSpdyFramer framer(2); + uint32 len, bool fin) { + BufferedSpdyFramer framer(2, false); return framer.CreateDataFrame( stream_id, data, len, fin ? DATA_FLAG_FIN : DATA_FLAG_NONE); } // Wraps |frame| in the payload of a data frame in stream |stream_id|. -SpdyFrame* ConstructWrappedSpdyFrame( - const scoped_ptr<SpdyFrame>& frame, - int stream_id) { +SpdyFrame* ConstructWrappedSpdyFrame(const scoped_ptr<SpdyFrame>& frame, + int stream_id) { return ConstructSpdyBodyFrame(stream_id, frame->data(), frame->length() + SpdyFrame::kHeaderSize, false); @@ -906,6 +859,10 @@ SpdySessionDependencies::SpdySessionDependencies() deterministic_socket_factory(new DeterministicMockClientSocketFactory), http_auth_handler_factory( HttpAuthHandlerFactory::CreateDefault(host_resolver.get())), + enable_ip_pooling(true), + enable_compression(false), + enable_ping(false), + time_func(&base::TimeTicks::Now), net_log(NULL) { // Note: The CancelledTransaction test does cleanup by running all // tasks in the message loop (RunAllPending). Unfortunately, that @@ -925,6 +882,10 @@ SpdySessionDependencies::SpdySessionDependencies(ProxyService* proxy_service) deterministic_socket_factory(new DeterministicMockClientSocketFactory), http_auth_handler_factory( HttpAuthHandlerFactory::CreateDefault(host_resolver.get())), + enable_ip_pooling(true), + enable_compression(false), + enable_ping(false), + time_func(&base::TimeTicks::Now), net_log(NULL) {} SpdySessionDependencies::~SpdySessionDependencies() {} @@ -963,6 +924,11 @@ net::HttpNetworkSession::Params SpdySessionDependencies::CreateSessionParams( params.http_auth_handler_factory = session_deps->http_auth_handler_factory.get(); params.http_server_properties = &session_deps->http_server_properties; + params.enable_spdy_ip_pooling = session_deps->enable_ip_pooling; + params.enable_spdy_compression = session_deps->enable_compression; + params.enable_spdy_ping_based_connection_checking = session_deps->enable_ping; + params.spdy_default_protocol = kProtoSPDY2; + params.time_func = session_deps->time_func; params.trusted_spdy_proxy = session_deps->trusted_spdy_proxy; params.net_log = session_deps->net_log; return params; @@ -985,6 +951,9 @@ SpdyURLRequestContext::SpdyURLRequestContext() params.ssl_config_service = ssl_config_service(); params.http_auth_handler_factory = http_auth_handler_factory(); params.network_delegate = network_delegate(); + params.enable_spdy_compression = false; + params.enable_spdy_ping_based_connection_checking = false; + params.spdy_default_protocol = kProtoSPDY2; params.http_server_properties = http_server_properties(); scoped_refptr<HttpNetworkSession> network_session( new HttpNetworkSession(params)); @@ -1014,19 +983,5 @@ const SpdyHeaderInfo MakeSpdyHeader(SpdyControlType type) { return kHeader; } -SpdyTestStateHelper::SpdyTestStateHelper() { - // Pings can be non-deterministic, because they are sent via timer. - SpdySession::set_enable_ping_based_connection_checking(false); - // Compression is per-session which makes it impossible to create - // SPDY frames with static methods. - BufferedSpdyFramer::set_enable_compression_default(false); -} - -SpdyTestStateHelper::~SpdyTestStateHelper() { - SpdySession::ResetStaticSettingsToInit(); - // TODO(rch): save/restore this value - BufferedSpdyFramer::set_enable_compression_default(true); -} - } // namespace test_spdy2 } // namespace net diff --git a/net/spdy/spdy_test_util_spdy2.h b/net/spdy/spdy_test_util_spdy2.h index 7be9ec1..1a9be94 100644 --- a/net/spdy/spdy_test_util_spdy2.h +++ b/net/spdy/spdy_test_util_spdy2.h @@ -19,6 +19,7 @@ #include "net/http/http_transaction_factory.h" #include "net/proxy/proxy_service.h" #include "net/socket/socket_test_util.h" +#include "net/spdy/spdy_session.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_storage.h" @@ -364,6 +365,10 @@ struct SpdySessionDependencies { scoped_ptr<DeterministicMockClientSocketFactory> deterministic_socket_factory; scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory; HttpServerPropertiesImpl http_server_properties; + bool enable_ip_pooling; + bool enable_compression; + bool enable_ping; + SpdySession::TimeFunc time_func; std::string trusted_spdy_proxy; NetLog* net_log; }; @@ -413,16 +418,6 @@ class SpdySessionPoolPeer { DISALLOW_COPY_AND_ASSIGN(SpdySessionPoolPeer); }; -// Helper to manage the state of a number of SPDY global variables. -class SpdyTestStateHelper { - public: - SpdyTestStateHelper(); - ~SpdyTestStateHelper(); - - private: - DISALLOW_COPY_AND_ASSIGN(SpdyTestStateHelper); -}; - } // namespace test_spdy2 } // namespace net diff --git a/net/spdy/spdy_test_util_spdy3.cc b/net/spdy/spdy_test_util_spdy3.cc index 1585906..79d8100 100644 --- a/net/spdy/spdy_test_util_spdy3.cc +++ b/net/spdy/spdy_test_util_spdy3.cc @@ -10,8 +10,6 @@ #include "base/compiler_specific.h" #include "base/string_number_conversions.h" #include "base/string_util.h" -#include "crypto/ec_private_key.h" -#include "crypto/ec_signature_creator.h" #include "net/base/mock_cert_verifier.h" #include "net/http/http_network_session.h" #include "net/http/http_network_transaction.h" @@ -40,57 +38,50 @@ void ParseUrl(const char* const url, std::string* scheme, std::string* host, } } -// An ECSignatureCreator that returns deterministic signatures. -class MockECSignatureCreator : public crypto::ECSignatureCreator { - public: - explicit MockECSignatureCreator(crypto::ECPrivateKey* key) : key_(key) {} - - virtual bool Sign(const uint8* data, - int data_len, - std::vector<uint8>* signature) OVERRIDE { - std::vector<uint8> private_key_value; - key_->ExportValue(&private_key_value); - std::string head = "fakesignature"; - std::string tail = "/fakesignature"; - - signature->clear(); - signature->insert(signature->end(), head.begin(), head.end()); - signature->insert(signature->end(), private_key_value.begin(), - private_key_value.end()); - signature->insert(signature->end(), '-'); - signature->insert(signature->end(), data, data + data_len); - signature->insert(signature->end(), tail.begin(), tail.end()); - return true; - } +} // namespace - virtual bool DecodeSignature(const std::vector<uint8>& signature, - std::vector<uint8>* out_raw_sig) { - *out_raw_sig = signature; - return true; - } - private: - crypto::ECPrivateKey* key_; +MockECSignatureCreator::MockECSignatureCreator(crypto::ECPrivateKey* key) + : key_(key) { +} - DISALLOW_COPY_AND_ASSIGN(MockECSignatureCreator); -}; +bool MockECSignatureCreator::Sign(const uint8* data, + int data_len, + std::vector<uint8>* signature) { + std::vector<uint8> private_key_value; + key_->ExportValue(&private_key_value); + std::string head = "fakesignature"; + std::string tail = "/fakesignature"; + + signature->clear(); + signature->insert(signature->end(), head.begin(), head.end()); + signature->insert(signature->end(), private_key_value.begin(), + private_key_value.end()); + signature->insert(signature->end(), '-'); + signature->insert(signature->end(), data, data + data_len); + signature->insert(signature->end(), tail.begin(), tail.end()); + return true; +} -// An ECSignatureCreatorFactory creates MockECSignatureCreator. -class MockECSignatureCreatorFactory : public crypto::ECSignatureCreatorFactory { - public: - MockECSignatureCreatorFactory() {} - virtual ~MockECSignatureCreatorFactory() {} +bool MockECSignatureCreator::DecodeSignature( + const std::vector<uint8>& signature, + std::vector<uint8>* out_raw_sig) { + *out_raw_sig = signature; + return true; +} - virtual crypto::ECSignatureCreator* Create( - crypto::ECPrivateKey* key) OVERRIDE { - return new MockECSignatureCreator(key); - } +MockECSignatureCreatorFactory::MockECSignatureCreatorFactory() { + crypto::ECSignatureCreator::SetFactoryForTesting(this); +} - private: - DISALLOW_COPY_AND_ASSIGN(MockECSignatureCreatorFactory); -}; +MockECSignatureCreatorFactory::~MockECSignatureCreatorFactory() { + crypto::ECSignatureCreator::SetFactoryForTesting(NULL); +} -} // namespace +crypto::ECSignatureCreator* MockECSignatureCreatorFactory::Create( + crypto::ECPrivateKey* key) { + return new MockECSignatureCreator(key); +} // Chop a frame into an array of MockWrites. // |data| is the frame to chop. @@ -223,11 +214,11 @@ int AppendToBuffer(int val, // |buffer| is the buffer we're filling in. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyPacket(const SpdyHeaderInfo& header_info, - const char* const extra_headers[], - int extra_header_count, - const char* const tail[], - int tail_header_count) { - BufferedSpdyFramer framer(3); + const char* const extra_headers[], + int extra_header_count, + const char* const tail[], + int tail_header_count) { + BufferedSpdyFramer framer(3, header_info.compressed); SpdyHeaderBlock headers; // Copy in the extra headers to our map. AppendHeadersToSpdyFrame(extra_headers, extra_header_count, &headers); @@ -267,7 +258,7 @@ SpdyFrame* ConstructSpdyPacket(const SpdyHeaderInfo& header_info, // |settings| are the settings to set. // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdySettings(const SettingsMap& settings) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); return framer.CreateSettings(settings); } @@ -276,21 +267,21 @@ SpdyFrame* ConstructSpdySettings(const SettingsMap& settings) { // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyCredential( const SpdyCredential& credential) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); return framer.CreateCredentialFrame(credential); } // Construct a SPDY PING frame. // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyPing(uint32 ping_id) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); return framer.CreatePingFrame(ping_id); } // Construct a SPDY GOAWAY frame. // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyGoAway() { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); return framer.CreateGoAway(0, GOAWAY_OK); } @@ -298,15 +289,15 @@ SpdyFrame* ConstructSpdyGoAway() { // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyWindowUpdate( const SpdyStreamId stream_id, uint32 delta_window_size) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); return framer.CreateWindowUpdate(stream_id, delta_window_size); } // Construct a SPDY RST_STREAM frame. // Returns the constructed frame. The caller takes ownership of the frame. SpdyFrame* ConstructSpdyRstStream(SpdyStreamId stream_id, - SpdyStatusCodes status) { - BufferedSpdyFramer framer(3); + SpdyStatusCodes status) { + BufferedSpdyFramer framer(3, false); return framer.CreateRstStream(stream_id, status); } @@ -351,14 +342,14 @@ int ConstructSpdyHeader(const char* const extra_headers[], } SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], - int extra_header_count, - bool compressed, - int stream_id, - RequestPriority request_priority, - SpdyControlType type, - SpdyControlFlags flags, - const char* const* kHeaders, - int kHeadersSize) { + int extra_header_count, + bool compressed, + int stream_id, + RequestPriority request_priority, + SpdyControlType type, + SpdyControlFlags flags, + const char* const* kHeaders, + int kHeadersSize) { return ConstructSpdyControlFrame(extra_headers, extra_header_count, compressed, @@ -372,15 +363,15 @@ SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], } SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], - int extra_header_count, - bool compressed, - int stream_id, - RequestPriority request_priority, - SpdyControlType type, - SpdyControlFlags flags, - const char* const* kHeaders, - int kHeadersSize, - int associated_stream_id) { + int extra_header_count, + bool compressed, + int stream_id, + RequestPriority request_priority, + SpdyControlType type, + SpdyControlFlags flags, + const char* const* kHeaders, + int kHeadersSize, + int associated_stream_id) { const SpdyHeaderInfo kSynStartHeader = { type, // Kind = Syn stream_id, // Stream ID @@ -390,10 +381,10 @@ SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], 0, // Credential Slot flags, // Control Flags compressed, // Compressed - INVALID, // Status + INVALID, // Status NULL, // Data 0, // Length - DATA_FLAG_NONE // Data Flags + DATA_FLAG_NONE // Data Flags }; return ConstructSpdyPacket(kSynStartHeader, extra_headers, @@ -408,22 +399,22 @@ SpdyFrame* ConstructSpdyControlFrame(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGet(const char* const url, - bool compressed, - int stream_id, - RequestPriority request_priority) { + bool compressed, + int stream_id, + RequestPriority request_priority) { const SpdyHeaderInfo kSynStartHeader = { - SYN_STREAM, // Kind = Syn + SYN_STREAM, // Kind = Syn stream_id, // Stream ID 0, // Associated stream ID ConvertRequestPriorityToSpdyPriority(request_priority, 3), // Priority 0, // Credential Slot - CONTROL_FLAG_FIN, // Control Flags + CONTROL_FLAG_FIN, // Control Flags compressed, // Compressed - INVALID, // Status + INVALID, // Status NULL, // Data 0, // Length - DATA_FLAG_NONE // Data Flags + DATA_FLAG_NONE // Data Flags }; std::string scheme, host, path; @@ -448,10 +439,10 @@ SpdyFrame* ConstructSpdyGet(const char* const url, // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], - int extra_header_count, - bool compressed, - int stream_id, - RequestPriority request_priority) { + int extra_header_count, + bool compressed, + int stream_id, + RequestPriority request_priority) { return ConstructSpdyGet(extra_headers, extra_header_count, compressed, stream_id, request_priority, true); } @@ -461,22 +452,17 @@ SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], - int extra_header_count, - bool compressed, - int stream_id, - RequestPriority request_priority, - bool direct) { + int extra_header_count, + bool compressed, + int stream_id, + RequestPriority request_priority, + bool direct) { const char* const kStandardGetHeaders[] = { - ":method", - "GET", - ":host", - "www.google.com", - ":scheme", - "http", - ":version", - "HTTP/1.1", - ":path", - (direct ? "/" : "/") + ":method", "GET", + ":host", "www.google.com", + ":scheme", "http", + ":version", "HTTP/1.1", + ":path", (direct ? "/" : "/") }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -491,8 +477,8 @@ SpdyFrame* ConstructSpdyGet(const char* const extra_headers[], // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. SpdyFrame* ConstructSpdyConnect(const char* const extra_headers[], - int extra_header_count, - int stream_id) { + int extra_header_count, + int stream_id) { const char* const kConnectHeaders[] = { ":method", "CONNECT", ":path", "www.google.com:443", @@ -515,9 +501,9 @@ SpdyFrame* ConstructSpdyConnect(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], - int extra_header_count, - int stream_id, - int associated_stream_id) { + int extra_header_count, + int stream_id, + int associated_stream_id) { const char* const kStandardPushHeaders[] = { "hello", "bye", ":status", "200", @@ -536,10 +522,10 @@ SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], } SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], - int extra_header_count, - int stream_id, - int associated_stream_id, - const char* url) { + int extra_header_count, + int stream_id, + int associated_stream_id, + const char* url) { std::string scheme, host, path; ParseUrl(url, &scheme, &host, &path); const char* const headers[] = { @@ -563,12 +549,12 @@ SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], } SpdyFrame* ConstructSpdyPush(const char* const extra_headers[], - int extra_header_count, - int stream_id, - int associated_stream_id, - const char* url, - const char* status, - const char* location) { + int extra_header_count, + int stream_id, + int associated_stream_id, + const char* url, + const char* status, + const char* location) { std::string scheme, host, path; ParseUrl(url, &scheme, &host, &path); const char* const headers[] = { @@ -596,10 +582,8 @@ SpdyFrame* ConstructSpdyPushHeaders(int stream_id, const char* const extra_headers[], int extra_header_count) { const char* const kStandardGetHeaders[] = { - ":status", - "200 OK", - ":version", - "HTTP/1.1" + ":status", "200 OK", + ":version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -614,18 +598,14 @@ SpdyFrame* ConstructSpdyPushHeaders(int stream_id, // Constructs a standard SPDY SYN_REPLY packet with the specified status code. // Returns a SpdyFrame. -SpdyFrame* ConstructSpdySynReplyError( - const char* const status, - const char* const* const extra_headers, - int extra_header_count, - int stream_id) { +SpdyFrame* ConstructSpdySynReplyError(const char* const status, + const char* const* const extra_headers, + int extra_header_count, + int stream_id) { const char* const kStandardGetHeaders[] = { - "hello", - "bye", - ":status", - status, - ":version", - "HTTP/1.1" + "hello", "bye", + ":status", status, + ":version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -644,8 +624,7 @@ SpdyFrame* ConstructSpdySynReplyError( // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGetSynReplyRedirect(int stream_id) { static const char* const kExtraHeaders[] = { - "location", - "http://www.foo.com/index.php", + "location", "http://www.foo.com/index.php", }; return ConstructSpdySynReplyError("301 Moved Permanently", kExtraHeaders, arraysize(kExtraHeaders)/2, stream_id); @@ -666,15 +645,12 @@ SpdyFrame* ConstructSpdySynReplyError(int stream_id) { // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyGetSynReply(const char* const extra_headers[], - int extra_header_count, - int stream_id) { + int extra_header_count, + int stream_id) { static const char* const kStandardGetHeaders[] = { - "hello", - "bye", - ":status", - "200", - ":version", - "HTTP/1.1" + "hello", "bye", + ":status", "200", + ":version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -693,22 +669,16 @@ SpdyFrame* ConstructSpdyGetSynReply(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyPost(int64 content_length, - const char* const extra_headers[], - int extra_header_count) { + const char* const extra_headers[], + int extra_header_count) { std::string length_str = base::Int64ToString(content_length); const char* post_headers[] = { - ":method", - "POST", - ":path", - "/", - ":host", - "www.google.com", - ":scheme", - "http", - ":version", - "HTTP/1.1", - "content-length", - length_str.c_str() + ":method", "POST", + ":path", "/", + ":host", "www.google.com", + ":scheme", "http", + ":version", "HTTP/1.1", + "content-length", length_str.c_str() }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -726,18 +696,13 @@ SpdyFrame* ConstructSpdyPost(int64 content_length, // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructChunkedSpdyPost(const char* const extra_headers[], - int extra_header_count) { + int extra_header_count) { const char* post_headers[] = { - ":method", - "POST", - ":path", - "/", - ":host", - "www.google.com", - ":scheme", - "http", - ":version", - "HTTP/1.1" + ":method", "POST", + ":path", "/", + ":host", "www.google.com", + ":scheme", "http", + ":version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -755,16 +720,12 @@ SpdyFrame* ConstructChunkedSpdyPost(const char* const extra_headers[], // will vary the most between calls. // Returns a SpdyFrame. SpdyFrame* ConstructSpdyPostSynReply(const char* const extra_headers[], - int extra_header_count) { + int extra_header_count) { static const char* const kStandardGetHeaders[] = { - "hello", - "bye", - ":status", - "200", - "url", - "/index.php", - ":version", - "HTTP/1.1" + "hello", "bye", + ":status", "200", + "url", "/index.php", + ":version", "HTTP/1.1" }; return ConstructSpdyControlFrame(extra_headers, extra_header_count, @@ -779,7 +740,7 @@ SpdyFrame* ConstructSpdyPostSynReply(const char* const extra_headers[], // Constructs a single SPDY data frame with the default contents. SpdyFrame* ConstructSpdyBodyFrame(int stream_id, bool fin) { - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); return framer.CreateDataFrame( stream_id, kUploadData, kUploadDataSize, fin ? DATA_FLAG_FIN : DATA_FLAG_NONE); @@ -787,16 +748,15 @@ SpdyFrame* ConstructSpdyBodyFrame(int stream_id, bool fin) { // Constructs a single SPDY data frame with the given content. SpdyFrame* ConstructSpdyBodyFrame(int stream_id, const char* data, - uint32 len, bool fin) { - BufferedSpdyFramer framer(3); + uint32 len, bool fin) { + BufferedSpdyFramer framer(3, false); return framer.CreateDataFrame( stream_id, data, len, fin ? DATA_FLAG_FIN : DATA_FLAG_NONE); } // Wraps |frame| in the payload of a data frame in stream |stream_id|. -SpdyFrame* ConstructWrappedSpdyFrame( - const scoped_ptr<SpdyFrame>& frame, - int stream_id) { +SpdyFrame* ConstructWrappedSpdyFrame(const scoped_ptr<SpdyFrame>& frame, + int stream_id) { return ConstructSpdyBodyFrame(stream_id, frame->data(), frame->length() + SpdyFrame::kHeaderSize, false); @@ -941,6 +901,11 @@ SpdySessionDependencies::SpdySessionDependencies() deterministic_socket_factory(new DeterministicMockClientSocketFactory), http_auth_handler_factory( HttpAuthHandlerFactory::CreateDefault(host_resolver.get())), + enable_ip_pooling(true), + enable_compression(false), + enable_ping(false), + initial_recv_window_size(kSpdyStreamInitialWindowSize), + time_func(&base::TimeTicks::Now), net_log(NULL) { // Note: The CancelledTransaction test does cleanup by running all // tasks in the message loop (RunAllPending). Unfortunately, that @@ -960,6 +925,11 @@ SpdySessionDependencies::SpdySessionDependencies(ProxyService* proxy_service) deterministic_socket_factory(new DeterministicMockClientSocketFactory), http_auth_handler_factory( HttpAuthHandlerFactory::CreateDefault(host_resolver.get())), + enable_ip_pooling(true), + enable_compression(false), + enable_ping(false), + initial_recv_window_size(kSpdyStreamInitialWindowSize), + time_func(&base::TimeTicks::Now), net_log(NULL) {} SpdySessionDependencies::~SpdySessionDependencies() {} @@ -998,6 +968,11 @@ net::HttpNetworkSession::Params SpdySessionDependencies::CreateSessionParams( params.http_auth_handler_factory = session_deps->http_auth_handler_factory.get(); params.http_server_properties = &session_deps->http_server_properties; + params.enable_spdy_compression = session_deps->enable_compression; + params.enable_spdy_ping_based_connection_checking = session_deps->enable_ping; + params.spdy_default_protocol = kProtoSPDY3; + params.spdy_initial_recv_window_size = session_deps->initial_recv_window_size; + params.time_func = session_deps->time_func; params.trusted_spdy_proxy = session_deps->trusted_spdy_proxy; params.net_log = session_deps->net_log; return params; @@ -1020,6 +995,9 @@ SpdyURLRequestContext::SpdyURLRequestContext() params.ssl_config_service = ssl_config_service(); params.http_auth_handler_factory = http_auth_handler_factory(); params.network_delegate = network_delegate(); + params.enable_spdy_compression = false; + params.enable_spdy_ping_based_connection_checking = false; + params.spdy_default_protocol = kProtoSPDY3; params.http_server_properties = http_server_properties(); scoped_refptr<HttpNetworkSession> network_session( new HttpNetworkSession(params)); @@ -1050,29 +1028,6 @@ const SpdyHeaderInfo MakeSpdyHeader(SpdyControlType type) { return kHeader; } -SpdyTestStateHelper::SpdyTestStateHelper() - : ec_signature_creator_factory_(new MockECSignatureCreatorFactory()) { - // Use the mock signature creator. - crypto::ECSignatureCreator::SetFactoryForTesting( - ec_signature_creator_factory_.get()); - // Pings can be non-deterministic, because they are sent via timer. - SpdySession::set_enable_ping_based_connection_checking(false); - // Avoid sending a non-default initial receive window size settings - // frame on every test. - SpdySession::set_default_initial_recv_window_size( - kSpdyStreamInitialWindowSize); - // Compression is per-session which makes it impossible to create - // SPDY frames with static methods. - BufferedSpdyFramer::set_enable_compression_default(false); -} - -SpdyTestStateHelper::~SpdyTestStateHelper() { - SpdySession::ResetStaticSettingsToInit(); - // TODO(rch): save/restore this value - BufferedSpdyFramer::set_enable_compression_default(true); - crypto::ECSignatureCreator::SetFactoryForTesting(NULL); -} - } // namespace test_spdy3 } // namespace net diff --git a/net/spdy/spdy_test_util_spdy3.h b/net/spdy/spdy_test_util_spdy3.h index d0a806a..5103c89 100644 --- a/net/spdy/spdy_test_util_spdy3.h +++ b/net/spdy/spdy_test_util_spdy3.h @@ -7,6 +7,8 @@ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" +#include "crypto/ec_private_key.h" +#include "crypto/ec_signature_creator.h" #include "net/base/cert_verifier.h" #include "net/base/host_port_pair.h" #include "net/base/mock_host_resolver.h" @@ -20,6 +22,7 @@ #include "net/http/http_transaction_factory.h" #include "net/proxy/proxy_service.h" #include "net/socket/socket_test_util.h" +#include "net/spdy/spdy_session.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_storage.h" @@ -53,6 +56,38 @@ struct SpdyHeaderInfo { SpdyDataFlags data_flags; }; +// An ECSignatureCreator that returns deterministic signatures. +class MockECSignatureCreator : public crypto::ECSignatureCreator { + public: + explicit MockECSignatureCreator(crypto::ECPrivateKey* key); + + // crypto::ECSignatureCreator + virtual bool Sign(const uint8* data, + int data_len, + std::vector<uint8>* signature) OVERRIDE; + virtual bool DecodeSignature(const std::vector<uint8>& signature, + std::vector<uint8>* out_raw_sig) OVERRIDE; + + private: + crypto::ECPrivateKey* key_; + + DISALLOW_COPY_AND_ASSIGN(MockECSignatureCreator); +}; + +// An ECSignatureCreatorFactory creates MockECSignatureCreator. +class MockECSignatureCreatorFactory : public crypto::ECSignatureCreatorFactory { + public: + MockECSignatureCreatorFactory(); + virtual ~MockECSignatureCreatorFactory(); + + // crypto::ECSignatureCreatorFactory + virtual crypto::ECSignatureCreator* Create( + crypto::ECPrivateKey* key) OVERRIDE; + + private: + DISALLOW_COPY_AND_ASSIGN(MockECSignatureCreatorFactory); +}; + // Chop a frame into an array of MockWrites. // |data| is the frame to chop. // |length| is the length of the frame to chop. @@ -370,6 +405,11 @@ struct SpdySessionDependencies { scoped_ptr<DeterministicMockClientSocketFactory> deterministic_socket_factory; scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory; HttpServerPropertiesImpl http_server_properties; + bool enable_ip_pooling; + bool enable_compression; + bool enable_ping; + size_t initial_recv_window_size; + SpdySession::TimeFunc time_func; std::string trusted_spdy_proxy; NetLog* net_log; }; @@ -419,21 +459,6 @@ class SpdySessionPoolPeer { DISALLOW_COPY_AND_ASSIGN(SpdySessionPoolPeer); }; -// Helper to manage the state of a number of SPDY global variables. -class SpdyTestStateHelper { - public: - SpdyTestStateHelper(); - ~SpdyTestStateHelper(); - - private: - // In order to make CREDENTIAL frame creation deterministic, we need to - // use a mock EC signature creator, which needs to live throughout - // the life of the test. - scoped_ptr<crypto::ECSignatureCreatorFactory> ec_signature_creator_factory_; - - DISALLOW_COPY_AND_ASSIGN(SpdyTestStateHelper); -}; - } // namespace test_spdy3 } // namespace net diff --git a/net/spdy/spdy_websocket_stream_spdy2_unittest.cc b/net/spdy/spdy_websocket_stream_spdy2_unittest.cc index 1835d42..20b7217 100644 --- a/net/spdy/spdy_websocket_stream_spdy2_unittest.cc +++ b/net/spdy/spdy_websocket_stream_spdy2_unittest.cc @@ -185,8 +185,6 @@ class SpdyWebSocketStreamSpdy2Test : public testing::Test { virtual ~SpdyWebSocketStreamSpdy2Test() {} virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY2); - host_port_pair_.set_host("example.com"); host_port_pair_.set_port(80); host_port_proxy_pair_.first = host_port_pair_; @@ -301,9 +299,6 @@ class SpdyWebSocketStreamSpdy2Test : public testing::Test { static const char kClosingFrame[]; static const size_t kMessageFrameLength; static const size_t kClosingFrameLength; - - private: - SpdyTestStateHelper spdy_state_; }; // TODO(toyoshim): Replace old framing data to new one, then use HEADERS and diff --git a/net/spdy/spdy_websocket_stream_spdy3_unittest.cc b/net/spdy/spdy_websocket_stream_spdy3_unittest.cc index e774b68..932d0a0 100644 --- a/net/spdy/spdy_websocket_stream_spdy3_unittest.cc +++ b/net/spdy/spdy_websocket_stream_spdy3_unittest.cc @@ -185,8 +185,6 @@ class SpdyWebSocketStreamSpdy3Test : public testing::Test { virtual ~SpdyWebSocketStreamSpdy3Test() {} virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY3); - host_port_pair_.set_host("example.com"); host_port_pair_.set_port(80); host_port_proxy_pair_.first = host_port_pair_; @@ -301,9 +299,6 @@ class SpdyWebSocketStreamSpdy3Test : public testing::Test { static const char kClosingFrame[]; static const size_t kMessageFrameLength; static const size_t kClosingFrameLength; - - private: - SpdyTestStateHelper spdy_state_; }; // TODO(toyoshim): Replace old framing data to new one, then use HEADERS and diff --git a/net/spdy/spdy_websocket_test_util_spdy2.cc b/net/spdy/spdy_websocket_test_util_spdy2.cc index f056dac..1a45949 100644 --- a/net/spdy/spdy_websocket_test_util_spdy2.cc +++ b/net/spdy/spdy_websocket_test_util_spdy2.cc @@ -149,7 +149,7 @@ SpdyFrame* ConstructSpdyWebSocketDataFrame( bool fin) { // Construct SPDY data frame. - BufferedSpdyFramer framer(2); + BufferedSpdyFramer framer(2, false); return framer.CreateDataFrame( stream_id, data, diff --git a/net/spdy/spdy_websocket_test_util_spdy3.cc b/net/spdy/spdy_websocket_test_util_spdy3.cc index f146d60..4e2eec4 100644 --- a/net/spdy/spdy_websocket_test_util_spdy3.cc +++ b/net/spdy/spdy_websocket_test_util_spdy3.cc @@ -152,7 +152,7 @@ SpdyFrame* ConstructSpdyWebSocketDataFrame( bool fin) { // Construct SPDY data frame. - BufferedSpdyFramer framer(3); + BufferedSpdyFramer framer(3, false); return framer.CreateDataFrame( stream_id, data, diff --git a/net/tools/flip_server/spdy_interface.cc b/net/tools/flip_server/spdy_interface.cc index de9ffb1..d6ea40a 100644 --- a/net/tools/flip_server/spdy_interface.cc +++ b/net/tools/flip_server/spdy_interface.cc @@ -39,7 +39,7 @@ SpdySM::SpdySM(SMConnection* connection, EpollServer* epoll_server, MemoryCache* memory_cache, FlipAcceptor* acceptor) - : buffered_spdy_framer_(new BufferedSpdyFramer(2)), + : buffered_spdy_framer_(new BufferedSpdyFramer(2, true)), valid_spdy_session_(false), connection_(connection), client_output_list_(connection->output_list()), @@ -291,7 +291,7 @@ void SpdySM::ResetForNewInterface(int32 server_idx) { void SpdySM::ResetForNewConnection() { // seq_num is not cleared, intentionally. delete buffered_spdy_framer_; - buffered_spdy_framer_ = new BufferedSpdyFramer(2); + buffered_spdy_framer_ = new BufferedSpdyFramer(2, true); buffered_spdy_framer_->set_visitor(this); valid_spdy_session_ = false; client_output_ordering_.Reset(); diff --git a/net/websockets/websocket_job_spdy2_unittest.cc b/net/websockets/websocket_job_spdy2_unittest.cc index 7c60195..5ac3a9a 100644 --- a/net/websockets/websocket_job_spdy2_unittest.cc +++ b/net/websockets/websocket_job_spdy2_unittest.cc @@ -335,7 +335,6 @@ namespace net { class WebSocketJobSpdy2Test : public PlatformTest { public: virtual void SetUp() OVERRIDE { - SpdySession::set_default_protocol(kProtoSPDY2); stream_type_ = STREAM_INVALID; cookie_store_ = new MockCookieStore; context_.reset(new MockURLRequestContext(cookie_store_.get())); @@ -483,9 +482,6 @@ class WebSocketJobSpdy2Test : public PlatformTest { static const size_t kHandshakeResponseWithCookieLength; static const size_t kDataHelloLength; static const size_t kDataWorldLength; - - private: - SpdyTestStateHelper spdy_state_; }; const char WebSocketJobSpdy2Test::kHandshakeRequestWithoutCookie[] = diff --git a/net/websockets/websocket_job_spdy3_unittest.cc b/net/websockets/websocket_job_spdy3_unittest.cc index be36fc7..3fdb8f8 100644 --- a/net/websockets/websocket_job_spdy3_unittest.cc +++ b/net/websockets/websocket_job_spdy3_unittest.cc @@ -334,7 +334,6 @@ namespace net { class WebSocketJobSpdy3Test : public PlatformTest { public: virtual void SetUp() { - SpdySession::set_default_protocol(kProtoSPDY3); stream_type_ = STREAM_INVALID; cookie_store_ = new MockCookieStore; context_.reset(new MockURLRequestContext(cookie_store_.get())); @@ -482,9 +481,6 @@ class WebSocketJobSpdy3Test : public PlatformTest { static const size_t kHandshakeResponseWithCookieLength; static const size_t kDataHelloLength; static const size_t kDataWorldLength; - - private: - SpdyTestStateHelper spdy_state_; }; const char WebSocketJobSpdy3Test::kHandshakeRequestWithoutCookie[] = |