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. |