Index: net/http/http_stream_factory_impl_unittest.cc |
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc |
deleted file mode 100644 |
index 505acdf3fa43f7fc4793e84c82a977df0d75237f..0000000000000000000000000000000000000000 |
--- a/net/http/http_stream_factory_impl_unittest.cc |
+++ /dev/null |
@@ -1,1305 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/http/http_stream_factory_impl.h" |
- |
-#include <string> |
-#include <vector> |
- |
-#include "base/basictypes.h" |
-#include "base/compiler_specific.h" |
-#include "net/base/net_log.h" |
-#include "net/base/test_completion_callback.h" |
-#include "net/cert/mock_cert_verifier.h" |
-#include "net/dns/mock_host_resolver.h" |
-#include "net/http/http_auth_handler_factory.h" |
-#include "net/http/http_network_session.h" |
-#include "net/http/http_network_session_peer.h" |
-#include "net/http/http_network_transaction.h" |
-#include "net/http/http_request_info.h" |
-#include "net/http/http_server_properties.h" |
-#include "net/http/http_server_properties_impl.h" |
-#include "net/http/http_stream.h" |
-#include "net/http/transport_security_state.h" |
-#include "net/proxy/proxy_info.h" |
-#include "net/proxy/proxy_service.h" |
-#include "net/socket/client_socket_handle.h" |
-#include "net/socket/mock_client_socket_pool_manager.h" |
-#include "net/socket/next_proto.h" |
-#include "net/socket/socket_test_util.h" |
-#include "net/spdy/spdy_session.h" |
-#include "net/spdy/spdy_session_pool.h" |
-#include "net/spdy/spdy_test_util_common.h" |
-#include "net/ssl/ssl_config_service.h" |
-#include "net/ssl/ssl_config_service_defaults.h" |
-// This file can be included from net/http even though |
-// it is in net/websockets because it doesn't |
-// introduce any link dependency to net/websockets. |
-#include "net/websockets/websocket_handshake_stream_base.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-class MockWebSocketHandshakeStream : public WebSocketHandshakeStreamBase { |
- public: |
- enum StreamType { |
- kStreamTypeBasic, |
- kStreamTypeSpdy, |
- }; |
- |
- explicit MockWebSocketHandshakeStream(StreamType type) : type_(type) {} |
- |
- ~MockWebSocketHandshakeStream() override {} |
- |
- StreamType type() const { |
- return type_; |
- } |
- |
- // HttpStream methods |
- int InitializeStream(const HttpRequestInfo* request_info, |
- RequestPriority priority, |
- const BoundNetLog& net_log, |
- const CompletionCallback& callback) override { |
- return ERR_IO_PENDING; |
- } |
- int SendRequest(const HttpRequestHeaders& request_headers, |
- HttpResponseInfo* response, |
- const CompletionCallback& callback) override { |
- return ERR_IO_PENDING; |
- } |
- int ReadResponseHeaders(const CompletionCallback& callback) override { |
- return ERR_IO_PENDING; |
- } |
- int ReadResponseBody(IOBuffer* buf, |
- int buf_len, |
- const CompletionCallback& callback) override { |
- return ERR_IO_PENDING; |
- } |
- void Close(bool not_reusable) override {} |
- bool IsResponseBodyComplete() const override { return false; } |
- bool CanFindEndOfResponse() const override { return false; } |
- bool IsConnectionReused() const override { return false; } |
- void SetConnectionReused() override {} |
- bool IsConnectionReusable() const override { return false; } |
- int64 GetTotalReceivedBytes() const override { return 0; } |
- bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override { |
- return false; |
- } |
- void GetSSLInfo(SSLInfo* ssl_info) override {} |
- void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override {} |
- bool IsSpdyHttpStream() const override { return false; } |
- void Drain(HttpNetworkSession* session) override {} |
- void SetPriority(RequestPriority priority) override {} |
- UploadProgress GetUploadProgress() const override { return UploadProgress(); } |
- HttpStream* RenewStreamForAuth() override { return nullptr; } |
- |
- scoped_ptr<WebSocketStream> Upgrade() override { |
- return scoped_ptr<WebSocketStream>(); |
- } |
- |
- private: |
- const StreamType type_; |
-}; |
- |
-// HttpStreamFactoryImpl subclass that can wait until a preconnect is complete. |
-class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl { |
- public: |
- MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session, |
- bool for_websockets) |
- : HttpStreamFactoryImpl(session, for_websockets), |
- preconnect_done_(false), |
- waiting_for_preconnect_(false) {} |
- |
- |
- void WaitForPreconnects() { |
- while (!preconnect_done_) { |
- waiting_for_preconnect_ = true; |
- base::MessageLoop::current()->Run(); |
- waiting_for_preconnect_ = false; |
- } |
- } |
- |
- private: |
- // HttpStreamFactoryImpl methods. |
- void OnPreconnectsCompleteInternal() override { |
- preconnect_done_ = true; |
- if (waiting_for_preconnect_) |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- bool preconnect_done_; |
- bool waiting_for_preconnect_; |
-}; |
- |
-class StreamRequestWaiter : public HttpStreamRequest::Delegate { |
- public: |
- StreamRequestWaiter() |
- : waiting_for_stream_(false), |
- stream_done_(false) {} |
- |
- // HttpStreamRequest::Delegate |
- |
- void OnStreamReady(const SSLConfig& used_ssl_config, |
- const ProxyInfo& used_proxy_info, |
- HttpStream* stream) override { |
- stream_done_ = true; |
- if (waiting_for_stream_) |
- base::MessageLoop::current()->Quit(); |
- stream_.reset(stream); |
- used_ssl_config_ = used_ssl_config; |
- used_proxy_info_ = used_proxy_info; |
- } |
- |
- void OnWebSocketHandshakeStreamReady( |
- const SSLConfig& used_ssl_config, |
- const ProxyInfo& used_proxy_info, |
- WebSocketHandshakeStreamBase* stream) override { |
- stream_done_ = true; |
- if (waiting_for_stream_) |
- base::MessageLoop::current()->Quit(); |
- websocket_stream_.reset(stream); |
- used_ssl_config_ = used_ssl_config; |
- used_proxy_info_ = used_proxy_info; |
- } |
- |
- void OnStreamFailed(int status, const SSLConfig& used_ssl_config) override {} |
- |
- void OnCertificateError(int status, |
- const SSLConfig& used_ssl_config, |
- const SSLInfo& ssl_info) override {} |
- |
- void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, |
- const SSLConfig& used_ssl_config, |
- const ProxyInfo& used_proxy_info, |
- HttpAuthController* auth_controller) override {} |
- |
- void OnNeedsClientAuth(const SSLConfig& used_ssl_config, |
- SSLCertRequestInfo* cert_info) override {} |
- |
- void OnHttpsProxyTunnelResponse(const HttpResponseInfo& response_info, |
- const SSLConfig& used_ssl_config, |
- const ProxyInfo& used_proxy_info, |
- HttpStream* stream) override {} |
- |
- void WaitForStream() { |
- while (!stream_done_) { |
- waiting_for_stream_ = true; |
- base::MessageLoop::current()->Run(); |
- waiting_for_stream_ = false; |
- } |
- } |
- |
- const SSLConfig& used_ssl_config() const { |
- return used_ssl_config_; |
- } |
- |
- const ProxyInfo& used_proxy_info() const { |
- return used_proxy_info_; |
- } |
- |
- HttpStream* stream() { |
- return stream_.get(); |
- } |
- |
- MockWebSocketHandshakeStream* websocket_stream() { |
- return static_cast<MockWebSocketHandshakeStream*>(websocket_stream_.get()); |
- } |
- |
- bool stream_done() const { return stream_done_; } |
- |
- private: |
- bool waiting_for_stream_; |
- bool stream_done_; |
- scoped_ptr<HttpStream> stream_; |
- scoped_ptr<WebSocketHandshakeStreamBase> websocket_stream_; |
- SSLConfig used_ssl_config_; |
- ProxyInfo used_proxy_info_; |
- |
- DISALLOW_COPY_AND_ASSIGN(StreamRequestWaiter); |
-}; |
- |
-class WebSocketSpdyHandshakeStream : public MockWebSocketHandshakeStream { |
- public: |
- explicit WebSocketSpdyHandshakeStream( |
- const base::WeakPtr<SpdySession>& spdy_session) |
- : MockWebSocketHandshakeStream(kStreamTypeSpdy), |
- spdy_session_(spdy_session) {} |
- |
- ~WebSocketSpdyHandshakeStream() override {} |
- |
- SpdySession* spdy_session() { return spdy_session_.get(); } |
- |
- private: |
- base::WeakPtr<SpdySession> spdy_session_; |
-}; |
- |
-class WebSocketBasicHandshakeStream : public MockWebSocketHandshakeStream { |
- public: |
- explicit WebSocketBasicHandshakeStream( |
- scoped_ptr<ClientSocketHandle> connection) |
- : MockWebSocketHandshakeStream(kStreamTypeBasic), |
- connection_(connection.Pass()) {} |
- |
- ~WebSocketBasicHandshakeStream() override { |
- connection_->socket()->Disconnect(); |
- } |
- |
- ClientSocketHandle* connection() { return connection_.get(); } |
- |
- private: |
- scoped_ptr<ClientSocketHandle> connection_; |
-}; |
- |
-class WebSocketStreamCreateHelper |
- : public WebSocketHandshakeStreamBase::CreateHelper { |
- public: |
- ~WebSocketStreamCreateHelper() override {} |
- |
- WebSocketHandshakeStreamBase* CreateBasicStream( |
- scoped_ptr<ClientSocketHandle> connection, |
- bool using_proxy) override { |
- return new WebSocketBasicHandshakeStream(connection.Pass()); |
- } |
- |
- WebSocketHandshakeStreamBase* CreateSpdyStream( |
- const base::WeakPtr<SpdySession>& spdy_session, |
- bool use_relative_url) override { |
- return new WebSocketSpdyHandshakeStream(spdy_session); |
- } |
-}; |
- |
-struct TestCase { |
- int num_streams; |
- bool ssl; |
-}; |
- |
-TestCase kTests[] = { |
- { 1, false }, |
- { 2, false }, |
- { 1, true}, |
- { 2, true}, |
-}; |
- |
-void PreconnectHelperForURL(int num_streams, |
- const GURL& url, |
- HttpNetworkSession* session) { |
- HttpNetworkSessionPeer peer(session); |
- MockHttpStreamFactoryImplForPreconnect* mock_factory = |
- new MockHttpStreamFactoryImplForPreconnect(session, false); |
- peer.SetHttpStreamFactory(scoped_ptr<HttpStreamFactory>(mock_factory)); |
- SSLConfig ssl_config; |
- session->ssl_config_service()->GetSSLConfig(&ssl_config); |
- |
- HttpRequestInfo request; |
- request.method = "GET"; |
- request.url = url; |
- request.load_flags = 0; |
- |
- session->http_stream_factory()->PreconnectStreams( |
- num_streams, request, DEFAULT_PRIORITY, ssl_config, ssl_config); |
- mock_factory->WaitForPreconnects(); |
-}; |
- |
-void PreconnectHelper(const TestCase& test, |
- HttpNetworkSession* session) { |
- GURL url = test.ssl ? GURL("https://www.google.com") : |
- GURL("http://www.google.com"); |
- PreconnectHelperForURL(test.num_streams, url, session); |
-}; |
- |
-template<typename ParentPool> |
-class CapturePreconnectsSocketPool : public ParentPool { |
- public: |
- CapturePreconnectsSocketPool(HostResolver* host_resolver, |
- CertVerifier* cert_verifier); |
- |
- int last_num_streams() const { |
- return last_num_streams_; |
- } |
- |
- virtual int RequestSocket(const std::string& group_name, |
- const void* socket_params, |
- RequestPriority priority, |
- ClientSocketHandle* handle, |
- const CompletionCallback& callback, |
- const BoundNetLog& net_log) override { |
- ADD_FAILURE(); |
- return ERR_UNEXPECTED; |
- } |
- |
- virtual void RequestSockets(const std::string& group_name, |
- const void* socket_params, |
- int num_sockets, |
- const BoundNetLog& net_log) override { |
- last_num_streams_ = num_sockets; |
- } |
- |
- virtual void CancelRequest(const std::string& group_name, |
- ClientSocketHandle* handle) override { |
- ADD_FAILURE(); |
- } |
- virtual void ReleaseSocket(const std::string& group_name, |
- scoped_ptr<StreamSocket> socket, |
- int id) override { |
- ADD_FAILURE(); |
- } |
- virtual void CloseIdleSockets() override { |
- ADD_FAILURE(); |
- } |
- virtual int IdleSocketCount() const override { |
- ADD_FAILURE(); |
- return 0; |
- } |
- virtual int IdleSocketCountInGroup( |
- const std::string& group_name) const override { |
- ADD_FAILURE(); |
- return 0; |
- } |
- virtual LoadState GetLoadState( |
- const std::string& group_name, |
- const ClientSocketHandle* handle) const override { |
- ADD_FAILURE(); |
- return LOAD_STATE_IDLE; |
- } |
- virtual base::TimeDelta ConnectionTimeout() const override { |
- return base::TimeDelta(); |
- } |
- |
- private: |
- int last_num_streams_; |
-}; |
- |
-typedef CapturePreconnectsSocketPool<TransportClientSocketPool> |
-CapturePreconnectsTransportSocketPool; |
-typedef CapturePreconnectsSocketPool<HttpProxyClientSocketPool> |
-CapturePreconnectsHttpProxySocketPool; |
-typedef CapturePreconnectsSocketPool<SOCKSClientSocketPool> |
-CapturePreconnectsSOCKSSocketPool; |
-typedef CapturePreconnectsSocketPool<SSLClientSocketPool> |
-CapturePreconnectsSSLSocketPool; |
- |
-template<typename ParentPool> |
-CapturePreconnectsSocketPool<ParentPool>::CapturePreconnectsSocketPool( |
- HostResolver* host_resolver, CertVerifier* /* cert_verifier */) |
- : ParentPool(0, 0, nullptr, host_resolver, nullptr, nullptr), |
- last_num_streams_(-1) {} |
- |
-template <> |
-CapturePreconnectsHttpProxySocketPool::CapturePreconnectsSocketPool( |
- HostResolver* /* host_resolver */, |
- CertVerifier* /* cert_verifier */) |
- : HttpProxyClientSocketPool(0, 0, nullptr, nullptr, nullptr, nullptr), |
- last_num_streams_(-1) { |
-} |
- |
-template <> |
-CapturePreconnectsSSLSocketPool::CapturePreconnectsSocketPool( |
- HostResolver* /* host_resolver */, |
- CertVerifier* cert_verifier) |
- : SSLClientSocketPool(0, |
- 0, |
- nullptr, // ssl_histograms |
- cert_verifier, |
- nullptr, // channel_id_store |
- nullptr, // transport_security_state |
- nullptr, // cert_transparency_verifier |
- nullptr, // cert_policy_enforcer |
- std::string(), // ssl_session_cache_shard |
- nullptr, // deterministic_socket_factory |
- nullptr, // transport_socket_pool |
- nullptr, |
- nullptr, |
- nullptr, // ssl_config_service |
- false, // enable_ssl_connect_job_waiting |
- nullptr), // net_log |
- last_num_streams_(-1) { |
-} |
- |
-class HttpStreamFactoryTest : public ::testing::Test, |
- public ::testing::WithParamInterface<NextProto> { |
-}; |
- |
-INSTANTIATE_TEST_CASE_P( |
- NextProto, |
- HttpStreamFactoryTest, |
- testing::Values(kProtoSPDY31, kProtoSPDY4_14, kProtoSPDY4_15)); |
- |
-TEST_P(HttpStreamFactoryTest, PreconnectDirect) { |
- for (size_t i = 0; i < arraysize(kTests); ++i) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- HttpNetworkSessionPeer peer(session); |
- CapturePreconnectsTransportSocketPool* transport_conn_pool = |
- new CapturePreconnectsTransportSocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- CapturePreconnectsSSLSocketPool* ssl_conn_pool = |
- new CapturePreconnectsSSLSocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( |
- new MockClientSocketPoolManager); |
- mock_pool_manager->SetTransportSocketPool(transport_conn_pool); |
- mock_pool_manager->SetSSLSocketPool(ssl_conn_pool); |
- peer.SetClientSocketPoolManager(mock_pool_manager.Pass()); |
- PreconnectHelper(kTests[i], session.get()); |
- if (kTests[i].ssl) |
- EXPECT_EQ(kTests[i].num_streams, ssl_conn_pool->last_num_streams()); |
- else |
- EXPECT_EQ(kTests[i].num_streams, transport_conn_pool->last_num_streams()); |
- } |
-} |
- |
-TEST_P(HttpStreamFactoryTest, PreconnectHttpProxy) { |
- for (size_t i = 0; i < arraysize(kTests); ++i) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateFixed("http_proxy")); |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- HttpNetworkSessionPeer peer(session); |
- HostPortPair proxy_host("http_proxy", 80); |
- CapturePreconnectsHttpProxySocketPool* http_proxy_pool = |
- new CapturePreconnectsHttpProxySocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- CapturePreconnectsSSLSocketPool* ssl_conn_pool = |
- new CapturePreconnectsSSLSocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( |
- new MockClientSocketPoolManager); |
- mock_pool_manager->SetSocketPoolForHTTPProxy(proxy_host, http_proxy_pool); |
- mock_pool_manager->SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); |
- peer.SetClientSocketPoolManager(mock_pool_manager.Pass()); |
- PreconnectHelper(kTests[i], session.get()); |
- if (kTests[i].ssl) |
- EXPECT_EQ(kTests[i].num_streams, ssl_conn_pool->last_num_streams()); |
- else |
- EXPECT_EQ(kTests[i].num_streams, http_proxy_pool->last_num_streams()); |
- } |
-} |
- |
-TEST_P(HttpStreamFactoryTest, PreconnectSocksProxy) { |
- for (size_t i = 0; i < arraysize(kTests); ++i) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateFixed("socks4://socks_proxy:1080")); |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- HttpNetworkSessionPeer peer(session); |
- HostPortPair proxy_host("socks_proxy", 1080); |
- CapturePreconnectsSOCKSSocketPool* socks_proxy_pool = |
- new CapturePreconnectsSOCKSSocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- CapturePreconnectsSSLSocketPool* ssl_conn_pool = |
- new CapturePreconnectsSSLSocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( |
- new MockClientSocketPoolManager); |
- mock_pool_manager->SetSocketPoolForSOCKSProxy(proxy_host, socks_proxy_pool); |
- mock_pool_manager->SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); |
- peer.SetClientSocketPoolManager(mock_pool_manager.Pass()); |
- PreconnectHelper(kTests[i], session.get()); |
- if (kTests[i].ssl) |
- EXPECT_EQ(kTests[i].num_streams, ssl_conn_pool->last_num_streams()); |
- else |
- EXPECT_EQ(kTests[i].num_streams, socks_proxy_pool->last_num_streams()); |
- } |
-} |
- |
-TEST_P(HttpStreamFactoryTest, PreconnectDirectWithExistingSpdySession) { |
- for (size_t i = 0; i < arraysize(kTests); ++i) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- HttpNetworkSessionPeer peer(session); |
- |
- // Put a SpdySession in the pool. |
- HostPortPair host_port_pair("www.google.com", 443); |
- SpdySessionKey key(host_port_pair, ProxyServer::Direct(), |
- PRIVACY_MODE_DISABLED); |
- ignore_result(CreateFakeSpdySession(session->spdy_session_pool(), key)); |
- |
- CapturePreconnectsTransportSocketPool* transport_conn_pool = |
- new CapturePreconnectsTransportSocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- CapturePreconnectsSSLSocketPool* ssl_conn_pool = |
- new CapturePreconnectsSSLSocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( |
- new MockClientSocketPoolManager); |
- mock_pool_manager->SetTransportSocketPool(transport_conn_pool); |
- mock_pool_manager->SetSSLSocketPool(ssl_conn_pool); |
- peer.SetClientSocketPoolManager(mock_pool_manager.Pass()); |
- PreconnectHelper(kTests[i], session.get()); |
- // We shouldn't be preconnecting if we have an existing session, which is |
- // the case for https://www.google.com. |
- if (kTests[i].ssl) |
- EXPECT_EQ(-1, ssl_conn_pool->last_num_streams()); |
- else |
- EXPECT_EQ(kTests[i].num_streams, |
- transport_conn_pool->last_num_streams()); |
- } |
-} |
- |
-// Verify that preconnects to unsafe ports are cancelled before they reach |
-// the SocketPool. |
-TEST_P(HttpStreamFactoryTest, PreconnectUnsafePort) { |
- ASSERT_FALSE(IsPortAllowedByDefault(7)); |
- ASSERT_FALSE(IsPortAllowedByOverride(7)); |
- |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- HttpNetworkSessionPeer peer(session); |
- CapturePreconnectsTransportSocketPool* transport_conn_pool = |
- new CapturePreconnectsTransportSocketPool( |
- session_deps.host_resolver.get(), |
- session_deps.cert_verifier.get()); |
- scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( |
- new MockClientSocketPoolManager); |
- mock_pool_manager->SetTransportSocketPool(transport_conn_pool); |
- peer.SetClientSocketPoolManager(mock_pool_manager.Pass()); |
- |
- PreconnectHelperForURL(1, GURL("http://www.google.com:7"), session.get()); |
- |
- EXPECT_EQ(-1, transport_conn_pool->last_num_streams()); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, JobNotifiesProxy) { |
- const char* kProxyString = "PROXY bad:99; PROXY maybe:80; DIRECT"; |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateFixedFromPacResult(kProxyString)); |
- |
- // First connection attempt fails |
- StaticSocketDataProvider socket_data1; |
- socket_data1.set_connect_data(MockConnect(ASYNC, ERR_ADDRESS_UNREACHABLE)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data1); |
- |
- // Second connection attempt succeeds |
- StaticSocketDataProvider socket_data2; |
- socket_data2.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data2); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. It should succeed using the second proxy in the |
- // list. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("http://www.google.com"); |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory()->RequestStream( |
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, |
- &waiter, BoundNetLog())); |
- waiter.WaitForStream(); |
- |
- // The proxy that failed should now be known to the proxy_service as bad. |
- const ProxyRetryInfoMap& retry_info = |
- session->proxy_service()->proxy_retry_info(); |
- EXPECT_EQ(1u, retry_info.size()); |
- ProxyRetryInfoMap::const_iterator iter = retry_info.find("bad:99"); |
- EXPECT_TRUE(iter != retry_info.end()); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, PrivacyModeDisablesChannelId) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- |
- StaticSocketDataProvider socket_data; |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- session_deps.socket_factory->AddSSLSocketDataProvider(&ssl); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Set an existing SpdySession in the pool. |
- HostPortPair host_port_pair("www.google.com", 443); |
- SpdySessionKey key(host_port_pair, ProxyServer::Direct(), |
- PRIVACY_MODE_ENABLED); |
- |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("https://www.google.com"); |
- request_info.load_flags = 0; |
- request_info.privacy_mode = PRIVACY_MODE_DISABLED; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory()->RequestStream( |
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, |
- &waiter, BoundNetLog())); |
- waiter.WaitForStream(); |
- |
- // The stream shouldn't come from spdy as we are using different privacy mode |
- EXPECT_FALSE(request->using_spdy()); |
- |
- SSLConfig used_ssl_config = waiter.used_ssl_config(); |
- EXPECT_EQ(used_ssl_config.channel_id_enabled, ssl_config.channel_id_enabled); |
-} |
- |
-namespace { |
-// Return count of distinct groups in given socket pool. |
-int GetSocketPoolGroupCount(ClientSocketPool* pool) { |
- int count = 0; |
- scoped_ptr<base::DictionaryValue> dict(pool->GetInfoAsValue("", "", false)); |
- EXPECT_TRUE(dict != nullptr); |
- base::DictionaryValue* groups = nullptr; |
- if (dict->GetDictionary("groups", &groups) && (groups != nullptr)) { |
- count = static_cast<int>(groups->size()); |
- } |
- return count; |
-} |
-} // namespace |
- |
-TEST_P(HttpStreamFactoryTest, PrivacyModeUsesDifferentSocketPoolGroup) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- |
- StaticSocketDataProvider socket_data; |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- session_deps.socket_factory->AddSSLSocketDataProvider(&ssl); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- SSLClientSocketPool* ssl_pool = session->GetSSLSocketPool( |
- HttpNetworkSession::NORMAL_SOCKET_POOL); |
- |
- EXPECT_EQ(GetSocketPoolGroupCount(ssl_pool), 0); |
- |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("https://www.google.com"); |
- request_info.load_flags = 0; |
- request_info.privacy_mode = PRIVACY_MODE_DISABLED; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- |
- scoped_ptr<HttpStreamRequest> request1( |
- session->http_stream_factory()->RequestStream( |
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, |
- &waiter, BoundNetLog())); |
- waiter.WaitForStream(); |
- |
- EXPECT_EQ(GetSocketPoolGroupCount(ssl_pool), 1); |
- |
- scoped_ptr<HttpStreamRequest> request2( |
- session->http_stream_factory()->RequestStream( |
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, |
- &waiter, BoundNetLog())); |
- waiter.WaitForStream(); |
- |
- EXPECT_EQ(GetSocketPoolGroupCount(ssl_pool), 1); |
- |
- request_info.privacy_mode = PRIVACY_MODE_ENABLED; |
- scoped_ptr<HttpStreamRequest> request3( |
- session->http_stream_factory()->RequestStream( |
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, |
- &waiter, BoundNetLog())); |
- waiter.WaitForStream(); |
- |
- EXPECT_EQ(GetSocketPoolGroupCount(ssl_pool), 2); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, GetLoadState) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- |
- StaticSocketDataProvider socket_data; |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("http://www.google.com"); |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory()->RequestStream( |
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, |
- &waiter, BoundNetLog())); |
- |
- EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, request->GetLoadState()); |
- |
- waiter.WaitForStream(); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, RequestHttpStream) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- |
- StaticSocketDataProvider socket_data; |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. It should succeed using the second proxy in the |
- // list. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("http://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory()->RequestStream( |
- request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- ASSERT_TRUE(nullptr != waiter.stream()); |
- EXPECT_TRUE(nullptr == waiter.websocket_stream()); |
- EXPECT_FALSE(waiter.stream()->IsSpdyHttpStream()); |
- |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSSLSocketPool( |
- HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSSLSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, RequestHttpStreamOverSSL) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- |
- MockRead mock_read(ASYNC, OK); |
- StaticSocketDataProvider socket_data(&mock_read, 1, nullptr, 0); |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
- session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("https://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory()->RequestStream( |
- request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- ASSERT_TRUE(nullptr != waiter.stream()); |
- EXPECT_TRUE(nullptr == waiter.websocket_stream()); |
- EXPECT_FALSE(waiter.stream()->IsSpdyHttpStream()); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSSLSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, RequestHttpStreamOverProxy) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateFixed("myproxy:8888")); |
- |
- StaticSocketDataProvider socket_data; |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. It should succeed using the second proxy in the |
- // list. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("http://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory()->RequestStream( |
- request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- ASSERT_TRUE(nullptr != waiter.stream()); |
- EXPECT_TRUE(nullptr == waiter.websocket_stream()); |
- EXPECT_FALSE(waiter.stream()->IsSpdyHttpStream()); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount(session->GetSocketPoolForHTTPProxy( |
- HttpNetworkSession::NORMAL_SOCKET_POOL, |
- HostPortPair("myproxy", 8888)))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSocketPoolForSSLWithProxy( |
- HttpNetworkSession::NORMAL_SOCKET_POOL, |
- HostPortPair("myproxy", 8888)))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSocketPoolForHTTPProxy( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL, |
- HostPortPair("myproxy", 8888)))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSocketPoolForSSLWithProxy( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL, |
- HostPortPair("myproxy", 8888)))); |
- EXPECT_FALSE(waiter.used_proxy_info().is_direct()); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStream) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- |
- StaticSocketDataProvider socket_data; |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("ws://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- WebSocketStreamCreateHelper create_helper; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory_for_websocket() |
- ->RequestWebSocketHandshakeStream(request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- &create_helper, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- EXPECT_TRUE(nullptr == waiter.stream()); |
- ASSERT_TRUE(nullptr != waiter.websocket_stream()); |
- EXPECT_EQ(MockWebSocketHandshakeStream::kStreamTypeBasic, |
- waiter.websocket_stream()->type()); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStreamOverSSL) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateDirect()); |
- |
- MockRead mock_read(ASYNC, OK); |
- StaticSocketDataProvider socket_data(&mock_read, 1, nullptr, 0); |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
- session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("wss://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- WebSocketStreamCreateHelper create_helper; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory_for_websocket() |
- ->RequestWebSocketHandshakeStream(request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- &create_helper, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- EXPECT_TRUE(nullptr == waiter.stream()); |
- ASSERT_TRUE(nullptr != waiter.websocket_stream()); |
- EXPECT_EQ(MockWebSocketHandshakeStream::kStreamTypeBasic, |
- waiter.websocket_stream()->type()); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStreamOverProxy) { |
- SpdySessionDependencies session_deps( |
- GetParam(), ProxyService::CreateFixed("myproxy:8888")); |
- |
- MockRead read(SYNCHRONOUS, "HTTP/1.0 200 Connection established\r\n\r\n"); |
- StaticSocketDataProvider socket_data(&read, 1, 0, 0); |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- scoped_refptr<HttpNetworkSession> session( |
- SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("ws://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- WebSocketStreamCreateHelper create_helper; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory_for_websocket() |
- ->RequestWebSocketHandshakeStream(request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- &create_helper, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- EXPECT_TRUE(nullptr == waiter.stream()); |
- ASSERT_TRUE(nullptr != waiter.websocket_stream()); |
- EXPECT_EQ(MockWebSocketHandshakeStream::kStreamTypeBasic, |
- waiter.websocket_stream()->type()); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSocketPoolForHTTPProxy( |
- HttpNetworkSession::NORMAL_SOCKET_POOL, |
- HostPortPair("myproxy", 8888)))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSocketPoolForSSLWithProxy( |
- HttpNetworkSession::NORMAL_SOCKET_POOL, |
- HostPortPair("myproxy", 8888)))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount(session->GetSocketPoolForHTTPProxy( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL, |
- HostPortPair("myproxy", 8888)))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSocketPoolForSSLWithProxy( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL, |
- HostPortPair("myproxy", 8888)))); |
- EXPECT_FALSE(waiter.used_proxy_info().is_direct()); |
-} |
- |
-TEST_P(HttpStreamFactoryTest, RequestSpdyHttpStream) { |
- SpdySessionDependencies session_deps(GetParam(), |
- ProxyService::CreateDirect()); |
- |
- MockRead mock_read(ASYNC, OK); |
- DeterministicSocketData socket_data(&mock_read, 1, nullptr, 0); |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.deterministic_socket_factory->AddSocketDataProvider( |
- &socket_data); |
- |
- SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
- ssl_socket_data.SetNextProto(GetParam()); |
- session_deps.deterministic_socket_factory->AddSSLSocketDataProvider( |
- &ssl_socket_data); |
- |
- HostPortPair host_port_pair("www.google.com", 443); |
- scoped_refptr<HttpNetworkSession> |
- session(SpdySessionDependencies::SpdyCreateSessionDeterministic( |
- &session_deps)); |
- |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("https://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory()->RequestStream( |
- request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- EXPECT_TRUE(nullptr == waiter.websocket_stream()); |
- ASSERT_TRUE(nullptr != waiter.stream()); |
- EXPECT_TRUE(waiter.stream()->IsSpdyHttpStream()); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
-} |
- |
-// TODO(ricea): This test can be removed once the new WebSocket stack supports |
-// SPDY. Currently, even if we connect to a SPDY-supporting server, we need to |
-// use plain SSL. |
-TEST_P(HttpStreamFactoryTest, RequestWebSocketSpdyHandshakeStreamButGetSSL) { |
- SpdySessionDependencies session_deps(GetParam(), |
- ProxyService::CreateDirect()); |
- |
- MockRead mock_read(SYNCHRONOUS, ERR_IO_PENDING); |
- StaticSocketDataProvider socket_data(&mock_read, 1, nullptr, 0); |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
- session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data); |
- |
- HostPortPair host_port_pair("www.google.com", 80); |
- scoped_refptr<HttpNetworkSession> |
- session(SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("wss://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter1; |
- WebSocketStreamCreateHelper create_helper; |
- scoped_ptr<HttpStreamRequest> request1( |
- session->http_stream_factory_for_websocket() |
- ->RequestWebSocketHandshakeStream(request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter1, |
- &create_helper, |
- BoundNetLog())); |
- waiter1.WaitForStream(); |
- EXPECT_TRUE(waiter1.stream_done()); |
- ASSERT_TRUE(nullptr != waiter1.websocket_stream()); |
- EXPECT_EQ(MockWebSocketHandshakeStream::kStreamTypeBasic, |
- waiter1.websocket_stream()->type()); |
- EXPECT_TRUE(nullptr == waiter1.stream()); |
- |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter1.used_proxy_info().is_direct()); |
-} |
- |
-// TODO(ricea): Re-enable once WebSocket-over-SPDY is implemented. |
-TEST_P(HttpStreamFactoryTest, DISABLED_RequestWebSocketSpdyHandshakeStream) { |
- SpdySessionDependencies session_deps(GetParam(), |
- ProxyService::CreateDirect()); |
- |
- MockRead mock_read(SYNCHRONOUS, ERR_IO_PENDING); |
- StaticSocketDataProvider socket_data(&mock_read, 1, nullptr, 0); |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
- |
- SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
- ssl_socket_data.SetNextProto(GetParam()); |
- session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data); |
- |
- HostPortPair host_port_pair("www.google.com", 80); |
- scoped_refptr<HttpNetworkSession> |
- session(SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
- |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("wss://www.google.com"); |
- request_info.load_flags = 0; |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter1; |
- WebSocketStreamCreateHelper create_helper; |
- scoped_ptr<HttpStreamRequest> request1( |
- session->http_stream_factory_for_websocket() |
- ->RequestWebSocketHandshakeStream(request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter1, |
- &create_helper, |
- BoundNetLog())); |
- waiter1.WaitForStream(); |
- EXPECT_TRUE(waiter1.stream_done()); |
- ASSERT_TRUE(nullptr != waiter1.websocket_stream()); |
- EXPECT_EQ(MockWebSocketHandshakeStream::kStreamTypeSpdy, |
- waiter1.websocket_stream()->type()); |
- EXPECT_TRUE(nullptr == waiter1.stream()); |
- |
- StreamRequestWaiter waiter2; |
- scoped_ptr<HttpStreamRequest> request2( |
- session->http_stream_factory_for_websocket() |
- ->RequestWebSocketHandshakeStream(request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter2, |
- &create_helper, |
- BoundNetLog())); |
- waiter2.WaitForStream(); |
- EXPECT_TRUE(waiter2.stream_done()); |
- ASSERT_TRUE(nullptr != waiter2.websocket_stream()); |
- EXPECT_EQ(MockWebSocketHandshakeStream::kStreamTypeSpdy, |
- waiter2.websocket_stream()->type()); |
- EXPECT_TRUE(nullptr == waiter2.stream()); |
- EXPECT_NE(waiter2.websocket_stream(), waiter1.websocket_stream()); |
- EXPECT_EQ(static_cast<WebSocketSpdyHandshakeStream*>( |
- waiter2.websocket_stream())->spdy_session(), |
- static_cast<WebSocketSpdyHandshakeStream*>( |
- waiter1.websocket_stream())->spdy_session()); |
- |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter1.used_proxy_info().is_direct()); |
-} |
- |
-// TODO(ricea): Re-enable once WebSocket over SPDY is implemented. |
-TEST_P(HttpStreamFactoryTest, DISABLED_OrphanedWebSocketStream) { |
- SpdySessionDependencies session_deps(GetParam(), |
- ProxyService::CreateDirect()); |
- session_deps.use_alternate_protocols = true; |
- |
- MockRead mock_read(ASYNC, OK); |
- DeterministicSocketData socket_data(&mock_read, 1, nullptr, 0); |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.deterministic_socket_factory->AddSocketDataProvider( |
- &socket_data); |
- |
- MockRead mock_read2(ASYNC, OK); |
- DeterministicSocketData socket_data2(&mock_read2, 1, nullptr, 0); |
- socket_data2.set_connect_data(MockConnect(ASYNC, ERR_IO_PENDING)); |
- session_deps.deterministic_socket_factory->AddSocketDataProvider( |
- &socket_data2); |
- |
- SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
- ssl_socket_data.SetNextProto(GetParam()); |
- session_deps.deterministic_socket_factory->AddSSLSocketDataProvider( |
- &ssl_socket_data); |
- |
- scoped_refptr<HttpNetworkSession> |
- session(SpdySessionDependencies::SpdyCreateSessionDeterministic( |
- &session_deps)); |
- |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("ws://www.google.com:8888"); |
- request_info.load_flags = 0; |
- |
- session->http_server_properties()->SetAlternateProtocol( |
- HostPortPair("www.google.com", 8888), 9999, NPN_SPDY_3, 1.0); |
- |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- WebSocketStreamCreateHelper create_helper; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory_for_websocket() |
- ->RequestWebSocketHandshakeStream(request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- &create_helper, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- EXPECT_TRUE(nullptr == waiter.stream()); |
- ASSERT_TRUE(nullptr != waiter.websocket_stream()); |
- EXPECT_EQ(MockWebSocketHandshakeStream::kStreamTypeSpdy, |
- waiter.websocket_stream()->type()); |
- |
- // Make sure that there was an alternative connection |
- // which consumes extra connections. |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(2, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
- |
- // Make sure there is no orphaned job. it is already canceled. |
- ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( |
- session->http_stream_factory_for_websocket())->num_orphaned_jobs()); |
-} |
- |
-} // namespace |
- |
-} // namespace net |