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

Unified Diff: net/http/http_stream_factory_impl_unittest.cc

Issue 1326503003: Added a net::BidirectionalStream to expose a bidirectional streaming interface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698