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

Side by Side Diff: net/spdy/spdy_network_transaction_unittest.cc

Issue 6684019: Reland rest of r77399. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « net/socket/client_socket_pool_base.cc ('k') | net/url_request/url_request.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_network_transaction.h" 5 #include "net/http/http_network_transaction.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "net/base/auth.h" 10 #include "net/base/auth.h"
11 #include "net/base/net_log_unittest.h" 11 #include "net/base/net_log_unittest.h"
12 #include "net/http/http_network_session_peer.h" 12 #include "net/http/http_network_session_peer.h"
13 #include "net/http/http_transaction_unittest.h" 13 #include "net/http/http_transaction_unittest.h"
14 #include "net/socket/client_socket_pool_base.h"
14 #include "net/spdy/spdy_http_stream.h" 15 #include "net/spdy/spdy_http_stream.h"
15 #include "net/spdy/spdy_http_utils.h" 16 #include "net/spdy/spdy_http_utils.h"
16 #include "net/spdy/spdy_session.h" 17 #include "net/spdy/spdy_session.h"
17 #include "net/spdy/spdy_session_pool.h" 18 #include "net/spdy/spdy_session_pool.h"
18 #include "net/spdy/spdy_test_util.h" 19 #include "net/spdy/spdy_test_util.h"
19 #include "net/url_request/url_request_test_util.h" 20 #include "net/url_request/url_request_test_util.h"
20 #include "testing/platform_test.h" 21 #include "testing/platform_test.h"
21 22
22 //----------------------------------------------------------------------------- 23 //-----------------------------------------------------------------------------
23 24
24 namespace net { 25 namespace net {
25 26
26 // This is the expected list of advertised protocols from the browser's NPN 27 // This is the expected list of advertised protocols from the browser's NPN
27 // list. 28 // list.
28 static const char kExpectedNPNString[] = "\x08http/1.1\x06spdy/2"; 29 static const char kExpectedNPNString[] = "\x08http/1.1\x06spdy/2";
29 30
30 enum SpdyNetworkTransactionTestTypes { 31 enum SpdyNetworkTransactionTestTypes {
31 SPDYNPN, 32 SPDYNPN,
32 SPDYNOSSL, 33 SPDYNOSSL,
33 SPDYSSL, 34 SPDYSSL,
34 }; 35 };
35 class SpdyNetworkTransactionTest 36 class SpdyNetworkTransactionTest
36 : public ::testing::TestWithParam<SpdyNetworkTransactionTestTypes> { 37 : public ::testing::TestWithParam<SpdyNetworkTransactionTestTypes> {
37 protected: 38 protected:
39
38 virtual void SetUp() { 40 virtual void SetUp() {
39 // By default, all tests turn off compression. 41 // By default, all tests turn off compression.
40 EnableCompression(false); 42 EnableCompression(false);
41 google_get_request_initialized_ = false; 43 google_get_request_initialized_ = false;
42 google_post_request_initialized_ = false; 44 google_post_request_initialized_ = false;
43 google_chunked_post_request_initialized_ = false; 45 google_chunked_post_request_initialized_ = false;
46
47 backup_jobs_prev_value_ =
48 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
49 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
50 false);
44 } 51 }
45 52
46 virtual void TearDown() { 53 virtual void TearDown() {
47 // Empty the current queue. 54 // Empty the current queue.
48 MessageLoop::current()->RunAllPending(); 55 MessageLoop::current()->RunAllPending();
56 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
57 backup_jobs_prev_value_);
49 } 58 }
50 59
51 struct TransactionHelperResult { 60 struct TransactionHelperResult {
52 int rv; 61 int rv;
53 std::string status_line; 62 std::string status_line;
54 std::string response_data; 63 std::string response_data;
55 HttpResponseInfo response_info; 64 HttpResponseInfo response_info;
56 }; 65 };
57 66
58 void EnableCompression(bool enabled) { 67 void EnableCompression(bool enabled) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 } 169 }
161 170
162 // Verify responses. 171 // Verify responses.
163 const HttpResponseInfo* response = trans_->GetResponseInfo(); 172 const HttpResponseInfo* response = trans_->GetResponseInfo();
164 ASSERT_TRUE(response != NULL); 173 ASSERT_TRUE(response != NULL);
165 ASSERT_TRUE(response->headers != NULL); 174 ASSERT_TRUE(response->headers != NULL);
166 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 175 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
167 EXPECT_EQ(spdy_enabled_, response->was_fetched_via_spdy); 176 EXPECT_EQ(spdy_enabled_, response->was_fetched_via_spdy);
168 if (test_type_ == SPDYNPN && spdy_enabled_) { 177 if (test_type_ == SPDYNPN && spdy_enabled_) {
169 EXPECT_TRUE(response->was_npn_negotiated); 178 EXPECT_TRUE(response->was_npn_negotiated);
170 EXPECT_TRUE(response->was_alternate_protocol_available);
171 } else { 179 } else {
172 EXPECT_TRUE(!response->was_npn_negotiated); 180 EXPECT_TRUE(!response->was_npn_negotiated);
173 EXPECT_TRUE(!response->was_alternate_protocol_available);
174 } 181 }
175 // If SPDY is not enabled, a HTTP request should not be diverted 182 // If SPDY is not enabled, a HTTP request should not be diverted
176 // over a SSL session. 183 // over a SSL session.
177 if (!spdy_enabled_) { 184 if (!spdy_enabled_) {
178 EXPECT_EQ(request_.url.SchemeIs("https"), 185 EXPECT_EQ(request_.url.SchemeIs("https"),
179 response->was_npn_negotiated); 186 response->was_npn_negotiated);
180 } 187 }
181 EXPECT_EQ("192.0.2.33", response->socket_address.host()); 188 EXPECT_EQ("192.0.2.33", response->socket_address.host());
182 EXPECT_EQ(0, response->socket_address.port()); 189 EXPECT_EQ(0, response->socket_address.port());
183 output_.status_line = response->headers->GetStatusLine(); 190 output_.status_line = response->headers->GetStatusLine();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 DCHECK(!deterministic_); 237 DCHECK(!deterministic_);
231 data_vector_.push_back(data); 238 data_vector_.push_back(data);
232 linked_ptr<SSLSocketDataProvider> ssl_( 239 linked_ptr<SSLSocketDataProvider> ssl_(
233 new SSLSocketDataProvider(true, OK)); 240 new SSLSocketDataProvider(true, OK));
234 if (test_type_ == SPDYNPN) { 241 if (test_type_ == SPDYNPN) {
235 ssl_->next_proto_status = SSLClientSocket::kNextProtoNegotiated; 242 ssl_->next_proto_status = SSLClientSocket::kNextProtoNegotiated;
236 ssl_->next_proto = "spdy/2"; 243 ssl_->next_proto = "spdy/2";
237 ssl_->was_npn_negotiated = true; 244 ssl_->was_npn_negotiated = true;
238 } 245 }
239 ssl_vector_.push_back(ssl_); 246 ssl_vector_.push_back(ssl_);
240 if(test_type_ == SPDYNPN || test_type_ == SPDYSSL) 247 if (test_type_ == SPDYNPN || test_type_ == SPDYSSL)
241 session_deps_->socket_factory->AddSSLSocketDataProvider(ssl_.get()); 248 session_deps_->socket_factory->AddSSLSocketDataProvider(ssl_.get());
242 session_deps_->socket_factory->AddSocketDataProvider(data); 249 session_deps_->socket_factory->AddSocketDataProvider(data);
250 if (test_type_ == SPDYNPN) {
251 MockConnect never_finishing_connect(false, ERR_IO_PENDING);
252 linked_ptr<StaticSocketDataProvider>
253 hanging_non_alternate_protocol_socket(
254 new StaticSocketDataProvider(NULL, 0, NULL, 0));
255 hanging_non_alternate_protocol_socket->set_connect_data(
256 never_finishing_connect);
257 session_deps_->socket_factory->AddSocketDataProvider(
258 hanging_non_alternate_protocol_socket.get());
259 alternate_vector_.push_back(hanging_non_alternate_protocol_socket);
260 }
243 } 261 }
244 262
245 void AddDeterministicData(DeterministicSocketData* data) { 263 void AddDeterministicData(DeterministicSocketData* data) {
246 DCHECK(deterministic_); 264 DCHECK(deterministic_);
247 data_vector_.push_back(data); 265 data_vector_.push_back(data);
248 linked_ptr<SSLSocketDataProvider> ssl_( 266 linked_ptr<SSLSocketDataProvider> ssl_(
249 new SSLSocketDataProvider(true, OK)); 267 new SSLSocketDataProvider(true, OK));
250 if (test_type_ == SPDYNPN) { 268 if (test_type_ == SPDYNPN) {
251 ssl_->next_proto_status = SSLClientSocket::kNextProtoNegotiated; 269 ssl_->next_proto_status = SSLClientSocket::kNextProtoNegotiated;
252 ssl_->next_proto = "spdy/2"; 270 ssl_->next_proto = "spdy/2";
253 ssl_->was_npn_negotiated = true; 271 ssl_->was_npn_negotiated = true;
254 } 272 }
255 ssl_vector_.push_back(ssl_); 273 ssl_vector_.push_back(ssl_);
256 if(test_type_ == SPDYNPN || test_type_ == SPDYSSL) 274 if (test_type_ == SPDYNPN || test_type_ == SPDYSSL) {
257 session_deps_->deterministic_socket_factory-> 275 session_deps_->deterministic_socket_factory->
258 AddSSLSocketDataProvider(ssl_.get()); 276 AddSSLSocketDataProvider(ssl_.get());
277 }
259 session_deps_->deterministic_socket_factory->AddSocketDataProvider(data); 278 session_deps_->deterministic_socket_factory->AddSocketDataProvider(data);
279 if (test_type_ == SPDYNPN) {
280 MockConnect never_finishing_connect(false, ERR_IO_PENDING);
281 scoped_refptr<DeterministicSocketData>
282 hanging_non_alternate_protocol_socket(
283 new DeterministicSocketData(NULL, 0, NULL, 0));
284 hanging_non_alternate_protocol_socket->set_connect_data(
285 never_finishing_connect);
286 session_deps_->deterministic_socket_factory->AddSocketDataProvider(
287 hanging_non_alternate_protocol_socket);
288 alternate_deterministic_vector_.push_back(
289 hanging_non_alternate_protocol_socket);
290 }
260 } 291 }
261 292
262 // This can only be called after RunPreTestSetup. It adds a Data Provider, 293 // This can only be called after RunPreTestSetup. It adds a Data Provider,
263 // but not a corresponding SSL data provider 294 // but not a corresponding SSL data provider
264 void AddDataNoSSL(StaticSocketDataProvider* data) { 295 void AddDataNoSSL(StaticSocketDataProvider* data) {
265 DCHECK(!deterministic_); 296 DCHECK(!deterministic_);
266 session_deps_->socket_factory->AddSocketDataProvider(data); 297 session_deps_->socket_factory->AddSocketDataProvider(data);
267 } 298 }
268 void AddDataNoSSL(DeterministicSocketData* data) { 299 void AddDataNoSSL(DeterministicSocketData* data) {
269 DCHECK(deterministic_); 300 DCHECK(deterministic_);
(...skipping 12 matching lines...) Expand all
282 } 313 }
283 scoped_ptr<SpdySessionDependencies>& session_deps() { 314 scoped_ptr<SpdySessionDependencies>& session_deps() {
284 return session_deps_; 315 return session_deps_;
285 } 316 }
286 int port() const { return port_; } 317 int port() const { return port_; }
287 SpdyNetworkTransactionTestTypes test_type() const { return test_type_; } 318 SpdyNetworkTransactionTestTypes test_type() const { return test_type_; }
288 319
289 private: 320 private:
290 typedef std::vector<StaticSocketDataProvider*> DataVector; 321 typedef std::vector<StaticSocketDataProvider*> DataVector;
291 typedef std::vector<linked_ptr<SSLSocketDataProvider> > SSLVector; 322 typedef std::vector<linked_ptr<SSLSocketDataProvider> > SSLVector;
323 typedef std::vector<linked_ptr<StaticSocketDataProvider> > AlternateVector;
324 typedef std::vector<scoped_refptr<DeterministicSocketData> >
325 AlternateDeterministicVector;
292 HttpRequestInfo request_; 326 HttpRequestInfo request_;
293 scoped_ptr<SpdySessionDependencies> session_deps_; 327 scoped_ptr<SpdySessionDependencies> session_deps_;
294 scoped_refptr<HttpNetworkSession> session_; 328 scoped_refptr<HttpNetworkSession> session_;
295 TransactionHelperResult output_; 329 TransactionHelperResult output_;
296 scoped_ptr<StaticSocketDataProvider> first_transaction_; 330 scoped_ptr<StaticSocketDataProvider> first_transaction_;
297 SSLVector ssl_vector_; 331 SSLVector ssl_vector_;
298 TestCompletionCallback callback; 332 TestCompletionCallback callback;
299 scoped_ptr<HttpNetworkTransaction> trans_; 333 scoped_ptr<HttpNetworkTransaction> trans_;
300 scoped_ptr<HttpNetworkTransaction> trans_http_; 334 scoped_ptr<HttpNetworkTransaction> trans_http_;
301 DataVector data_vector_; 335 DataVector data_vector_;
336 AlternateVector alternate_vector_;
337 AlternateDeterministicVector alternate_deterministic_vector_;
302 const BoundNetLog& log_; 338 const BoundNetLog& log_;
303 SpdyNetworkTransactionTestTypes test_type_; 339 SpdyNetworkTransactionTestTypes test_type_;
304 int port_; 340 int port_;
305 bool deterministic_; 341 bool deterministic_;
306 bool spdy_enabled_; 342 bool spdy_enabled_;
307 }; 343 };
308 344
309 void ConnectStatusHelperWithExpectedStatus(const MockRead& status, 345 void ConnectStatusHelperWithExpectedStatus(const MockRead& status,
310 int expected_status); 346 int expected_status);
311 347
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 } 504 }
469 505
470 private: 506 private:
471 bool google_get_request_initialized_; 507 bool google_get_request_initialized_;
472 bool google_post_request_initialized_; 508 bool google_post_request_initialized_;
473 bool google_chunked_post_request_initialized_; 509 bool google_chunked_post_request_initialized_;
474 HttpRequestInfo google_get_request_; 510 HttpRequestInfo google_get_request_;
475 HttpRequestInfo google_post_request_; 511 HttpRequestInfo google_post_request_;
476 HttpRequestInfo google_chunked_post_request_; 512 HttpRequestInfo google_chunked_post_request_;
477 HttpRequestInfo google_get_push_request_; 513 HttpRequestInfo google_get_push_request_;
514
515 bool backup_jobs_prev_value_;
478 }; 516 };
479 517
480 //----------------------------------------------------------------------------- 518 //-----------------------------------------------------------------------------
481 // All tests are run with three different connection types: SPDY after NPN 519 // All tests are run with three different connection types: SPDY after NPN
482 // negotiation, SPDY without SSL, and SPDY with SSL. 520 // negotiation, SPDY without SSL, and SPDY with SSL.
483 INSTANTIATE_TEST_CASE_P(Spdy, 521 INSTANTIATE_TEST_CASE_P(Spdy,
484 SpdyNetworkTransactionTest, 522 SpdyNetworkTransactionTest,
485 ::testing::Values(SPDYNOSSL, SPDYSSL, SPDYNPN)); 523 ::testing::Values(SPDYNOSSL, SPDYSSL, SPDYNPN));
486 524
487 525
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 CreateMockRead(*resp2, 4), 735 CreateMockRead(*resp2, 4),
698 CreateMockRead(*body2), 736 CreateMockRead(*body2),
699 CreateMockRead(*fbody), 737 CreateMockRead(*fbody),
700 CreateMockRead(*fbody2), 738 CreateMockRead(*fbody2),
701 MockRead(true, 0, 0), // EOF 739 MockRead(true, 0, 0), // EOF
702 }; 740 };
703 scoped_refptr<OrderedSocketData> data( 741 scoped_refptr<OrderedSocketData> data(
704 new OrderedSocketData(reads, arraysize(reads), 742 new OrderedSocketData(reads, arraysize(reads),
705 writes, arraysize(writes))); 743 writes, arraysize(writes)));
706 744
707 MockConnect never_finishing_connect(true, ERR_IO_PENDING); 745 MockConnect never_finishing_connect(false, ERR_IO_PENDING);
708 746
709 scoped_refptr<OrderedSocketData> data_placeholder( 747 scoped_refptr<OrderedSocketData> data_placeholder(
710 new OrderedSocketData(NULL, 0, NULL, 0)); 748 new OrderedSocketData(NULL, 0, NULL, 0));
711 data_placeholder->set_connect_data(never_finishing_connect); 749 data_placeholder->set_connect_data(never_finishing_connect);
712 750
713 BoundNetLog log; 751 BoundNetLog log;
714 TransactionHelperResult out; 752 TransactionHelperResult out;
715 NormalSpdyTransactionHelper helper(CreateGetRequest(), 753 NormalSpdyTransactionHelper helper(CreateGetRequest(),
716 BoundNetLog(), GetParam()); 754 BoundNetLog(), GetParam());
717 helper.RunPreTestSetup(); 755 helper.RunPreTestSetup();
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
886 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(5, true)); 924 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(5, true));
887 925
888 spdy::SpdySettings settings; 926 spdy::SpdySettings settings;
889 spdy::SettingsFlagsAndId id(0); 927 spdy::SettingsFlagsAndId id(0);
890 id.set_id(spdy::SETTINGS_MAX_CONCURRENT_STREAMS); 928 id.set_id(spdy::SETTINGS_MAX_CONCURRENT_STREAMS);
891 const size_t max_concurrent_streams = 1; 929 const size_t max_concurrent_streams = 1;
892 930
893 settings.push_back(spdy::SpdySetting(id, max_concurrent_streams)); 931 settings.push_back(spdy::SpdySetting(id, max_concurrent_streams));
894 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings)); 932 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings));
895 933
896 MockWrite writes[] = { CreateMockWrite(*req), 934 MockWrite writes[] = {
897 CreateMockWrite(*req2), 935 CreateMockWrite(*req),
898 CreateMockWrite(*req3), 936 CreateMockWrite(*req2),
937 CreateMockWrite(*req3),
899 }; 938 };
939
900 MockRead reads[] = { 940 MockRead reads[] = {
901 CreateMockRead(*settings_frame, 1), 941 CreateMockRead(*settings_frame, 1),
902 CreateMockRead(*resp), 942 CreateMockRead(*resp),
903 CreateMockRead(*body), 943 CreateMockRead(*body),
904 CreateMockRead(*fbody), 944 CreateMockRead(*fbody),
905 CreateMockRead(*resp2, 7), 945 CreateMockRead(*resp2, 7),
906 CreateMockRead(*body2), 946 CreateMockRead(*body2),
907 CreateMockRead(*fbody2), 947 CreateMockRead(*fbody2),
908 CreateMockRead(*resp3, 12), 948 CreateMockRead(*resp3, 12),
909 CreateMockRead(*body3), 949 CreateMockRead(*body3),
910 CreateMockRead(*fbody3), 950 CreateMockRead(*fbody3),
911 951
912 MockRead(true, 0, 0), // EOF 952 MockRead(true, 0, 0), // EOF
913 }; 953 };
914 954
915 scoped_refptr<OrderedSocketData> data( 955 scoped_refptr<OrderedSocketData> data(
916 new OrderedSocketData(reads, arraysize(reads), 956 new OrderedSocketData(reads, arraysize(reads),
917 writes, arraysize(writes))); 957 writes, arraysize(writes)));
918 scoped_refptr<OrderedSocketData> data_placeholder( 958 scoped_refptr<OrderedSocketData> data_placeholder(
919 new OrderedSocketData(NULL, 0, NULL, 0)); 959 new OrderedSocketData(NULL, 0, NULL, 0));
920 960
921 BoundNetLog log; 961 BoundNetLog log;
922 TransactionHelperResult out; 962 TransactionHelperResult out;
923 { 963 {
924 NormalSpdyTransactionHelper helper(CreateGetRequest(), 964 NormalSpdyTransactionHelper helper(CreateGetRequest(),
925 BoundNetLog(), GetParam()); 965 BoundNetLog(), GetParam());
926 helper.RunPreTestSetup(); 966 helper.RunPreTestSetup();
927 helper.AddData(data.get()); 967 helper.AddData(data.get());
928 // We require placeholder data because three get requests are sent out, so 968 // We require placeholder data because three get requests are sent out, so
929 // there needs to be three sets of SSL connection data. 969 // there needs to be three sets of SSL connection data.
930 helper.AddData(data_placeholder.get()); 970 helper.AddData(data_placeholder.get());
931 helper.AddData(data_placeholder.get()); 971 helper.AddData(data_placeholder.get());
932 scoped_ptr<HttpNetworkTransaction> trans1( 972 scoped_ptr<HttpNetworkTransaction> trans1(
933 new HttpNetworkTransaction(helper.session())); 973 new HttpNetworkTransaction(helper.session()));
934 scoped_ptr<HttpNetworkTransaction> trans2( 974 scoped_ptr<HttpNetworkTransaction> trans2(
935 new HttpNetworkTransaction(helper.session())); 975 new HttpNetworkTransaction(helper.session()));
936 scoped_ptr<HttpNetworkTransaction> trans3( 976 scoped_ptr<HttpNetworkTransaction> trans3(
937 new HttpNetworkTransaction(helper.session())); 977 new HttpNetworkTransaction(helper.session()));
938 978
939 TestCompletionCallback callback1; 979 TestCompletionCallback callback1;
940 TestCompletionCallback callback2; 980 TestCompletionCallback callback2;
941 TestCompletionCallback callback3; 981 TestCompletionCallback callback3;
(...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 }; 1749 };
1710 1750
1711 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 1751 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1712 MockRead reads[] = { 1752 MockRead reads[] = {
1713 CreateMockRead(*resp.get(), 1, true), 1753 CreateMockRead(*resp.get(), 1, true),
1714 MockRead(true, 0, 0, 4) // EOF 1754 MockRead(true, 0, 0, 4) // EOF
1715 }; 1755 };
1716 1756
1717 scoped_refptr<DeterministicSocketData> data( 1757 scoped_refptr<DeterministicSocketData> data(
1718 new DeterministicSocketData(reads, arraysize(reads), 1758 new DeterministicSocketData(reads, arraysize(reads),
1719 writes, arraysize(writes))); 1759 writes, arraysize(writes)));
1720 NormalSpdyTransactionHelper helper(CreateGetRequest(), 1760 NormalSpdyTransactionHelper helper(CreateGetRequest(),
1721 BoundNetLog(), GetParam()); 1761 BoundNetLog(), GetParam());
1722 helper.SetDeterministic(); 1762 helper.SetDeterministic();
1723 helper.RunPreTestSetup(); 1763 helper.RunPreTestSetup();
1724 helper.AddDeterministicData(data.get()); 1764 helper.AddDeterministicData(data.get());
1725 HttpNetworkTransaction* trans = helper.trans(); 1765 HttpNetworkTransaction* trans = helper.trans();
1726 1766
1727 TestCompletionCallback callback; 1767 TestCompletionCallback callback;
1728 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog()); 1768 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
1729 EXPECT_EQ(ERR_IO_PENDING, rv); 1769 EXPECT_EQ(ERR_IO_PENDING, rv);
(...skipping 2070 matching lines...) Expand 10 before | Expand all | Expand 10 after
3800 MessageLoop::current()->RunAllPending(); 3840 MessageLoop::current()->RunAllPending();
3801 3841
3802 // Verify that we consumed all test data. 3842 // Verify that we consumed all test data.
3803 helper.VerifyDataConsumed(); 3843 helper.VerifyDataConsumed();
3804 3844
3805 EXPECT_EQ(OK, out.rv); 3845 EXPECT_EQ(OK, out.rv);
3806 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3846 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3807 EXPECT_EQ("goodbye world", out.response_data); 3847 EXPECT_EQ("goodbye world", out.response_data);
3808 } 3848 }
3809 3849
3810 TEST_P(SpdyNetworkTransactionTest, ConnectFailureFallbackToHttp) {
3811 MockConnect connects[] = {
3812 MockConnect(true, ERR_NAME_NOT_RESOLVED),
3813 MockConnect(false, ERR_NAME_NOT_RESOLVED),
3814 MockConnect(true, ERR_INTERNET_DISCONNECTED),
3815 MockConnect(false, ERR_INTERNET_DISCONNECTED)
3816 };
3817
3818 for (size_t index = 0; index < arraysize(connects); ++index) {
3819 scoped_ptr<spdy::SpdyFrame> req(
3820 ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
3821 MockWrite writes[] = {
3822 CreateMockWrite(*req),
3823 MockWrite(true, 0, 0) // EOF
3824 };
3825
3826 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
3827 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
3828 MockRead reads[] = {
3829 CreateMockRead(*resp),
3830 CreateMockRead(*body),
3831 MockRead(true, 0, 0) // EOF
3832 };
3833
3834 scoped_refptr<DelayedSocketData> data(
3835 new DelayedSocketData(connects[index], 1, reads, arraysize(reads),
3836 writes, arraysize(writes)));
3837 NormalSpdyTransactionHelper helper(CreateGetRequest(),
3838 BoundNetLog(), GetParam());
3839 helper.RunPreTestSetup();
3840 helper.AddData(data.get());
3841
3842 // Set up http fallback data.
3843 MockRead http_fallback_data[] = {
3844 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
3845 MockRead("hello world!!!"),
3846 MockRead(true, OK),
3847 };
3848
3849 scoped_ptr<StaticSocketDataProvider> http_fallback(
3850 new StaticSocketDataProvider(http_fallback_data,
3851 arraysize(http_fallback_data),
3852 NULL, 0));
3853 helper.AddDataNoSSL(http_fallback.get());
3854 HttpNetworkTransaction* trans = helper.trans();
3855 TestCompletionCallback callback;
3856
3857 int rv = trans->Start(&helper.request(), &callback, BoundNetLog());
3858 EXPECT_EQ(rv, ERR_IO_PENDING);
3859 rv = callback.WaitForResult();
3860 const HttpResponseInfo* response = trans->GetResponseInfo();
3861 if (GetParam() == SPDYNOSSL || GetParam() == SPDYSSL) {
3862 ASSERT_TRUE(response == NULL);
3863 return;
3864 }
3865 if (GetParam() != SPDYNPN)
3866 NOTREACHED();
3867 ASSERT_TRUE(response != NULL);
3868 ASSERT_TRUE(response->headers != NULL);
3869 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
3870 std::string response_data;
3871 rv = ReadTransaction(trans, &response_data);
3872 EXPECT_EQ(OK, rv);
3873
3874 EXPECT_TRUE(!response->was_fetched_via_spdy);
3875 EXPECT_TRUE(!response->was_npn_negotiated);
3876 EXPECT_TRUE(response->was_alternate_protocol_available);
3877 EXPECT_TRUE(http_fallback->at_read_eof());
3878 EXPECT_EQ(0u, data->read_index());
3879 EXPECT_EQ(0u, data->write_index());
3880 EXPECT_EQ("hello world!!!", response_data);
3881 }
3882 }
3883
3884 // Verify that basic buffering works; when multiple data frames arrive 3850 // Verify that basic buffering works; when multiple data frames arrive
3885 // at the same time, ensure that we don't notify a read completion for 3851 // at the same time, ensure that we don't notify a read completion for
3886 // each data frame individually. 3852 // each data frame individually.
3887 TEST_P(SpdyNetworkTransactionTest, Buffering) { 3853 TEST_P(SpdyNetworkTransactionTest, Buffering) {
3888 spdy::SpdyFramer framer; 3854 spdy::SpdyFramer framer;
3889 3855
3890 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 3856 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
3891 MockWrite writes[] = { CreateMockWrite(*req) }; 3857 MockWrite writes[] = { CreateMockWrite(*req) };
3892 3858
3893 // 4 data frames in a single read. 3859 // 4 data frames in a single read.
(...skipping 1756 matching lines...) Expand 10 before | Expand all | Expand 10 after
5650 5616
5651 VerifyStreamsClosed(helper); 5617 VerifyStreamsClosed(helper);
5652 5618
5653 // Verify the SYN_REPLY. 5619 // Verify the SYN_REPLY.
5654 EXPECT_TRUE(response.headers != NULL); 5620 EXPECT_TRUE(response.headers != NULL);
5655 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 5621 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
5656 } 5622 }
5657 } 5623 }
5658 5624
5659 } // namespace net 5625 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/client_socket_pool_base.cc ('k') | net/url_request/url_request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698