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

Side by Side Diff: net/http/http_stream_factory_impl_unittest.cc

Issue 14813024: Introduce RequestWebSocketStream into HttpStreamFactory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/http/http_stream_factory_impl.h" 5 #include "net/http/http_stream_factory_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "net/base/net_log.h" 10 #include "net/base/net_log.h"
11 #include "net/base/test_completion_callback.h" 11 #include "net/base/test_completion_callback.h"
12 #include "net/cert/mock_cert_verifier.h" 12 #include "net/cert/mock_cert_verifier.h"
13 #include "net/dns/mock_host_resolver.h" 13 #include "net/dns/mock_host_resolver.h"
14 #include "net/http/http_auth_handler_factory.h" 14 #include "net/http/http_auth_handler_factory.h"
15 #include "net/http/http_network_session.h" 15 #include "net/http/http_network_session.h"
16 #include "net/http/http_network_session_peer.h" 16 #include "net/http/http_network_session_peer.h"
17 #include "net/http/http_network_transaction.h" 17 #include "net/http/http_network_transaction.h"
18 #include "net/http/http_request_info.h" 18 #include "net/http/http_request_info.h"
19 #include "net/http/http_server_properties_impl.h" 19 #include "net/http/http_server_properties_impl.h"
20 #include "net/http/http_stream.h" 20 #include "net/http/http_stream.h"
21 #include "net/http/websocket_stream_base.h"
21 #include "net/proxy/proxy_info.h" 22 #include "net/proxy/proxy_info.h"
22 #include "net/proxy/proxy_service.h" 23 #include "net/proxy/proxy_service.h"
24 #include "net/socket/client_socket_handle.h"
23 #include "net/socket/mock_client_socket_pool_manager.h" 25 #include "net/socket/mock_client_socket_pool_manager.h"
26 #include "net/socket/next_proto.h"
24 #include "net/socket/socket_test_util.h" 27 #include "net/socket/socket_test_util.h"
25 #include "net/spdy/spdy_session.h" 28 #include "net/spdy/spdy_session.h"
26 #include "net/spdy/spdy_session_pool.h" 29 #include "net/spdy/spdy_session_pool.h"
30 #include "net/spdy/spdy_test_util_common.h"
31 #include "net/ssl/ssl_config_service.h"
27 #include "net/ssl/ssl_config_service_defaults.h" 32 #include "net/ssl/ssl_config_service_defaults.h"
28 #include "testing/gtest/include/gtest/gtest.h" 33 #include "testing/gtest/include/gtest/gtest.h"
29 34
30 namespace net { 35 namespace net {
31 36
32 namespace { 37 namespace {
33 38
39 class ScopedForceSpdySsl {
40 public:
41 ScopedForceSpdySsl():
42 orig_force_spdy_over_ssl_(HttpStreamFactory::force_spdy_over_ssl()),
43 orig_force_spdy_always_(HttpStreamFactory::force_spdy_always()) {
44 HttpStreamFactory::set_force_spdy_over_ssl(true);
45 HttpStreamFactory::set_force_spdy_always(true);
46 }
47 ~ScopedForceSpdySsl() {
48 HttpStreamFactory::set_force_spdy_over_ssl(orig_force_spdy_over_ssl_);
49 HttpStreamFactory::set_force_spdy_always(orig_force_spdy_always_);
50 }
51
52 private:
53 const bool orig_force_spdy_over_ssl_;
54 const bool orig_force_spdy_always_;
55 };
56
34 class MockHttpStreamFactoryImpl : public HttpStreamFactoryImpl { 57 class MockHttpStreamFactoryImpl : public HttpStreamFactoryImpl {
35 public: 58 public:
36 MockHttpStreamFactoryImpl(HttpNetworkSession* session) 59 MockHttpStreamFactoryImpl(HttpNetworkSession* session,
37 : HttpStreamFactoryImpl(session), 60 bool for_websocket)
61 : HttpStreamFactoryImpl(session, for_websocket),
38 preconnect_done_(false), 62 preconnect_done_(false),
39 waiting_for_preconnect_(false) {} 63 waiting_for_preconnect_(false) {}
40 64
41 65
42 void WaitForPreconnects() { 66 void WaitForPreconnects() {
43 while (!preconnect_done_) { 67 while (!preconnect_done_) {
44 waiting_for_preconnect_ = true; 68 waiting_for_preconnect_ = true;
45 base::MessageLoop::current()->Run(); 69 base::MessageLoop::current()->Run();
46 waiting_for_preconnect_ = false; 70 waiting_for_preconnect_ = false;
47 } 71 }
(...skipping 23 matching lines...) Expand all
71 const SSLConfig& used_ssl_config, 95 const SSLConfig& used_ssl_config,
72 const ProxyInfo& used_proxy_info, 96 const ProxyInfo& used_proxy_info,
73 HttpStreamBase* stream) OVERRIDE { 97 HttpStreamBase* stream) OVERRIDE {
74 stream_done_ = true; 98 stream_done_ = true;
75 if (waiting_for_stream_) 99 if (waiting_for_stream_)
76 base::MessageLoop::current()->Quit(); 100 base::MessageLoop::current()->Quit();
77 stream_.reset(stream); 101 stream_.reset(stream);
78 used_ssl_config_ = used_ssl_config; 102 used_ssl_config_ = used_ssl_config;
79 } 103 }
80 104
105 virtual void OnWebSocketStreamReady(
106 const SSLConfig& used_ssl_config,
107 const ProxyInfo& used_proxy_info,
108 WebSocketStreamBase* stream) OVERRIDE {
109 stream_done_ = true;
110 if (waiting_for_stream_)
111 MessageLoop::current()->Quit();
112 websocket_stream_.reset(stream);
113 }
114
81 virtual void OnStreamFailed( 115 virtual void OnStreamFailed(
82 int status, 116 int status,
83 const SSLConfig& used_ssl_config) OVERRIDE {} 117 const SSLConfig& used_ssl_config) OVERRIDE {}
84 118
85 virtual void OnCertificateError( 119 virtual void OnCertificateError(
86 int status, 120 int status,
87 const SSLConfig& used_ssl_config, 121 const SSLConfig& used_ssl_config,
88 const SSLInfo& ssl_info) OVERRIDE {} 122 const SSLInfo& ssl_info) OVERRIDE {}
89 123
90 virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, 124 virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response,
(...skipping 18 matching lines...) Expand all
109 } 143 }
110 144
111 const SSLConfig& used_ssl_config() const { 145 const SSLConfig& used_ssl_config() const {
112 return used_ssl_config_; 146 return used_ssl_config_;
113 } 147 }
114 148
115 HttpStreamBase* stream() { 149 HttpStreamBase* stream() {
116 return stream_.get(); 150 return stream_.get();
117 } 151 }
118 152
153 WebSocketStreamBase* websocket_stream() {
154 return websocket_stream_.get();
155 }
156
157 bool stream_done() const { return stream_done_; }
158 SpdySession* spdy_session() {return spdy_session_.get(); }
159 ClientSocketHandle* connection() { return connection_.get(); }
119 160
120 private: 161 private:
121 bool waiting_for_stream_; 162 bool waiting_for_stream_;
122 bool stream_done_; 163 bool stream_done_;
123 scoped_ptr<HttpStreamBase> stream_; 164 scoped_ptr<HttpStreamBase> stream_;
165 scoped_ptr<WebSocketStreamBase> websocket_stream_;
124 SSLConfig used_ssl_config_; 166 SSLConfig used_ssl_config_;
167 scoped_ptr<ClientSocketHandle> connection_;
168 scoped_refptr<SpdySession> spdy_session_;
125 169
126 DISALLOW_COPY_AND_ASSIGN(StreamRequestWaiter); 170 DISALLOW_COPY_AND_ASSIGN(StreamRequestWaiter);
127 }; 171 };
128 172
173 class WebSocketSpdyStream : public WebSocketStreamBase {
174 public:
175 explicit WebSocketSpdyStream(SpdySession* spdy_session):
176 WebSocketStreamBase(kStreamTypeSpdy), spdy_session_(spdy_session) {}
177 SpdySession* spdy_session() {return spdy_session_.get();}
178
179 private:
180 scoped_refptr<SpdySession> spdy_session_;
181 };
182
183 class WebSocketBasicStream : public WebSocketStreamBase {
184 public:
185 explicit WebSocketBasicStream(ClientSocketHandle* connection):
186 WebSocketStreamBase(kStreamTypeBasic), connection_(connection) {}
187 ClientSocketHandle* connection() {return connection_.get();}
188
189 private:
190 scoped_ptr<ClientSocketHandle> connection_;
191 };
192
193 class WebSocketStreamFactory : public WebSocketStreamBase::Factory {
194 public:
195 virtual WebSocketStreamBase* CreateBasicStream(ClientSocketHandle* connection,
196 bool using_proxy) OVERRIDE {
197 return new WebSocketBasicStream(connection);
198 }
199 virtual WebSocketStreamBase* CreateSpdyStream(
200 SpdySession* spdy_session,
201 bool use_relative_url) OVERRIDE {
202 return new WebSocketSpdyStream(spdy_session);
203 }
204 };
205
129 struct SessionDependencies { 206 struct SessionDependencies {
130 // Custom proxy service dependency. 207 // Custom proxy service dependency.
131 explicit SessionDependencies(ProxyService* proxy_service) 208 explicit SessionDependencies(ProxyService* proxy_service)
132 : host_resolver(new MockHostResolver), 209 : host_resolver(new MockHostResolver),
133 cert_verifier(new MockCertVerifier), 210 cert_verifier(new MockCertVerifier),
134 proxy_service(proxy_service), 211 proxy_service(proxy_service),
135 ssl_config_service(new SSLConfigServiceDefaults), 212 ssl_config_service(new SSLConfigServiceDefaults),
136 http_auth_handler_factory( 213 http_auth_handler_factory(
137 HttpAuthHandlerFactory::CreateDefault(host_resolver.get())), 214 HttpAuthHandlerFactory::CreateDefault(host_resolver.get())),
138 net_log(NULL) {} 215 net_log(NULL) {}
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 { 2, false }, 248 { 2, false },
172 { 1, true}, 249 { 1, true},
173 { 2, true}, 250 { 2, true},
174 }; 251 };
175 252
176 void PreconnectHelperForURL(int num_streams, 253 void PreconnectHelperForURL(int num_streams,
177 const GURL& url, 254 const GURL& url,
178 HttpNetworkSession* session) { 255 HttpNetworkSession* session) {
179 HttpNetworkSessionPeer peer(session); 256 HttpNetworkSessionPeer peer(session);
180 MockHttpStreamFactoryImpl* mock_factory = 257 MockHttpStreamFactoryImpl* mock_factory =
181 new MockHttpStreamFactoryImpl(session); 258 new MockHttpStreamFactoryImpl(session, false);
182 peer.SetHttpStreamFactory(mock_factory); 259 peer.SetHttpStreamFactory(mock_factory);
183 SSLConfig ssl_config; 260 SSLConfig ssl_config;
184 session->ssl_config_service()->GetSSLConfig(&ssl_config); 261 session->ssl_config_service()->GetSSLConfig(&ssl_config);
185 262
186 HttpRequestInfo request; 263 HttpRequestInfo request;
187 request.method = "GET"; 264 request.method = "GET";
188 request.url = url; 265 request.url = url;
189 request.load_flags = 0; 266 request.load_flags = 0;
190 267
191 session->http_stream_factory()->PreconnectStreams( 268 session->http_stream_factory()->PreconnectStreams(
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 socket_data1.set_connect_data(MockConnect(ASYNC, ERR_ADDRESS_UNREACHABLE)); 530 socket_data1.set_connect_data(MockConnect(ASYNC, ERR_ADDRESS_UNREACHABLE));
454 session_deps.socket_factory.AddSocketDataProvider(&socket_data1); 531 session_deps.socket_factory.AddSocketDataProvider(&socket_data1);
455 532
456 // Second connection attempt succeeds 533 // Second connection attempt succeeds
457 StaticSocketDataProvider socket_data2; 534 StaticSocketDataProvider socket_data2;
458 socket_data2.set_connect_data(MockConnect(ASYNC, OK)); 535 socket_data2.set_connect_data(MockConnect(ASYNC, OK));
459 session_deps.socket_factory.AddSocketDataProvider(&socket_data2); 536 session_deps.socket_factory.AddSocketDataProvider(&socket_data2);
460 537
461 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); 538 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
462 539
463 // Now request a stream. It should succeed using the second proxy in the 540 // Now request a stream.
464 // list.
465 HttpRequestInfo request_info; 541 HttpRequestInfo request_info;
466 request_info.method = "GET"; 542 request_info.method = "GET";
467 request_info.url = GURL("http://www.google.com"); 543 request_info.url = GURL("http://www.google.com");
468 544
469 SSLConfig ssl_config; 545 SSLConfig ssl_config;
470 StreamRequestWaiter waiter; 546 StreamRequestWaiter waiter;
471 scoped_ptr<HttpStreamRequest> request( 547 scoped_ptr<HttpStreamRequest> request(
472 session->http_stream_factory()->RequestStream( 548 session->http_stream_factory()->RequestStream(
473 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, 549 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config,
474 &waiter, BoundNetLog())); 550 &waiter, BoundNetLog()));
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 scoped_ptr<HttpStreamRequest> request( 679 scoped_ptr<HttpStreamRequest> request(
604 session->http_stream_factory()->RequestStream( 680 session->http_stream_factory()->RequestStream(
605 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, 681 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config,
606 &waiter, BoundNetLog())); 682 &waiter, BoundNetLog()));
607 683
608 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, request->GetLoadState()); 684 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, request->GetLoadState());
609 685
610 waiter.WaitForStream(); 686 waiter.WaitForStream();
611 } 687 }
612 688
689 TEST(HttpStreamFactoryTest, RequestStream) {
690 SessionDependencies session_deps(ProxyService::CreateDirect());
691
692 StaticSocketDataProvider socket_data;
693 socket_data.set_connect_data(MockConnect(ASYNC, OK));
694 session_deps.socket_factory.AddSocketDataProvider(&socket_data);
695
696 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
697
698 // Now request a stream. It should succeed using the second proxy in the
699 // list.
700 HttpRequestInfo request_info;
701 request_info.method = "GET";
702 request_info.url = GURL("http://www.google.com");
703 request_info.load_flags = 0;
704
705 SSLConfig ssl_config;
706 StreamRequestWaiter waiter;
707 scoped_ptr<HttpStreamRequest> request(
708 session->http_stream_factory()->RequestStream(
709 request_info,
710 DEFAULT_PRIORITY,
711 ssl_config,
712 ssl_config,
713 &waiter,
714 BoundNetLog()));
715 waiter.WaitForStream();
716 EXPECT_TRUE(waiter.stream_done());
717 EXPECT_TRUE(NULL == waiter.spdy_session());
718 EXPECT_TRUE(NULL == waiter.connection());
719 EXPECT_TRUE(NULL != waiter.stream());
720 }
721
722 TEST(HttpStreamFactoryTest, RequestWebSocketBasicStream) {
mmenke 2013/05/24 14:53:22 These tests should make sure the socket was create
yhirano 2013/05/27 09:21:32 Done. Since net::InitSocketHandleForHttp is respon
723 SessionDependencies session_deps(ProxyService::CreateDirect());
724
725 StaticSocketDataProvider socket_data;
726 socket_data.set_connect_data(MockConnect(ASYNC, OK));
727 session_deps.socket_factory.AddSocketDataProvider(&socket_data);
728
729 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
730
731 // Now request a stream.
732 HttpRequestInfo request_info;
733 request_info.method = "GET";
734 request_info.url = GURL("ws://www.google.com");
735 request_info.load_flags = 0;
736
737 SSLConfig ssl_config;
738 StreamRequestWaiter waiter;
739 WebSocketStreamFactory factory;
740 scoped_ptr<HttpStreamRequest> request(
741 session->websocket_stream_factory()->RequestWebSocketStream(
742 request_info,
743 DEFAULT_PRIORITY,
744 ssl_config,
745 ssl_config,
746 &waiter,
747 &factory,
748 BoundNetLog()));
749 waiter.WaitForStream();
750 EXPECT_TRUE(waiter.stream_done());
751 EXPECT_TRUE(NULL == waiter.stream());
752 EXPECT_TRUE(NULL != waiter.websocket_stream());
753 EXPECT_EQ(WebSocketStreamBase::kStreamTypeBasic,
754 waiter.websocket_stream()->type());
755 }
756
757 TEST(HttpStreamFactoryTest, RequestSpdyHttpStream) {
758 ScopedForceSpdySsl use_spdy;
759 SpdySessionDependencies session_deps(kProtoSPDY3,
760 ProxyService::CreateDirect());
761
762 MockRead mock_read(ASYNC, OK);
763 StaticSocketDataProvider socket_data(&mock_read, 1, NULL, 0);
764 socket_data.set_connect_data(MockConnect(ASYNC, OK));
765 session_deps.socket_factory->AddSocketDataProvider(&socket_data);
766
767 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
768 ssl_socket_data.protocol_negotiated = kProtoSPDY3;
769 session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data);
770
771 HostPortPair host_port_pair("www.google.com", 80);
772 scoped_refptr<HttpNetworkSession>
773 session(SpdySessionDependencies::SpdyCreateSession(&session_deps));
774
775 // Now request a stream.
776 HttpRequestInfo request_info;
777 request_info.method = "GET";
778 request_info.url = GURL("http://www.google.com");
779 request_info.load_flags = 0;
780
781 SSLConfig ssl_config;
782 StreamRequestWaiter waiter;
783 scoped_ptr<HttpStreamRequest> request(
784 session->http_stream_factory()->RequestStream(
785 request_info,
786 DEFAULT_PRIORITY,
787 ssl_config,
788 ssl_config,
789 &waiter,
790 BoundNetLog()));
791 waiter.WaitForStream();
792 EXPECT_TRUE(waiter.stream_done());
793 EXPECT_TRUE(NULL == waiter.websocket_stream());
794 EXPECT_TRUE(NULL != waiter.stream());
795 EXPECT_TRUE(waiter.stream()->IsSpdyHttpStream());
796 }
797
798 TEST(HttpStreamFactoryTest, RequestWebSocketSpdyStream) {
799 ScopedForceSpdySsl use_spdy;
800 SpdySessionDependencies session_deps(kProtoSPDY3,
801 ProxyService::CreateDirect());
802
803 MockRead mock_read(ASYNC, ERR_IO_PENDING);
804 StaticSocketDataProvider socket_data(&mock_read, 1, NULL, 0);
805 socket_data.set_connect_data(MockConnect(ASYNC, OK));
806 session_deps.socket_factory->AddSocketDataProvider(&socket_data);
807
808 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
809 ssl_socket_data.protocol_negotiated = kProtoSPDY3;
810 session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data);
811
812 SSLSocketDataProvider ssl_socket_data2(ASYNC, OK);
813 ssl_socket_data2.protocol_negotiated = kProtoSPDY3;
814 session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data2);
815
816 HostPortPair host_port_pair("www.google.com", 80);
817 scoped_refptr<HttpNetworkSession>
818 session(SpdySessionDependencies::SpdyCreateSession(&session_deps));
819
820 // Now request a stream.
821 HttpRequestInfo request_info;
822 request_info.method = "GET";
823 request_info.url = GURL("wss://www.google.com");
824 request_info.load_flags = 0;
825
826 SSLConfig ssl_config;
827 StreamRequestWaiter waiter1;
828 WebSocketStreamFactory factory;
829 scoped_ptr<HttpStreamRequest> request1(
830 session->websocket_stream_factory()->RequestWebSocketStream(
831 request_info,
832 DEFAULT_PRIORITY,
833 ssl_config,
834 ssl_config,
835 &waiter1,
836 &factory,
837 BoundNetLog()));
838 waiter1.WaitForStream();
839 EXPECT_TRUE(waiter1.stream_done());
840 EXPECT_TRUE(NULL != waiter1.websocket_stream());
841 EXPECT_EQ(WebSocketStreamBase::kStreamTypeSpdy,
842 waiter1.websocket_stream()->type());
843 EXPECT_TRUE(NULL == waiter1.connection());
844 EXPECT_TRUE(NULL == waiter1.stream());
845
846 StreamRequestWaiter waiter2;
847 scoped_ptr<HttpStreamRequest> request2(
848 session->websocket_stream_factory()->RequestWebSocketStream(
849 request_info,
850 DEFAULT_PRIORITY,
851 ssl_config,
852 ssl_config,
853 &waiter2,
854 &factory,
855 BoundNetLog()));
856 waiter2.WaitForStream();
857 EXPECT_TRUE(waiter2.stream_done());
858 EXPECT_TRUE(NULL != waiter2.websocket_stream());
859 EXPECT_EQ(WebSocketStreamBase::kStreamTypeSpdy,
860 waiter2.websocket_stream()->type());
861 EXPECT_TRUE(NULL == waiter2.connection());
862 EXPECT_TRUE(NULL == waiter2.stream());
863 EXPECT_NE(waiter2.websocket_stream(), waiter1.websocket_stream());
864 EXPECT_EQ(static_cast<WebSocketSpdyStream*>(waiter2.websocket_stream())->
865 spdy_session(),
866 static_cast<WebSocketSpdyStream*>(waiter1.websocket_stream())->
867 spdy_session());
868 }
869
613 } // namespace 870 } // namespace
614 871
615 } // namespace net 872 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698