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

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 #include <vector>
8 9
9 #include "base/basictypes.h" 10 #include "base/basictypes.h"
10 #include "net/base/net_log.h" 11 #include "net/base/net_log.h"
11 #include "net/base/test_completion_callback.h" 12 #include "net/base/test_completion_callback.h"
12 #include "net/cert/mock_cert_verifier.h" 13 #include "net/cert/mock_cert_verifier.h"
13 #include "net/dns/mock_host_resolver.h" 14 #include "net/dns/mock_host_resolver.h"
14 #include "net/http/http_auth_handler_factory.h" 15 #include "net/http/http_auth_handler_factory.h"
15 #include "net/http/http_network_session.h" 16 #include "net/http/http_network_session.h"
16 #include "net/http/http_network_session_peer.h" 17 #include "net/http/http_network_session_peer.h"
17 #include "net/http/http_network_transaction.h" 18 #include "net/http/http_network_transaction.h"
18 #include "net/http/http_request_info.h" 19 #include "net/http/http_request_info.h"
19 #include "net/http/http_server_properties_impl.h" 20 #include "net/http/http_server_properties_impl.h"
20 #include "net/http/http_stream.h" 21 #include "net/http/http_stream.h"
22 #include "net/http/websocket_stream_base.h"
21 #include "net/proxy/proxy_info.h" 23 #include "net/proxy/proxy_info.h"
22 #include "net/proxy/proxy_service.h" 24 #include "net/proxy/proxy_service.h"
25 #include "net/socket/client_socket_handle.h"
23 #include "net/socket/mock_client_socket_pool_manager.h" 26 #include "net/socket/mock_client_socket_pool_manager.h"
27 #include "net/socket/next_proto.h"
24 #include "net/socket/socket_test_util.h" 28 #include "net/socket/socket_test_util.h"
25 #include "net/spdy/spdy_session.h" 29 #include "net/spdy/spdy_session.h"
26 #include "net/spdy/spdy_session_pool.h" 30 #include "net/spdy/spdy_session_pool.h"
31 #include "net/spdy/spdy_test_util_common.h"
32 #include "net/ssl/ssl_config_service.h"
27 #include "net/ssl/ssl_config_service_defaults.h" 33 #include "net/ssl/ssl_config_service_defaults.h"
28 #include "testing/gtest/include/gtest/gtest.h" 34 #include "testing/gtest/include/gtest/gtest.h"
29 35
30 namespace net { 36 namespace net {
31 37
32 namespace { 38 namespace {
33 39
40 class ScopedForceSpdySsl {
41 public:
42 explicit ScopedForceSpdySsl(bool enabled):
43 orig_force_spdy_over_ssl_(HttpStreamFactory::force_spdy_over_ssl()),
44 orig_force_spdy_always_(HttpStreamFactory::force_spdy_always()),
45 orig_spdy_enabled_(HttpStreamFactory::spdy_enabled()) {
46 HttpStreamFactory::set_force_spdy_over_ssl(enabled);
47 HttpStreamFactory::set_force_spdy_always(enabled);
48 HttpStreamFactory::set_spdy_enabled(enabled);
49 }
50 ~ScopedForceSpdySsl() {
51 HttpStreamFactory::set_spdy_enabled(orig_spdy_enabled_);
52 HttpStreamFactory::set_force_spdy_over_ssl(orig_force_spdy_over_ssl_);
53 HttpStreamFactory::set_force_spdy_always(orig_force_spdy_always_);
54 }
55
56 private:
57 const bool orig_force_spdy_over_ssl_;
58 const bool orig_force_spdy_always_;
59 const bool orig_spdy_enabled_;
60 };
61
34 class MockHttpStreamFactoryImpl : public HttpStreamFactoryImpl { 62 class MockHttpStreamFactoryImpl : public HttpStreamFactoryImpl {
35 public: 63 public:
36 MockHttpStreamFactoryImpl(HttpNetworkSession* session) 64 MockHttpStreamFactoryImpl(HttpNetworkSession* session, bool for_websockets)
37 : HttpStreamFactoryImpl(session), 65 : HttpStreamFactoryImpl(session, for_websockets) {}
66
67 struct InitSocketHandleParams {
68 InitSocketHandleParams()
69 : force_spdy_over_ssl(false), want_spdy_over_npn(false) {}
70
71 InitSocketHandleParams(
72 const GURL& request_url,
73 const HttpRequestInfo& request_info,
74 RequestPriority request_priority,
75 const ProxyInfo& proxy_info,
76 bool force_spdy_over_ssl,
77 bool want_spdy_over_npn,
78 const SSLConfig& ssl_config_for_origin,
79 const SSLConfig& ssl_config_for_proxy,
80 ClientSocketHandle* socket_handle)
81 : request_url(request_url), request_info(request_info),
82 request_priority(request_priority), proxy_info(proxy_info),
83 force_spdy_over_ssl(force_spdy_over_ssl),
84 want_spdy_over_npn(want_spdy_over_npn),
85 ssl_config_for_origin(ssl_config_for_origin),
86 ssl_config_for_proxy(ssl_config_for_proxy),
87 socket_handle(socket_handle) {}
88
89 GURL request_url;
90 HttpRequestInfo request_info;
91 RequestPriority request_priority;
92 ProxyInfo proxy_info;
93 bool force_spdy_over_ssl;
94 bool want_spdy_over_npn;
95 SSLConfig ssl_config_for_origin;
96 SSLConfig ssl_config_for_proxy;
97 // can be a dangling pointer.
98 ClientSocketHandle* socket_handle;
99 };
100 std::vector<InitSocketHandleParams> calls_init_socket_handle_for_http;
101
102 private:
103 virtual int InitSocketHandleForHttpRequest(
104 const GURL& request_url,
105 const HttpRequestInfo& request_info,
106 RequestPriority request_priority,
107 const ProxyInfo& proxy_info,
108 bool force_spdy_over_ssl,
109 bool want_spdy_over_npn,
110 const SSLConfig& ssl_config_for_origin,
111 const SSLConfig& ssl_config_for_proxy,
112 const BoundNetLog& net_log,
113 ClientSocketHandle* socket_handle,
114 const OnHostResolutionCallback& resolution_callback,
115 const CompletionCallback& callback) OVERRIDE {
116 calls_init_socket_handle_for_http.push_back(InitSocketHandleParams(
117 request_url,
118 request_info,
119 request_priority,
120 proxy_info,
121 force_spdy_over_ssl,
122 want_spdy_over_npn,
123 ssl_config_for_origin,
124 ssl_config_for_proxy,
125 socket_handle));
126 return HttpStreamFactoryImpl::InitSocketHandleForHttpRequest(
127 request_url,
128 request_info,
129 request_priority,
130 proxy_info,
131 force_spdy_over_ssl,
132 want_spdy_over_npn,
133 ssl_config_for_origin,
134 ssl_config_for_proxy,
135 net_log,
136 socket_handle,
137 resolution_callback,
138 callback);
139 }
140 };
141
142 class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl {
143 public:
144 MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session,
145 bool for_websockets)
146 : HttpStreamFactoryImpl(session, for_websockets),
38 preconnect_done_(false), 147 preconnect_done_(false),
39 waiting_for_preconnect_(false) {} 148 waiting_for_preconnect_(false) {}
40 149
41 150
42 void WaitForPreconnects() { 151 void WaitForPreconnects() {
43 while (!preconnect_done_) { 152 while (!preconnect_done_) {
44 waiting_for_preconnect_ = true; 153 waiting_for_preconnect_ = true;
45 base::MessageLoop::current()->Run(); 154 base::MessageLoop::current()->Run();
46 waiting_for_preconnect_ = false; 155 waiting_for_preconnect_ = false;
47 } 156 }
(...skipping 23 matching lines...) Expand all
71 const SSLConfig& used_ssl_config, 180 const SSLConfig& used_ssl_config,
72 const ProxyInfo& used_proxy_info, 181 const ProxyInfo& used_proxy_info,
73 HttpStreamBase* stream) OVERRIDE { 182 HttpStreamBase* stream) OVERRIDE {
74 stream_done_ = true; 183 stream_done_ = true;
75 if (waiting_for_stream_) 184 if (waiting_for_stream_)
76 base::MessageLoop::current()->Quit(); 185 base::MessageLoop::current()->Quit();
77 stream_.reset(stream); 186 stream_.reset(stream);
78 used_ssl_config_ = used_ssl_config; 187 used_ssl_config_ = used_ssl_config;
79 } 188 }
80 189
190 virtual void OnWebSocketStreamReady(
191 const SSLConfig& used_ssl_config,
192 const ProxyInfo& used_proxy_info,
193 WebSocketStreamBase* stream) OVERRIDE {
194 stream_done_ = true;
195 if (waiting_for_stream_)
196 MessageLoop::current()->Quit();
197 websocket_stream_.reset(stream);
198 }
199
81 virtual void OnStreamFailed( 200 virtual void OnStreamFailed(
82 int status, 201 int status,
83 const SSLConfig& used_ssl_config) OVERRIDE {} 202 const SSLConfig& used_ssl_config) OVERRIDE {}
84 203
85 virtual void OnCertificateError( 204 virtual void OnCertificateError(
86 int status, 205 int status,
87 const SSLConfig& used_ssl_config, 206 const SSLConfig& used_ssl_config,
88 const SSLInfo& ssl_info) OVERRIDE {} 207 const SSLInfo& ssl_info) OVERRIDE {}
89 208
90 virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, 209 virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response,
(...skipping 18 matching lines...) Expand all
109 } 228 }
110 229
111 const SSLConfig& used_ssl_config() const { 230 const SSLConfig& used_ssl_config() const {
112 return used_ssl_config_; 231 return used_ssl_config_;
113 } 232 }
114 233
115 HttpStreamBase* stream() { 234 HttpStreamBase* stream() {
116 return stream_.get(); 235 return stream_.get();
117 } 236 }
118 237
238 WebSocketStreamBase* websocket_stream() {
239 return websocket_stream_.get();
240 }
241
242 bool stream_done() const { return stream_done_; }
243 SpdySession* spdy_session() {return spdy_session_.get(); }
244 ClientSocketHandle* connection() { return connection_.get(); }
119 245
120 private: 246 private:
121 bool waiting_for_stream_; 247 bool waiting_for_stream_;
122 bool stream_done_; 248 bool stream_done_;
123 scoped_ptr<HttpStreamBase> stream_; 249 scoped_ptr<HttpStreamBase> stream_;
250 scoped_ptr<WebSocketStreamBase> websocket_stream_;
124 SSLConfig used_ssl_config_; 251 SSLConfig used_ssl_config_;
252 scoped_ptr<ClientSocketHandle> connection_;
253 scoped_refptr<SpdySession> spdy_session_;
mmenke 2013/05/28 21:22:37 These two are no longer in use.
yhirano 2013/05/30 04:44:32 Done.
125 254
126 DISALLOW_COPY_AND_ASSIGN(StreamRequestWaiter); 255 DISALLOW_COPY_AND_ASSIGN(StreamRequestWaiter);
127 }; 256 };
128 257
258 class WebSocketSpdyStream : public WebSocketStreamBase {
259 public:
260 explicit WebSocketSpdyStream(SpdySession* spdy_session):
261 WebSocketStreamBase(kStreamTypeSpdy), spdy_session_(spdy_session) {}
262 SpdySession* spdy_session() {return spdy_session_.get();}
263
264 private:
265 scoped_refptr<SpdySession> spdy_session_;
266 };
267
268 class WebSocketBasicStream : public WebSocketStreamBase {
269 public:
270 explicit WebSocketBasicStream(ClientSocketHandle* connection):
271 WebSocketStreamBase(kStreamTypeBasic), connection_(connection) {}
272 ClientSocketHandle* connection() {return connection_.get();}
273
274 private:
275 scoped_ptr<ClientSocketHandle> connection_;
276 };
277
278 class WebSocketStreamFactory : public WebSocketStreamBase::Factory {
279 public:
280 virtual WebSocketStreamBase* CreateBasicStream(ClientSocketHandle* connection,
281 bool using_proxy) OVERRIDE {
282 return new WebSocketBasicStream(connection);
283 }
284 virtual WebSocketStreamBase* CreateSpdyStream(
285 SpdySession* spdy_session,
286 bool use_relative_url) OVERRIDE {
287 return new WebSocketSpdyStream(spdy_session);
288 }
289 };
290
129 struct SessionDependencies { 291 struct SessionDependencies {
130 // Custom proxy service dependency. 292 // Custom proxy service dependency.
131 explicit SessionDependencies(ProxyService* proxy_service) 293 explicit SessionDependencies(ProxyService* proxy_service)
132 : host_resolver(new MockHostResolver), 294 : host_resolver(new MockHostResolver),
133 cert_verifier(new MockCertVerifier), 295 cert_verifier(new MockCertVerifier),
134 proxy_service(proxy_service), 296 proxy_service(proxy_service),
135 ssl_config_service(new SSLConfigServiceDefaults), 297 ssl_config_service(new SSLConfigServiceDefaults),
136 http_auth_handler_factory( 298 http_auth_handler_factory(
137 HttpAuthHandlerFactory::CreateDefault(host_resolver.get())), 299 HttpAuthHandlerFactory::CreateDefault(host_resolver.get())),
138 net_log(NULL) {} 300 net_log(NULL) {}
(...skipping 12 matching lines...) Expand all
151 HttpNetworkSession::Params params; 313 HttpNetworkSession::Params params;
152 params.host_resolver = session_deps->host_resolver.get(); 314 params.host_resolver = session_deps->host_resolver.get();
153 params.cert_verifier = session_deps->cert_verifier.get(); 315 params.cert_verifier = session_deps->cert_verifier.get();
154 params.proxy_service = session_deps->proxy_service.get(); 316 params.proxy_service = session_deps->proxy_service.get();
155 params.ssl_config_service = session_deps->ssl_config_service; 317 params.ssl_config_service = session_deps->ssl_config_service;
156 params.client_socket_factory = &session_deps->socket_factory; 318 params.client_socket_factory = &session_deps->socket_factory;
157 params.http_auth_handler_factory = 319 params.http_auth_handler_factory =
158 session_deps->http_auth_handler_factory.get(); 320 session_deps->http_auth_handler_factory.get();
159 params.net_log = session_deps->net_log; 321 params.net_log = session_deps->net_log;
160 params.http_server_properties = &session_deps->http_server_properties; 322 params.http_server_properties = &session_deps->http_server_properties;
323
161 return new HttpNetworkSession(params); 324 return new HttpNetworkSession(params);
162 } 325 }
163 326
164 struct TestCase { 327 struct TestCase {
165 int num_streams; 328 int num_streams;
166 bool ssl; 329 bool ssl;
167 }; 330 };
168 331
169 TestCase kTests[] = { 332 TestCase kTests[] = {
170 { 1, false }, 333 { 1, false },
171 { 2, false }, 334 { 2, false },
172 { 1, true}, 335 { 1, true},
173 { 2, true}, 336 { 2, true},
174 }; 337 };
175 338
176 void PreconnectHelperForURL(int num_streams, 339 void PreconnectHelperForURL(int num_streams,
177 const GURL& url, 340 const GURL& url,
178 HttpNetworkSession* session) { 341 HttpNetworkSession* session) {
179 HttpNetworkSessionPeer peer(session); 342 HttpNetworkSessionPeer peer(session);
180 MockHttpStreamFactoryImpl* mock_factory = 343 MockHttpStreamFactoryImplForPreconnect* mock_factory =
181 new MockHttpStreamFactoryImpl(session); 344 new MockHttpStreamFactoryImplForPreconnect(session, false);
182 peer.SetHttpStreamFactory(mock_factory); 345 peer.SetHttpStreamFactory(mock_factory);
183 SSLConfig ssl_config; 346 SSLConfig ssl_config;
184 session->ssl_config_service()->GetSSLConfig(&ssl_config); 347 session->ssl_config_service()->GetSSLConfig(&ssl_config);
185 348
186 HttpRequestInfo request; 349 HttpRequestInfo request;
187 request.method = "GET"; 350 request.method = "GET";
188 request.url = url; 351 request.url = url;
189 request.load_flags = 0; 352 request.load_flags = 0;
190 353
191 session->http_stream_factory()->PreconnectStreams( 354 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)); 616 socket_data1.set_connect_data(MockConnect(ASYNC, ERR_ADDRESS_UNREACHABLE));
454 session_deps.socket_factory.AddSocketDataProvider(&socket_data1); 617 session_deps.socket_factory.AddSocketDataProvider(&socket_data1);
455 618
456 // Second connection attempt succeeds 619 // Second connection attempt succeeds
457 StaticSocketDataProvider socket_data2; 620 StaticSocketDataProvider socket_data2;
458 socket_data2.set_connect_data(MockConnect(ASYNC, OK)); 621 socket_data2.set_connect_data(MockConnect(ASYNC, OK));
459 session_deps.socket_factory.AddSocketDataProvider(&socket_data2); 622 session_deps.socket_factory.AddSocketDataProvider(&socket_data2);
460 623
461 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); 624 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
462 625
463 // Now request a stream. It should succeed using the second proxy in the 626 // Now request a stream.
464 // list.
465 HttpRequestInfo request_info; 627 HttpRequestInfo request_info;
466 request_info.method = "GET"; 628 request_info.method = "GET";
467 request_info.url = GURL("http://www.google.com"); 629 request_info.url = GURL("http://www.google.com");
468 630
469 SSLConfig ssl_config; 631 SSLConfig ssl_config;
470 StreamRequestWaiter waiter; 632 StreamRequestWaiter waiter;
471 scoped_ptr<HttpStreamRequest> request( 633 scoped_ptr<HttpStreamRequest> request(
472 session->http_stream_factory()->RequestStream( 634 session->http_stream_factory()->RequestStream(
473 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, 635 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config,
474 &waiter, BoundNetLog())); 636 &waiter, BoundNetLog()));
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 scoped_ptr<HttpStreamRequest> request( 765 scoped_ptr<HttpStreamRequest> request(
604 session->http_stream_factory()->RequestStream( 766 session->http_stream_factory()->RequestStream(
605 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, 767 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config,
606 &waiter, BoundNetLog())); 768 &waiter, BoundNetLog()));
607 769
608 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, request->GetLoadState()); 770 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, request->GetLoadState());
609 771
610 waiter.WaitForStream(); 772 waiter.WaitForStream();
611 } 773 }
612 774
775 TEST(HttpStreamFactoryTest, RequestHttpStream) {
776 SessionDependencies session_deps(ProxyService::CreateDirect());
777
778 StaticSocketDataProvider socket_data;
779 socket_data.set_connect_data(MockConnect(ASYNC, OK));
780 session_deps.socket_factory.AddSocketDataProvider(&socket_data);
781
782 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
783 MockHttpStreamFactoryImpl* http_stream_factory =
784 new MockHttpStreamFactoryImpl(session.get(), false);
785 HttpNetworkSessionPeer(session).SetHttpStreamFactory(http_stream_factory);
786
787 // Now request a stream. It should succeed using the second proxy in the
788 // list.
789 HttpRequestInfo request_info;
790 request_info.method = "GET";
791 request_info.url = GURL("http://www.google.com");
792 request_info.load_flags = 0;
793
794 SSLConfig ssl_config;
795 StreamRequestWaiter waiter;
796 scoped_ptr<HttpStreamRequest> request(
797 session->http_stream_factory()->RequestStream(
798 request_info,
799 DEFAULT_PRIORITY,
800 ssl_config,
801 ssl_config,
802 &waiter,
803 BoundNetLog()));
804 waiter.WaitForStream();
805 EXPECT_TRUE(waiter.stream_done());
806 EXPECT_TRUE(NULL == waiter.spdy_session());
807 EXPECT_TRUE(NULL == waiter.connection());
mmenke 2013/05/28 21:22:37 There's no code to initialize these. Should be ch
yhirano 2013/05/30 04:44:32 Done.
808 EXPECT_TRUE(NULL != waiter.stream());
809 EXPECT_EQ(1u, http_stream_factory->calls_init_socket_handle_for_http.size());
810 MockHttpStreamFactoryImpl::InitSocketHandleParams params =
811 http_stream_factory->calls_init_socket_handle_for_http[0];
mmenke 2013/05/28 21:22:37 Is all this extra infrastructure necessary? The o
yhirano 2013/05/30 04:44:32 Thank you, you are right. I deleted HttpStreamFact
812 EXPECT_EQ(request_info.url, params.request_url);
813 EXPECT_TRUE(params.proxy_info.is_direct());
814 SSLInfo ssl_info;
815 EXPECT_FALSE(params.socket_handle->socket()->GetSSLInfo(&ssl_info));
816 }
817
818 TEST(HttpStreamFactoryTest, RequestHttpStreamOverSSL) {
819 SessionDependencies session_deps(ProxyService::CreateDirect());
820
821 MockRead mock_read(ASYNC, ERR_IO_PENDING);
822 StaticSocketDataProvider socket_data(&mock_read, 1, NULL, 0);
823 socket_data.set_connect_data(MockConnect(ASYNC, OK));
824 session_deps.socket_factory.AddSocketDataProvider(&socket_data);
825
826 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
827 ssl_socket_data.protocol_negotiated = kProtoSPDY3;
828 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_socket_data);
829
830 SSLSocketDataProvider ssl_socket_data2(ASYNC, OK);
831 ssl_socket_data2.protocol_negotiated = kProtoSPDY3;
832 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_socket_data2);
833
834 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
835
836 MockHttpStreamFactoryImpl* http_stream_factory =
837 new MockHttpStreamFactoryImpl(session.get(), false);
838 HttpNetworkSessionPeer(session).SetHttpStreamFactory(http_stream_factory);
839
840 // Now request a stream. It should succeed using the second proxy in the
841 // list.
842 HttpRequestInfo request_info;
843 request_info.method = "GET";
844 request_info.url = GURL("https://www.google.com");
845 request_info.load_flags = 0;
846
847 SSLConfig ssl_config;
848 StreamRequestWaiter waiter;
849 scoped_ptr<HttpStreamRequest> request(
850 session->http_stream_factory()->RequestStream(
851 request_info,
852 DEFAULT_PRIORITY,
853 ssl_config,
854 ssl_config,
855 &waiter,
856 BoundNetLog()));
857 waiter.WaitForStream();
858 EXPECT_TRUE(waiter.stream_done());
859 EXPECT_TRUE(NULL == waiter.spdy_session());
860 EXPECT_TRUE(NULL == waiter.connection());
861 EXPECT_TRUE(NULL != waiter.stream());
862 EXPECT_EQ(1u, http_stream_factory->calls_init_socket_handle_for_http.size());
863 MockHttpStreamFactoryImpl::InitSocketHandleParams params =
864 http_stream_factory->calls_init_socket_handle_for_http[0];
865 EXPECT_EQ(request_info.url, params.request_url);
866 EXPECT_TRUE(params.proxy_info.is_direct());
867 SSLInfo ssl_info;
868 EXPECT_TRUE(params.socket_handle->socket()->GetSSLInfo(&ssl_info));
869 }
870
871 TEST(HttpStreamFactoryTest, RequestHttpStreamOverProxy) {
872 SessionDependencies session_deps(ProxyService::CreateFixed("myproxy:8888"));
873
874 StaticSocketDataProvider socket_data;
875 socket_data.set_connect_data(MockConnect(ASYNC, OK));
876 session_deps.socket_factory.AddSocketDataProvider(&socket_data);
877
878 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
879 MockHttpStreamFactoryImpl* http_stream_factory =
880 new MockHttpStreamFactoryImpl(session.get(), false);
881 HttpNetworkSessionPeer(session).SetHttpStreamFactory(http_stream_factory);
882
883 // Now request a stream. It should succeed using the second proxy in the
884 // list.
885 HttpRequestInfo request_info;
886 request_info.method = "GET";
887 request_info.url = GURL("http://www.google.com");
888 request_info.load_flags = 0;
889
890 SSLConfig ssl_config;
891 StreamRequestWaiter waiter;
892 scoped_ptr<HttpStreamRequest> request(
893 session->http_stream_factory()->RequestStream(
894 request_info,
895 DEFAULT_PRIORITY,
896 ssl_config,
897 ssl_config,
898 &waiter,
899 BoundNetLog()));
900 waiter.WaitForStream();
901 EXPECT_TRUE(waiter.stream_done());
902 EXPECT_TRUE(NULL == waiter.spdy_session());
903 EXPECT_TRUE(NULL == waiter.connection());
904 EXPECT_TRUE(NULL != waiter.stream());
905 EXPECT_EQ(1u, http_stream_factory->calls_init_socket_handle_for_http.size());
906 MockHttpStreamFactoryImpl::InitSocketHandleParams params =
907 http_stream_factory->calls_init_socket_handle_for_http[0];
908 EXPECT_EQ(request_info.url, params.request_url);
909 EXPECT_FALSE(params.proxy_info.is_direct());
910 SSLInfo ssl_info;
911 EXPECT_FALSE(params.socket_handle->socket()->GetSSLInfo(&ssl_info));
912 }
913
914 TEST(HttpStreamFactoryTest, RequestWebSocketBasicStream) {
915 SessionDependencies session_deps(ProxyService::CreateDirect());
916
917 StaticSocketDataProvider socket_data;
918 socket_data.set_connect_data(MockConnect(ASYNC, OK));
919 session_deps.socket_factory.AddSocketDataProvider(&socket_data);
920
921 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
922 MockHttpStreamFactoryImpl* websocket_stream_factory =
923 new MockHttpStreamFactoryImpl(session.get(), true);
924 HttpNetworkSessionPeer(session).SetWebSocketStreamFactory(
925 websocket_stream_factory);
926
927 // Now request a stream.
928 HttpRequestInfo request_info;
929 request_info.method = "GET";
930 request_info.url = GURL("ws://www.google.com");
931 request_info.load_flags = 0;
932
933 SSLConfig ssl_config;
934 StreamRequestWaiter waiter;
935 WebSocketStreamFactory factory;
936 scoped_ptr<HttpStreamRequest> request(
937 session->websocket_stream_factory()->RequestWebSocketStream(
938 request_info,
939 DEFAULT_PRIORITY,
940 ssl_config,
941 ssl_config,
942 &waiter,
943 &factory,
944 BoundNetLog()));
945 waiter.WaitForStream();
946 EXPECT_TRUE(waiter.stream_done());
947 EXPECT_TRUE(NULL == waiter.stream());
948 EXPECT_TRUE(NULL != waiter.websocket_stream());
949 EXPECT_EQ(WebSocketStreamBase::kStreamTypeBasic,
950 waiter.websocket_stream()->type());
951 EXPECT_EQ(1u,
952 websocket_stream_factory->calls_init_socket_handle_for_http.size());
953 MockHttpStreamFactoryImpl::InitSocketHandleParams params =
954 websocket_stream_factory->calls_init_socket_handle_for_http[0];
955 EXPECT_EQ(request_info.url, params.request_url);
956 EXPECT_TRUE(params.proxy_info.is_direct());
957 SSLInfo ssl_info;
958 EXPECT_FALSE(params.socket_handle->socket()->GetSSLInfo(&ssl_info));
959 }
960
961 TEST(HttpStreamFactoryTest, RequestWebSocketBasicStreamOverSSL) {
962 ScopedForceSpdySsl use_spdy(false);
963 SessionDependencies session_deps(ProxyService::CreateDirect());
964
965 MockRead mock_read(ASYNC, ERR_IO_PENDING);
966 StaticSocketDataProvider socket_data(&mock_read, 1, NULL, 0);
967 socket_data.set_connect_data(MockConnect(ASYNC, OK));
968 session_deps.socket_factory.AddSocketDataProvider(&socket_data);
969
970 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
971 ssl_socket_data.protocol_negotiated = kProtoSPDY3;
972 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_socket_data);
973
974 SSLSocketDataProvider ssl_socket_data2(ASYNC, OK);
975 ssl_socket_data2.protocol_negotiated = kProtoSPDY3;
976 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl_socket_data2);
977
978 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
979 MockHttpStreamFactoryImpl* websocket_stream_factory =
980 new MockHttpStreamFactoryImpl(session.get(), true);
981 HttpNetworkSessionPeer(session).SetWebSocketStreamFactory(
982 websocket_stream_factory);
983
984 // Now request a stream.
985 HttpRequestInfo request_info;
986 request_info.method = "GET";
987 request_info.url = GURL("wss://www.google.com");
988 request_info.load_flags = 0;
989
990 SSLConfig ssl_config;
991 StreamRequestWaiter waiter;
992 WebSocketStreamFactory factory;
993 scoped_ptr<HttpStreamRequest> request(
994 session->websocket_stream_factory()->RequestWebSocketStream(
995 request_info,
996 DEFAULT_PRIORITY,
997 ssl_config,
998 ssl_config,
999 &waiter,
1000 &factory,
1001 BoundNetLog()));
1002 waiter.WaitForStream();
1003 EXPECT_TRUE(waiter.stream_done());
1004 EXPECT_TRUE(NULL == waiter.stream());
1005 EXPECT_TRUE(NULL != waiter.websocket_stream());
1006 EXPECT_EQ(WebSocketStreamBase::kStreamTypeBasic,
1007 waiter.websocket_stream()->type());
1008 EXPECT_EQ(1u,
1009 websocket_stream_factory->calls_init_socket_handle_for_http.size());
1010 MockHttpStreamFactoryImpl::InitSocketHandleParams params =
1011 websocket_stream_factory->calls_init_socket_handle_for_http[0];
1012 EXPECT_EQ(request_info.url, params.request_url);
1013 EXPECT_TRUE(params.proxy_info.is_direct());
1014 SSLInfo ssl_info;
1015 EXPECT_TRUE(params.socket_handle->socket()->GetSSLInfo(&ssl_info));
1016 }
1017
1018 TEST(HttpStreamFactoryTest, RequestSpdyHttpStream) {
1019 ScopedForceSpdySsl use_spdy(true);
1020 SpdySessionDependencies session_deps(kProtoSPDY3,
1021 ProxyService::CreateDirect());
1022
1023 MockRead mock_read(ASYNC, OK);
1024 StaticSocketDataProvider socket_data(&mock_read, 1, NULL, 0);
1025 socket_data.set_connect_data(MockConnect(ASYNC, OK));
1026 session_deps.socket_factory->AddSocketDataProvider(&socket_data);
1027
1028 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
1029 ssl_socket_data.protocol_negotiated = kProtoSPDY3;
1030 session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data);
1031
1032 HostPortPair host_port_pair("www.google.com", 80);
1033 scoped_refptr<HttpNetworkSession>
1034 session(SpdySessionDependencies::SpdyCreateSession(&session_deps));
1035 MockHttpStreamFactoryImpl* http_stream_factory =
1036 new MockHttpStreamFactoryImpl(session.get(), false);
1037 HttpNetworkSessionPeer(session).SetHttpStreamFactory(http_stream_factory);
1038
1039 // Now request a stream.
1040 HttpRequestInfo request_info;
1041 request_info.method = "GET";
1042 request_info.url = GURL("https://www.google.com");
1043 request_info.load_flags = 0;
1044
1045 SSLConfig ssl_config;
1046 StreamRequestWaiter waiter;
1047 scoped_ptr<HttpStreamRequest> request(
1048 session->http_stream_factory()->RequestStream(
1049 request_info,
1050 DEFAULT_PRIORITY,
1051 ssl_config,
1052 ssl_config,
1053 &waiter,
1054 BoundNetLog()));
1055 waiter.WaitForStream();
1056 EXPECT_TRUE(waiter.stream_done());
1057 EXPECT_TRUE(NULL == waiter.websocket_stream());
1058 EXPECT_TRUE(NULL != waiter.stream());
1059 EXPECT_TRUE(waiter.stream()->IsSpdyHttpStream());
1060 EXPECT_EQ(1u, http_stream_factory->calls_init_socket_handle_for_http.size());
1061 MockHttpStreamFactoryImpl::InitSocketHandleParams params =
1062 http_stream_factory->calls_init_socket_handle_for_http[0];
1063 EXPECT_EQ(request_info.url, params.request_url);
1064 EXPECT_TRUE(params.proxy_info.is_direct());
1065 SSLInfo ssl_info;
1066 EXPECT_TRUE(params.socket_handle->socket()->GetSSLInfo(&ssl_info));
1067 }
1068
1069 TEST(HttpStreamFactoryTest, RequestWebSocketSpdyStream) {
1070 ScopedForceSpdySsl use_spdy(true);
1071 SpdySessionDependencies session_deps(kProtoSPDY3,
1072 ProxyService::CreateDirect());
1073
1074 MockRead mock_read(ASYNC, ERR_IO_PENDING);
1075 StaticSocketDataProvider socket_data(&mock_read, 1, NULL, 0);
1076 socket_data.set_connect_data(MockConnect(ASYNC, OK));
1077 session_deps.socket_factory->AddSocketDataProvider(&socket_data);
1078
1079 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
1080 ssl_socket_data.protocol_negotiated = kProtoSPDY3;
1081 session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data);
1082
1083 SSLSocketDataProvider ssl_socket_data2(ASYNC, OK);
1084 ssl_socket_data2.protocol_negotiated = kProtoSPDY3;
1085 session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data2);
1086
1087 HostPortPair host_port_pair("www.google.com", 80);
1088 scoped_refptr<HttpNetworkSession>
1089 session(SpdySessionDependencies::SpdyCreateSession(&session_deps));
1090 MockHttpStreamFactoryImpl* websocket_stream_factory =
1091 new MockHttpStreamFactoryImpl(session.get(), true);
1092 HttpNetworkSessionPeer(session).SetWebSocketStreamFactory(
1093 websocket_stream_factory);
1094
1095 // Now request a stream.
1096 HttpRequestInfo request_info;
1097 request_info.method = "GET";
1098 request_info.url = GURL("wss://www.google.com");
1099 request_info.load_flags = 0;
1100
1101 SSLConfig ssl_config;
1102 StreamRequestWaiter waiter1;
1103 WebSocketStreamFactory factory;
1104 scoped_ptr<HttpStreamRequest> request1(
1105 session->websocket_stream_factory()->RequestWebSocketStream(
1106 request_info,
1107 DEFAULT_PRIORITY,
1108 ssl_config,
1109 ssl_config,
1110 &waiter1,
1111 &factory,
1112 BoundNetLog()));
1113 waiter1.WaitForStream();
1114 EXPECT_TRUE(waiter1.stream_done());
1115 EXPECT_TRUE(NULL != waiter1.websocket_stream());
1116 EXPECT_EQ(WebSocketStreamBase::kStreamTypeSpdy,
1117 waiter1.websocket_stream()->type());
1118 EXPECT_TRUE(NULL == waiter1.connection());
1119 EXPECT_TRUE(NULL == waiter1.stream());
1120
1121 StreamRequestWaiter waiter2;
1122 scoped_ptr<HttpStreamRequest> request2(
1123 session->websocket_stream_factory()->RequestWebSocketStream(
1124 request_info,
1125 DEFAULT_PRIORITY,
1126 ssl_config,
1127 ssl_config,
1128 &waiter2,
1129 &factory,
1130 BoundNetLog()));
1131 waiter2.WaitForStream();
1132 EXPECT_TRUE(waiter2.stream_done());
1133 EXPECT_TRUE(NULL != waiter2.websocket_stream());
1134 EXPECT_EQ(WebSocketStreamBase::kStreamTypeSpdy,
1135 waiter2.websocket_stream()->type());
1136 EXPECT_TRUE(NULL == waiter2.connection());
1137 EXPECT_TRUE(NULL == waiter2.stream());
1138 EXPECT_NE(waiter2.websocket_stream(), waiter1.websocket_stream());
1139 EXPECT_EQ(static_cast<WebSocketSpdyStream*>(waiter2.websocket_stream())->
1140 spdy_session(),
1141 static_cast<WebSocketSpdyStream*>(waiter1.websocket_stream())->
1142 spdy_session());
1143
1144 EXPECT_EQ(1u,
1145 websocket_stream_factory->calls_init_socket_handle_for_http.size());
1146 MockHttpStreamFactoryImpl::InitSocketHandleParams params =
1147 websocket_stream_factory->calls_init_socket_handle_for_http[0];
1148 EXPECT_EQ(request_info.url, params.request_url);
1149 EXPECT_TRUE(params.proxy_info.is_direct());
1150 SSLInfo ssl_info;
1151 EXPECT_TRUE(params.socket_handle->socket()->GetSSLInfo(&ssl_info));
1152 }
1153
613 } // namespace 1154 } // namespace
614 1155
615 } // namespace net 1156 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698