Chromium Code Reviews| 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 |
| index b17997181c5d4ff9fe9fadb2493bb5d2609121a6..d3d50cd47a96b29e5995c25ff2e924a340a85860 100644 |
| --- a/net/http/http_stream_factory_impl_unittest.cc |
| +++ b/net/http/http_stream_factory_impl_unittest.cc |
| @@ -15,6 +15,7 @@ |
| #include "net/base/test_completion_callback.h" |
| #include "net/cert/mock_cert_verifier.h" |
| #include "net/dns/mock_host_resolver.h" |
| +#include "net/http/bidirectional_stream.h" |
| #include "net/http/http_auth_handler_factory.h" |
| #include "net/http/http_network_session.h" |
| #include "net/http/http_network_session_peer.h" |
| @@ -109,13 +110,11 @@ class MockWebSocketHandshakeStream : public WebSocketHandshakeStreamBase { |
| // 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), |
| + MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session) |
| + : HttpStreamFactoryImpl(session, false), |
| preconnect_done_(false), |
| waiting_for_preconnect_(false) {} |
| - |
| void WaitForPreconnects() { |
| while (!preconnect_done_) { |
| waiting_for_preconnect_ = true; |
| @@ -139,8 +138,7 @@ class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl { |
| class StreamRequestWaiter : public HttpStreamRequest::Delegate { |
| public: |
| StreamRequestWaiter() |
| - : waiting_for_stream_(false), |
| - stream_done_(false) {} |
| + : waiting_for_stream_(false), stream_done_(false), error_status_(OK) {} |
| // HttpStreamRequest::Delegate |
| @@ -167,9 +165,26 @@ class StreamRequestWaiter : public HttpStreamRequest::Delegate { |
| used_proxy_info_ = used_proxy_info; |
| } |
| + void OnBidirectionalStreamReady(const SSLConfig& used_ssl_config, |
| + const ProxyInfo& used_proxy_info, |
| + BidirectionalStream* stream) override { |
| + stream_done_ = true; |
| + if (waiting_for_stream_) |
| + base::MessageLoop::current()->Quit(); |
| + bidirectional_stream_.reset(stream); |
| + used_ssl_config_ = used_ssl_config; |
| + used_proxy_info_ = used_proxy_info; |
| + } |
| + |
| void OnStreamFailed(int status, |
| const SSLConfig& used_ssl_config, |
| - SSLFailureState ssl_failure_state) override {} |
| + SSLFailureState ssl_failure_state) override { |
| + stream_done_ = true; |
| + if (waiting_for_stream_) |
| + base::MessageLoop::current()->Quit(); |
| + used_ssl_config_ = used_ssl_config; |
| + error_status_ = status; |
| + } |
| void OnCertificateError(int status, |
| const SSLConfig& used_ssl_config, |
| @@ -212,15 +227,22 @@ class StreamRequestWaiter : public HttpStreamRequest::Delegate { |
| return static_cast<MockWebSocketHandshakeStream*>(websocket_stream_.get()); |
| } |
| + BidirectionalStream* bidirectional_stream() { |
| + return bidirectional_stream_.get(); |
| + } |
| + |
| bool stream_done() const { return stream_done_; } |
| + int error_status() const { return error_status_; } |
| private: |
| bool waiting_for_stream_; |
| bool stream_done_; |
| scoped_ptr<HttpStream> stream_; |
| scoped_ptr<WebSocketHandshakeStreamBase> websocket_stream_; |
| + scoped_ptr<BidirectionalStream> bidirectional_stream_; |
| SSLConfig used_ssl_config_; |
| ProxyInfo used_proxy_info_; |
| + int error_status_; |
| DISALLOW_COPY_AND_ASSIGN(StreamRequestWaiter); |
| }; |
| @@ -292,7 +314,7 @@ void PreconnectHelperForURL(int num_streams, |
| HttpNetworkSession* session) { |
| HttpNetworkSessionPeer peer(session); |
| MockHttpStreamFactoryImplForPreconnect* mock_factory = |
| - new MockHttpStreamFactoryImplForPreconnect(session, false); |
| + new MockHttpStreamFactoryImplForPreconnect(session); |
| peer.SetHttpStreamFactory(scoped_ptr<HttpStreamFactory>(mock_factory)); |
| SSLConfig ssl_config; |
| session->ssl_config_service()->GetSSLConfig(&ssl_config); |
| @@ -1229,6 +1251,104 @@ TEST_P(HttpStreamFactoryTest, RequestSpdyHttpStream) { |
| EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| } |
| +TEST_P(HttpStreamFactoryTest, RequestBidirectionalStream) { |
| + SpdySessionDependencies session_deps(GetParam(), |
| + ProxyService::CreateDirect()); |
| + |
| + MockRead mock_read(ASYNC, OK); |
| + SequencedSocketData 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", 443); |
| + 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()->RequestBidirectionalStream( |
| + request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
| + BoundNetLog())); |
| + waiter.WaitForStream(); |
| + EXPECT_TRUE(waiter.stream_done()); |
| + EXPECT_TRUE(nullptr == waiter.websocket_stream()); |
|
Bence
2015/10/01 05:29:28
I think EXPECT_FALSE(waiter.websocket_stream()) is
xunjieli
2015/10/01 18:41:16
Done.
|
| + ASSERT_TRUE(nullptr == waiter.stream()); |
| + ASSERT_TRUE(nullptr != waiter.bidirectional_stream()); |
|
Bence
2015/10/01 05:29:28
And maybe ASSERT_TRUE(waiter.bidirectional_stream(
xunjieli
2015/10/01 18:41:16
Done.
|
| + 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()); |
| + ASSERT_EQ(0u, |
| + static_cast<HttpStreamFactoryImpl*>(session->http_stream_factory()) |
| + ->num_orphaned_jobs()); |
| +} |
| + |
| +TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamFailure) { |
| + SpdySessionDependencies session_deps(GetParam(), |
| + ProxyService::CreateDirect()); |
| + |
| + MockRead mock_read(ASYNC, OK); |
| + SequencedSocketData 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); |
| + |
| + // If HTTP/1 is used, BidirectionalStream should not be obtained. |
| + ssl_socket_data.SetNextProto(kProtoHTTP11); |
| + session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data); |
| + |
| + HostPortPair host_port_pair("www.google.com", 443); |
| + 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()->RequestBidirectionalStream( |
| + request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
| + BoundNetLog())); |
| + waiter.WaitForStream(); |
| + EXPECT_TRUE(waiter.stream_done()); |
| + ASSERT_EQ(ERR_FAILED, waiter.error_status()); |
| + EXPECT_TRUE(nullptr == waiter.websocket_stream()); |
| + ASSERT_TRUE(nullptr == waiter.stream()); |
| + ASSERT_TRUE(nullptr == waiter.bidirectional_stream()); |
| + 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))); |
| + ASSERT_EQ(0u, |
| + static_cast<HttpStreamFactoryImpl*>(session->http_stream_factory()) |
| + ->num_orphaned_jobs()); |
| +} |
| + |
| // 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. |