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

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

Issue 1117863003: Convert the remaining three SpdyNetworkTransactionTests to SequencedSocketData (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 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
« no previous file with comments | « net/socket/socket_test_util.cc ('k') | no next file » | 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) 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 <string> 5 #include <string>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/bind_helpers.h" 9 #include "base/bind_helpers.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 void FinishDefaultTestWithoutVerification() { 261 void FinishDefaultTestWithoutVerification() {
262 output_.rv = callback_.WaitForResult(); 262 output_.rv = callback_.WaitForResult();
263 if (output_.rv != OK) 263 if (output_.rv != OK)
264 session_->spdy_session_pool()->CloseCurrentSessions(ERR_ABORTED); 264 session_->spdy_session_pool()->CloseCurrentSessions(ERR_ABORTED);
265 } 265 }
266 266
267 // Most tests will want to call this function. In particular, the MockReads 267 // Most tests will want to call this function. In particular, the MockReads
268 // should end with an empty read, and that read needs to be processed to 268 // should end with an empty read, and that read needs to be processed to
269 // ensure proper deletion of the spdy_session_pool. 269 // ensure proper deletion of the spdy_session_pool.
270 void VerifyDataConsumed() { 270 void VerifyDataConsumed() {
271 for (DataVector::iterator it = data_vector_.begin(); 271 for (const SocketDataProvider* provider : data_vector_) {
272 it != data_vector_.end(); ++it) { 272 EXPECT_TRUE(provider->AllReadDataConsumed());
273 EXPECT_TRUE((*it)->at_read_eof()) << "Read count: " 273 EXPECT_TRUE(provider->AllWriteDataConsumed());
274 << (*it)->read_count()
275 << " Read index: "
276 << (*it)->read_index();
277 EXPECT_TRUE((*it)->at_write_eof()) << "Write count: "
278 << (*it)->write_count()
279 << " Write index: "
280 << (*it)->write_index();
281 } 274 }
282 } 275 }
283 276
284 // Occasionally a test will expect to error out before certain reads are 277 // Occasionally a test will expect to error out before certain reads are
285 // processed. In that case we want to explicitly ensure that the reads were 278 // processed. In that case we want to explicitly ensure that the reads were
286 // not processed. 279 // not processed.
287 void VerifyDataNotConsumed() { 280 void VerifyDataNotConsumed() {
288 for (DataVector::iterator it = data_vector_.begin(); 281 for (const SocketDataProvider* provider : data_vector_) {
289 it != data_vector_.end(); ++it) { 282 EXPECT_FALSE(provider->AllReadDataConsumed());
290 EXPECT_TRUE(!(*it)->at_read_eof()) << "Read count: " 283 EXPECT_FALSE(provider->AllWriteDataConsumed());
291 << (*it)->read_count()
292 << " Read index: "
293 << (*it)->read_index();
294 EXPECT_TRUE(!(*it)->at_write_eof()) << "Write count: "
295 << (*it)->write_count()
296 << " Write index: "
297 << (*it)->write_index();
298 } 284 }
299 } 285 }
300 286
301 void RunToCompletion(StaticSocketDataProvider* data) { 287 void RunToCompletion(SocketDataProvider* data) {
302 RunPreTestSetup(); 288 RunPreTestSetup();
303 AddData(data); 289 AddData(data);
304 RunDefaultTest(); 290 RunDefaultTest();
305 VerifyDataConsumed(); 291 VerifyDataConsumed();
306 } 292 }
307 293
308 void RunToCompletionWithSSLData( 294 void RunToCompletionWithSSLData(
309 StaticSocketDataProvider* data, 295 SocketDataProvider* data,
310 scoped_ptr<SSLSocketDataProvider> ssl_provider) { 296 scoped_ptr<SSLSocketDataProvider> ssl_provider) {
311 RunPreTestSetup(); 297 RunPreTestSetup();
312 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass()); 298 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass());
313 RunDefaultTest(); 299 RunDefaultTest();
314 VerifyDataConsumed(); 300 VerifyDataConsumed();
315 } 301 }
316 302
317 void AddData(StaticSocketDataProvider* data) { 303 void AddData(SocketDataProvider* data) {
318 scoped_ptr<SSLSocketDataProvider> ssl_provider( 304 scoped_ptr<SSLSocketDataProvider> ssl_provider(
319 new SSLSocketDataProvider(ASYNC, OK)); 305 new SSLSocketDataProvider(ASYNC, OK));
320 ssl_provider->cert = 306 ssl_provider->cert =
321 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 307 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
322 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass()); 308 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass());
323 } 309 }
324 310
325 void AddDataWithSSLSocketDataProvider( 311 void AddDataWithSSLSocketDataProvider(
326 StaticSocketDataProvider* data, 312 SocketDataProvider* data,
327 scoped_ptr<SSLSocketDataProvider> ssl_provider) { 313 scoped_ptr<SSLSocketDataProvider> ssl_provider) {
328 DCHECK(!deterministic_); 314 DCHECK(!deterministic_);
329 data_vector_.push_back(data); 315 data_vector_.push_back(data);
330 if (ssl_provider->next_proto_status == 316 if (ssl_provider->next_proto_status ==
331 SSLClientSocket::kNextProtoUnsupported) { 317 SSLClientSocket::kNextProtoUnsupported) {
332 ssl_provider->SetNextProto(test_params_.protocol); 318 ssl_provider->SetNextProto(test_params_.protocol);
333 } 319 }
334 320
335 session_deps_->socket_factory->AddSSLSocketDataProvider( 321 session_deps_->socket_factory->AddSSLSocketDataProvider(
336 ssl_provider.get()); 322 ssl_provider.get());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 } 370 }
385 scoped_ptr<SpdySessionDependencies>& session_deps() { 371 scoped_ptr<SpdySessionDependencies>& session_deps() {
386 return session_deps_; 372 return session_deps_;
387 } 373 }
388 int port() const { return port_; } 374 int port() const { return port_; }
389 SpdyNetworkTransactionTestParams test_params() const { 375 SpdyNetworkTransactionTestParams test_params() const {
390 return test_params_; 376 return test_params_;
391 } 377 }
392 378
393 private: 379 private:
394 typedef std::vector<StaticSocketDataProvider*> DataVector; 380 typedef std::vector<SocketDataProvider*> DataVector;
395 typedef ScopedVector<SSLSocketDataProvider> SSLVector; 381 typedef ScopedVector<SSLSocketDataProvider> SSLVector;
396 typedef ScopedVector<StaticSocketDataProvider> AlternateVector; 382 typedef ScopedVector<SocketDataProvider> AlternateVector;
397 typedef ScopedVector<DeterministicSocketData> AlternateDeterministicVector; 383 typedef ScopedVector<DeterministicSocketData> AlternateDeterministicVector;
398 HttpRequestInfo request_; 384 HttpRequestInfo request_;
399 RequestPriority priority_; 385 RequestPriority priority_;
400 scoped_ptr<SpdySessionDependencies> session_deps_; 386 scoped_ptr<SpdySessionDependencies> session_deps_;
401 scoped_refptr<HttpNetworkSession> session_; 387 scoped_refptr<HttpNetworkSession> session_;
402 TransactionHelperResult output_; 388 TransactionHelperResult output_;
403 scoped_ptr<StaticSocketDataProvider> first_transaction_; 389 scoped_ptr<SocketDataProvider> first_transaction_;
404 SSLVector ssl_vector_; 390 SSLVector ssl_vector_;
405 TestCompletionCallback callback_; 391 TestCompletionCallback callback_;
406 scoped_ptr<HttpNetworkTransaction> trans_; 392 scoped_ptr<HttpNetworkTransaction> trans_;
407 scoped_ptr<HttpNetworkTransaction> trans_http_; 393 scoped_ptr<HttpNetworkTransaction> trans_http_;
408 DataVector data_vector_; 394 DataVector data_vector_;
409 AlternateVector alternate_vector_; 395 AlternateVector alternate_vector_;
410 AlternateDeterministicVector alternate_deterministic_vector_; 396 AlternateDeterministicVector alternate_deterministic_vector_;
411 const BoundNetLog log_; 397 const BoundNetLog log_;
412 SpdyNetworkTransactionTestParams test_params_; 398 SpdyNetworkTransactionTestParams test_params_;
413 int port_; 399 int port_;
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 chunked_post_request_initialized_ = true; 546 chunked_post_request_initialized_ = true;
561 } 547 }
562 return chunked_post_request_; 548 return chunked_post_request_;
563 } 549 }
564 550
565 // Read the result of a particular transaction, knowing that we've got 551 // Read the result of a particular transaction, knowing that we've got
566 // multiple transactions in the read pipeline; so as we read, we may have 552 // multiple transactions in the read pipeline; so as we read, we may have
567 // to skip over data destined for other transactions while we consume 553 // to skip over data destined for other transactions while we consume
568 // the data for |trans|. 554 // the data for |trans|.
569 int ReadResult(HttpNetworkTransaction* trans, 555 int ReadResult(HttpNetworkTransaction* trans,
570 StaticSocketDataProvider* data, 556 SocketDataProvider* data,
571 std::string* result) { 557 std::string* result) {
572 const int kSize = 3000; 558 const int kSize = 3000;
573 559
574 int bytes_read = 0; 560 int bytes_read = 0;
575 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kSize)); 561 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kSize));
576 TestCompletionCallback callback; 562 TestCompletionCallback callback;
577 while (true) { 563 while (true) {
578 int rv = trans->Read(buf.get(), kSize, callback.callback()); 564 int rv = trans->Read(buf.get(), kSize, callback.callback());
579 if (rv == ERR_IO_PENDING) { 565 if (rv == ERR_IO_PENDING) {
580 // Multiple transactions may be in the data set. Keep pulling off
581 // reads until we complete our callback.
582 while (!callback.have_result()) {
583 data->CompleteRead();
584 base::RunLoop().RunUntilIdle();
585 }
586 rv = callback.WaitForResult(); 566 rv = callback.WaitForResult();
587 } else if (rv <= 0) { 567 } else if (rv <= 0) {
588 break; 568 break;
589 } 569 }
590 result->append(buf->data(), rv); 570 result->append(buf->data(), rv);
591 bytes_read += rv; 571 bytes_read += rv;
592 } 572 }
593 return bytes_read; 573 return bytes_read;
594 } 574 }
595 575
596 void VerifyStreamsClosed(const NormalSpdyTransactionHelper& helper) { 576 void VerifyStreamsClosed(const NormalSpdyTransactionHelper& helper) {
597 // This lengthy block is reaching into the pool to dig out the active 577 // This lengthy block is reaching into the pool to dig out the active
598 // session. Once we have the session, we verify that the streams are 578 // session. Once we have the session, we verify that the streams are
599 // all closed and not leaked at this point. 579 // all closed and not leaked at this point.
600 const GURL& url = helper.request().url; 580 const GURL& url = helper.request().url;
601 HostPortPair host_port_pair(url.host(), 443); 581 HostPortPair host_port_pair(url.host(), 443);
602 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 582 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
603 PRIVACY_MODE_DISABLED); 583 PRIVACY_MODE_DISABLED);
604 BoundNetLog log; 584 BoundNetLog log;
605 const scoped_refptr<HttpNetworkSession>& session = helper.session(); 585 const scoped_refptr<HttpNetworkSession>& session = helper.session();
606 base::WeakPtr<SpdySession> spdy_session = 586 base::WeakPtr<SpdySession> spdy_session =
607 session->spdy_session_pool()->FindAvailableSession(key, log); 587 session->spdy_session_pool()->FindAvailableSession(key, log);
608 ASSERT_TRUE(spdy_session != NULL); 588 ASSERT_TRUE(spdy_session != NULL);
609 EXPECT_EQ(0u, spdy_session->num_active_streams()); 589 EXPECT_EQ(0u, spdy_session->num_active_streams());
610 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams()); 590 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams());
611 } 591 }
612 592
613 void RunServerPushTest(OrderedSocketData* data, 593 void RunServerPushTest(SequencedSocketData* data,
614 HttpResponseInfo* response, 594 HttpResponseInfo* response,
615 HttpResponseInfo* push_response, 595 HttpResponseInfo* push_response,
616 const std::string& expected) { 596 const std::string& expected) {
617 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 597 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
618 BoundNetLog(), GetParam(), NULL); 598 BoundNetLog(), GetParam(), NULL);
619 helper.RunPreTestSetup(); 599 helper.RunPreTestSetup();
620 helper.AddData(data); 600 helper.AddData(data);
621 601
622 HttpNetworkTransaction* trans = helper.trans(); 602 HttpNetworkTransaction* trans = helper.trans();
623 603
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 scoped_refptr<HttpNetworkSession> session( 724 scoped_refptr<HttpNetworkSession> session(
745 SpdySessionDependencies::SpdyCreateSession(session_deps.get())); 725 SpdySessionDependencies::SpdyCreateSession(session_deps.get()));
746 scoped_ptr<HttpTransaction> trans( 726 scoped_ptr<HttpTransaction> trans(
747 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 727 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
748 } 728 }
749 729
750 TEST_P(SpdyNetworkTransactionTest, Get) { 730 TEST_P(SpdyNetworkTransactionTest, Get) {
751 // Construct the request. 731 // Construct the request.
752 scoped_ptr<SpdyFrame> req( 732 scoped_ptr<SpdyFrame> req(
753 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 733 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
754 MockWrite writes[] = { CreateMockWrite(*req) }; 734 MockWrite writes[] = {CreateMockWrite(*req, 0)};
755 735
756 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 736 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
757 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 737 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
758 MockRead reads[] = { 738 MockRead reads[] = {
759 CreateMockRead(*resp), 739 CreateMockRead(*resp, 1),
760 CreateMockRead(*body), 740 CreateMockRead(*body, 2),
761 MockRead(ASYNC, 0, 0) // EOF 741 MockRead(ASYNC, 0, 3) // EOF
762 }; 742 };
763 743
764 DelayedSocketData data(1, reads, arraysize(reads), 744 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
765 writes, arraysize(writes));
766 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 745 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
767 BoundNetLog(), GetParam(), NULL); 746 BoundNetLog(), GetParam(), NULL);
768 helper.RunToCompletion(&data); 747 helper.RunToCompletion(&data);
769 TransactionHelperResult out = helper.output(); 748 TransactionHelperResult out = helper.output();
770 EXPECT_EQ(OK, out.rv); 749 EXPECT_EQ(OK, out.rv);
771 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 750 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
772 EXPECT_EQ("hello!", out.response_data); 751 EXPECT_EQ("hello!", out.response_data);
773 } 752 }
774 753
775 TEST_P(SpdyNetworkTransactionTest, GetAtEachPriority) { 754 TEST_P(SpdyNetworkTransactionTest, GetAtEachPriority) {
776 for (RequestPriority p = MINIMUM_PRIORITY; p <= MAXIMUM_PRIORITY; 755 for (RequestPriority p = MINIMUM_PRIORITY; p <= MAXIMUM_PRIORITY;
777 p = RequestPriority(p + 1)) { 756 p = RequestPriority(p + 1)) {
778 // Construct the request. 757 // Construct the request.
779 scoped_ptr<SpdyFrame> req( 758 scoped_ptr<SpdyFrame> req(
780 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, p, true)); 759 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, p, true));
781 MockWrite writes[] = { CreateMockWrite(*req) }; 760 MockWrite writes[] = {CreateMockWrite(*req, 0)};
782 761
783 SpdyPriority spdy_prio = 0; 762 SpdyPriority spdy_prio = 0;
784 EXPECT_TRUE(GetSpdyPriority(spdy_util_.spdy_version(), *req, &spdy_prio)); 763 EXPECT_TRUE(GetSpdyPriority(spdy_util_.spdy_version(), *req, &spdy_prio));
785 // this repeats the RequestPriority-->SpdyPriority mapping from 764 // this repeats the RequestPriority-->SpdyPriority mapping from
786 // SpdyFramer::ConvertRequestPriorityToSpdyPriority to make 765 // SpdyFramer::ConvertRequestPriorityToSpdyPriority to make
787 // sure it's being done right. 766 // sure it's being done right.
788 if (spdy_util_.spdy_version() < SPDY3) { 767 if (spdy_util_.spdy_version() < SPDY3) {
789 switch (p) { 768 switch (p) {
790 case HIGHEST: 769 case HIGHEST:
791 EXPECT_EQ(0, spdy_prio); 770 EXPECT_EQ(0, spdy_prio);
(...skipping 29 matching lines...) Expand all
821 EXPECT_EQ(4, spdy_prio); 800 EXPECT_EQ(4, spdy_prio);
822 break; 801 break;
823 default: 802 default:
824 FAIL(); 803 FAIL();
825 } 804 }
826 } 805 }
827 806
828 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 807 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
829 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 808 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
830 MockRead reads[] = { 809 MockRead reads[] = {
831 CreateMockRead(*resp), 810 CreateMockRead(*resp, 1),
832 CreateMockRead(*body), 811 CreateMockRead(*body, 2),
833 MockRead(ASYNC, 0, 0) // EOF 812 MockRead(ASYNC, 0, 3) // EOF
834 }; 813 };
835 814
836 DelayedSocketData data(1, reads, arraysize(reads), 815 SequencedSocketData data(reads, arraysize(reads), writes,
837 writes, arraysize(writes)); 816 arraysize(writes));
838 HttpRequestInfo http_req = CreateGetRequest(); 817 HttpRequestInfo http_req = CreateGetRequest();
839 818
840 NormalSpdyTransactionHelper helper(http_req, p, BoundNetLog(), 819 NormalSpdyTransactionHelper helper(http_req, p, BoundNetLog(),
841 GetParam(), NULL); 820 GetParam(), NULL);
842 helper.RunToCompletion(&data); 821 helper.RunToCompletion(&data);
843 TransactionHelperResult out = helper.output(); 822 TransactionHelperResult out = helper.output();
844 EXPECT_EQ(OK, out.rv); 823 EXPECT_EQ(OK, out.rv);
845 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 824 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
846 EXPECT_EQ("hello!", out.response_data); 825 EXPECT_EQ("hello!", out.response_data);
847 } 826 }
(...skipping 22 matching lines...) Expand all
870 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 849 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false));
871 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 850 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true));
872 851
873 scoped_ptr<SpdyFrame> req3( 852 scoped_ptr<SpdyFrame> req3(
874 spdy_util_.ConstructSpdyGet(NULL, 0, false, 5, LOWEST, true)); 853 spdy_util_.ConstructSpdyGet(NULL, 0, false, 5, LOWEST, true));
875 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 854 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5));
876 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, false)); 855 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, false));
877 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(5, true)); 856 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(5, true));
878 857
879 MockWrite writes[] = { 858 MockWrite writes[] = {
880 CreateMockWrite(*req), 859 CreateMockWrite(*req, 0),
881 CreateMockWrite(*req2), 860 CreateMockWrite(*req2, 3),
882 CreateMockWrite(*req3), 861 CreateMockWrite(*req3, 6),
883 }; 862 };
884 MockRead reads[] = { 863 MockRead reads[] = {
885 CreateMockRead(*resp, 1), 864 CreateMockRead(*resp, 1),
886 CreateMockRead(*body), 865 CreateMockRead(*body, 2),
887 CreateMockRead(*resp2, 4), 866 CreateMockRead(*resp2, 4),
888 CreateMockRead(*body2), 867 CreateMockRead(*body2, 5),
889 CreateMockRead(*resp3, 7), 868 CreateMockRead(*resp3, 7),
890 CreateMockRead(*body3), 869 CreateMockRead(*body3, 8),
891 870
892 CreateMockRead(*fbody), 871 CreateMockRead(*fbody, 9),
893 CreateMockRead(*fbody2), 872 CreateMockRead(*fbody2, 10),
894 CreateMockRead(*fbody3), 873 CreateMockRead(*fbody3, 11),
895 874
896 MockRead(ASYNC, 0, 0), // EOF 875 MockRead(ASYNC, 0, 12), // EOF
897 }; 876 };
898 OrderedSocketData data(reads, arraysize(reads), 877 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
899 writes, arraysize(writes)); 878 SequencedSocketData data_placeholder(NULL, 0, NULL, 0);
900 OrderedSocketData data_placeholder(NULL, 0, NULL, 0);
901 879
902 BoundNetLog log; 880 BoundNetLog log;
903 TransactionHelperResult out; 881 TransactionHelperResult out;
904 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 882 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
905 BoundNetLog(), GetParam(), NULL); 883 BoundNetLog(), GetParam(), NULL);
906 helper.RunPreTestSetup(); 884 helper.RunPreTestSetup();
907 helper.AddData(&data); 885 helper.AddData(&data);
908 // We require placeholder data because three get requests are sent out at 886 // We require placeholder data because three get requests are sent out at
909 // the same time which results in three sockets being connected. The first 887 // the same time which results in three sockets being connected. The first
910 // on will negotiate SPDY and will be used for all requests. 888 // on will negotiate SPDY and will be used for all requests.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 939 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false));
962 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 940 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true));
963 941
964 scoped_ptr<SpdyFrame> req2( 942 scoped_ptr<SpdyFrame> req2(
965 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 943 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
966 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 944 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
967 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 945 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false));
968 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 946 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true));
969 947
970 MockWrite writes[] = { 948 MockWrite writes[] = {
971 CreateMockWrite(*req), 949 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 3),
972 CreateMockWrite(*req2),
973 }; 950 };
974 MockRead reads[] = { 951 MockRead reads[] = {
975 CreateMockRead(*resp, 1), 952 CreateMockRead(*resp, 1),
976 CreateMockRead(*body), 953 CreateMockRead(*body, 2),
977 CreateMockRead(*resp2, 4), 954 CreateMockRead(*resp2, 4),
978 CreateMockRead(*body2), 955 CreateMockRead(*body2, 5),
979 CreateMockRead(*fbody), 956 CreateMockRead(*fbody, 6),
980 CreateMockRead(*fbody2), 957 CreateMockRead(*fbody2, 7),
981 MockRead(ASYNC, 0, 0), // EOF 958 MockRead(ASYNC, 0, 8), // EOF
982 }; 959 };
983 OrderedSocketData data(reads, arraysize(reads), 960 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
984 writes, arraysize(writes));
985 961
986 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); 962 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING);
987 OrderedSocketData data_placeholder(NULL, 0, NULL, 0); 963 SequencedSocketData data_placeholder(NULL, 0, NULL, 0);
988 data_placeholder.set_connect_data(never_finishing_connect); 964 data_placeholder.set_connect_data(never_finishing_connect);
989 965
990 BoundNetLog log; 966 BoundNetLog log;
991 TransactionHelperResult out; 967 TransactionHelperResult out;
992 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 968 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
993 BoundNetLog(), GetParam(), NULL); 969 BoundNetLog(), GetParam(), NULL);
994 helper.RunPreTestSetup(); 970 helper.RunPreTestSetup();
995 helper.AddData(&data); 971 helper.AddData(&data);
996 // We require placeholder data because two requests are sent out at 972 // We require placeholder data because two requests are sent out at
997 // the same time which results in two sockets being connected. The first 973 // the same time which results in two sockets being connected. The first
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1024 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false));
1049 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1025 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true));
1050 1026
1051 scoped_ptr<SpdyFrame> req2( 1027 scoped_ptr<SpdyFrame> req2(
1052 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 1028 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
1053 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1029 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1054 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 1030 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false));
1055 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 1031 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true));
1056 1032
1057 MockWrite writes[] = { 1033 MockWrite writes[] = {
1058 CreateMockWrite(*req), 1034 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 3),
1059 CreateMockWrite(*req2),
1060 }; 1035 };
1061 MockRead reads[] = { 1036 MockRead reads[] = {
1062 CreateMockRead(*resp, 1), 1037 CreateMockRead(*resp, 1),
1063 CreateMockRead(*body), 1038 CreateMockRead(*body, 2),
1064 CreateMockRead(*resp2, 4), 1039 CreateMockRead(*resp2, 4),
1065 CreateMockRead(*body2), 1040 CreateMockRead(*body2, 5),
1066 CreateMockRead(*fbody), 1041 CreateMockRead(*fbody, 6),
1067 CreateMockRead(*fbody2), 1042 CreateMockRead(*fbody2, 7),
1068 MockRead(ASYNC, 0, 0), // EOF 1043 MockRead(ASYNC, 0, 8), // EOF
1069 }; 1044 };
1070 OrderedSocketData preconnect_data(reads, arraysize(reads), 1045 SequencedSocketData preconnect_data(reads, arraysize(reads), writes,
1071 writes, arraysize(writes)); 1046 arraysize(writes));
1072 1047
1073 MockConnect never_finishing_connect(ASYNC, ERR_IO_PENDING); 1048 MockConnect never_finishing_connect(ASYNC, ERR_IO_PENDING);
1074 1049
1075 OrderedSocketData data_placeholder(NULL, 0, NULL, 0); 1050 SequencedSocketData data_placeholder(NULL, 0, NULL, 0);
1076 data_placeholder.set_connect_data(never_finishing_connect); 1051 data_placeholder.set_connect_data(never_finishing_connect);
1077 1052
1078 BoundNetLog log; 1053 BoundNetLog log;
1079 TransactionHelperResult out; 1054 TransactionHelperResult out;
1080 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1055 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1081 BoundNetLog(), GetParam(), NULL); 1056 BoundNetLog(), GetParam(), NULL);
1082 helper.RunPreTestSetup(); 1057 helper.RunPreTestSetup();
1083 helper.AddData(&preconnect_data); 1058 helper.AddData(&preconnect_data);
1084 // We require placeholder data because 3 connections are attempted (first is 1059 // We require placeholder data because 3 connections are attempted (first is
1085 // the preconnect, 2nd and 3rd are the never finished connections. 1060 // the preconnect, 2nd and 3rd are the never finished connections.
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 1142
1168 SettingsMap settings; 1143 SettingsMap settings;
1169 const uint32 max_concurrent_streams = 1; 1144 const uint32 max_concurrent_streams = 1;
1170 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1145 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1171 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1146 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1172 scoped_ptr<SpdyFrame> settings_frame( 1147 scoped_ptr<SpdyFrame> settings_frame(
1173 spdy_util_.ConstructSpdySettings(settings)); 1148 spdy_util_.ConstructSpdySettings(settings));
1174 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1149 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck());
1175 1150
1176 MockWrite writes[] = { 1151 MockWrite writes[] = {
1177 CreateMockWrite(*req), 1152 CreateMockWrite(*req, 0),
1178 CreateMockWrite(*settings_ack, 2), 1153 CreateMockWrite(*settings_ack, 5),
1179 CreateMockWrite(*req2), 1154 CreateMockWrite(*req2, 6),
1180 CreateMockWrite(*req3), 1155 CreateMockWrite(*req3, 10),
1181 }; 1156 };
1182 1157
1183 MockRead reads[] = { 1158 MockRead reads[] = {
1184 CreateMockRead(*settings_frame, 1), 1159 CreateMockRead(*settings_frame, 1),
1185 CreateMockRead(*resp), 1160 CreateMockRead(*resp, 2),
1186 CreateMockRead(*body), 1161 CreateMockRead(*body, 3),
1187 CreateMockRead(*fbody), 1162 CreateMockRead(*fbody, 4),
1188 CreateMockRead(*resp2, 8), 1163 CreateMockRead(*resp2, 7),
1189 CreateMockRead(*body2), 1164 CreateMockRead(*body2, 8),
1190 CreateMockRead(*fbody2), 1165 CreateMockRead(*fbody2, 9),
1191 CreateMockRead(*resp3, 13), 1166 CreateMockRead(*resp3, 11),
1192 CreateMockRead(*body3), 1167 CreateMockRead(*body3, 12),
1193 CreateMockRead(*fbody3), 1168 CreateMockRead(*fbody3, 13),
1194 1169
1195 MockRead(ASYNC, 0, 0), // EOF 1170 MockRead(ASYNC, 0, 14), // EOF
1196 }; 1171 };
1197 1172
1198 OrderedSocketData data(reads, arraysize(reads), 1173 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1199 writes, arraysize(writes));
1200 1174
1201 BoundNetLog log; 1175 BoundNetLog log;
1202 TransactionHelperResult out; 1176 TransactionHelperResult out;
1203 { 1177 {
1204 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1178 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1205 BoundNetLog(), GetParam(), NULL); 1179 BoundNetLog(), GetParam(), NULL);
1206 helper.RunPreTestSetup(); 1180 helper.RunPreTestSetup();
1207 helper.AddData(&data); 1181 helper.AddData(&data);
1208 scoped_ptr<HttpNetworkTransaction> trans1( 1182 scoped_ptr<HttpNetworkTransaction> trans1(
1209 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1183 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
(...skipping 16 matching lines...) Expand all
1226 // frame. 1200 // frame.
1227 out.rv = callback1.WaitForResult(); 1201 out.rv = callback1.WaitForResult();
1228 ASSERT_EQ(OK, out.rv); 1202 ASSERT_EQ(OK, out.rv);
1229 1203
1230 out.rv = trans2->Start(&httpreq2, callback2.callback(), log); 1204 out.rv = trans2->Start(&httpreq2, callback2.callback(), log);
1231 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1205 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1232 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); 1206 out.rv = trans3->Start(&httpreq3, callback3.callback(), log);
1233 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1207 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1234 out.rv = callback2.WaitForResult(); 1208 out.rv = callback2.WaitForResult();
1235 ASSERT_EQ(OK, out.rv); 1209 ASSERT_EQ(OK, out.rv);
1236 EXPECT_EQ(7U, data.read_index()); // i.e. the third trans was queued
1237 1210
1238 out.rv = callback3.WaitForResult(); 1211 out.rv = callback3.WaitForResult();
1239 ASSERT_EQ(OK, out.rv); 1212 ASSERT_EQ(OK, out.rv);
1240 1213
1241 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); 1214 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
1242 ASSERT_TRUE(response1 != NULL); 1215 ASSERT_TRUE(response1 != NULL);
1243 EXPECT_TRUE(response1->headers.get() != NULL); 1216 EXPECT_TRUE(response1->headers.get() != NULL);
1244 EXPECT_TRUE(response1->was_fetched_via_spdy); 1217 EXPECT_TRUE(response1->was_fetched_via_spdy);
1245 out.status_line = response1->headers->GetStatusLine(); 1218 out.status_line = response1->headers->GetStatusLine();
1246 out.response_info = *response1; 1219 out.response_info = *response1;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1300 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(7, false)); 1273 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(7, false));
1301 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(7, true)); 1274 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(7, true));
1302 1275
1303 SettingsMap settings; 1276 SettingsMap settings;
1304 const uint32 max_concurrent_streams = 1; 1277 const uint32 max_concurrent_streams = 1;
1305 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1278 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1306 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1279 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1307 scoped_ptr<SpdyFrame> settings_frame( 1280 scoped_ptr<SpdyFrame> settings_frame(
1308 spdy_util_.ConstructSpdySettings(settings)); 1281 spdy_util_.ConstructSpdySettings(settings));
1309 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1282 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck());
1310 1283 MockWrite writes[] = {
1311 MockWrite writes[] = { CreateMockWrite(*req), 1284 CreateMockWrite(*req, 0),
1312 CreateMockWrite(*settings_ack, 2), 1285 CreateMockWrite(*settings_ack, 5),
1313 CreateMockWrite(*req2), 1286 // By making these synchronous, it guarantees that they are not *started*
1314 CreateMockWrite(*req4), 1287 // before their sequence number, which in turn verifies that only a single
1315 CreateMockWrite(*req3), 1288 // request is in-flight at a time.
1289 CreateMockWrite(*req2, 6, SYNCHRONOUS),
1290 CreateMockWrite(*req4, 10, SYNCHRONOUS),
1291 CreateMockWrite(*req3, 13, SYNCHRONOUS),
1316 }; 1292 };
1317 MockRead reads[] = { 1293 MockRead reads[] = {
1318 CreateMockRead(*settings_frame, 1), 1294 CreateMockRead(*settings_frame, 1),
1319 CreateMockRead(*resp), 1295 CreateMockRead(*resp, 2),
1320 CreateMockRead(*body), 1296 CreateMockRead(*body, 3),
1321 CreateMockRead(*fbody), 1297 CreateMockRead(*fbody, 4),
1322 CreateMockRead(*resp2, 8), 1298 CreateMockRead(*resp2, 7),
1323 CreateMockRead(*body2), 1299 CreateMockRead(*body2, 8),
1324 CreateMockRead(*fbody2), 1300 CreateMockRead(*fbody2, 9),
1325 CreateMockRead(*resp4, 14), 1301 CreateMockRead(*resp4, 11),
1326 CreateMockRead(*fbody4), 1302 CreateMockRead(*fbody4, 12),
1327 CreateMockRead(*resp3, 17), 1303 CreateMockRead(*resp3, 14),
1328 CreateMockRead(*body3), 1304 CreateMockRead(*body3, 15),
1329 CreateMockRead(*fbody3), 1305 CreateMockRead(*fbody3, 16),
1330 1306
1331 MockRead(ASYNC, 0, 0), // EOF 1307 MockRead(ASYNC, 0, 17), // EOF
1332 }; 1308 };
1333 1309 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1334 OrderedSocketData data(reads, arraysize(reads),
1335 writes, arraysize(writes));
1336
1337 BoundNetLog log; 1310 BoundNetLog log;
1338 TransactionHelperResult out; 1311 TransactionHelperResult out;
1339 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1312 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1340 BoundNetLog(), GetParam(), NULL); 1313 BoundNetLog(), GetParam(), NULL);
1341 helper.RunPreTestSetup(); 1314 helper.RunPreTestSetup();
1342 helper.AddData(&data); 1315 helper.AddData(&data);
1316
1343 scoped_ptr<HttpNetworkTransaction> trans1( 1317 scoped_ptr<HttpNetworkTransaction> trans1(
1344 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1318 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
1345 scoped_ptr<HttpNetworkTransaction> trans2( 1319 scoped_ptr<HttpNetworkTransaction> trans2(
1346 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1320 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
1347 scoped_ptr<HttpNetworkTransaction> trans3( 1321 scoped_ptr<HttpNetworkTransaction> trans3(
1348 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1322 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
1349 scoped_ptr<HttpNetworkTransaction> trans4( 1323 scoped_ptr<HttpNetworkTransaction> trans4(
1350 new HttpNetworkTransaction(HIGHEST, helper.session().get())); 1324 new HttpNetworkTransaction(HIGHEST, helper.session().get()));
1351 1325
1352 TestCompletionCallback callback1; 1326 TestCompletionCallback callback1;
(...skipping 14 matching lines...) Expand all
1367 1341
1368 out.rv = trans2->Start(&httpreq2, callback2.callback(), log); 1342 out.rv = trans2->Start(&httpreq2, callback2.callback(), log);
1369 ASSERT_EQ(ERR_IO_PENDING, out.rv); 1343 ASSERT_EQ(ERR_IO_PENDING, out.rv);
1370 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); 1344 out.rv = trans3->Start(&httpreq3, callback3.callback(), log);
1371 ASSERT_EQ(ERR_IO_PENDING, out.rv); 1345 ASSERT_EQ(ERR_IO_PENDING, out.rv);
1372 out.rv = trans4->Start(&httpreq4, callback4.callback(), log); 1346 out.rv = trans4->Start(&httpreq4, callback4.callback(), log);
1373 ASSERT_EQ(ERR_IO_PENDING, out.rv); 1347 ASSERT_EQ(ERR_IO_PENDING, out.rv);
1374 1348
1375 out.rv = callback2.WaitForResult(); 1349 out.rv = callback2.WaitForResult();
1376 ASSERT_EQ(OK, out.rv); 1350 ASSERT_EQ(OK, out.rv);
1377 EXPECT_EQ(data.read_index(), 7U); // i.e. the third & fourth trans queued
1378 1351
1379 out.rv = callback3.WaitForResult(); 1352 out.rv = callback3.WaitForResult();
1380 ASSERT_EQ(OK, out.rv); 1353 ASSERT_EQ(OK, out.rv);
1381 1354
1382 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); 1355 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
1383 EXPECT_TRUE(response1->headers.get() != NULL); 1356 EXPECT_TRUE(response1->headers.get() != NULL);
1384 EXPECT_TRUE(response1->was_fetched_via_spdy); 1357 EXPECT_TRUE(response1->was_fetched_via_spdy);
1385 out.status_line = response1->headers->GetStatusLine(); 1358 out.status_line = response1->headers->GetStatusLine();
1386 out.response_info = *response1; 1359 out.response_info = *response1;
1387 out.rv = ReadTransaction(trans1.get(), &out.response_data); 1360 out.rv = ReadTransaction(trans1.get(), &out.response_data);
(...skipping 26 matching lines...) Expand all
1414 out.response_info = *response4; 1387 out.response_info = *response4;
1415 out.rv = ReadTransaction(trans4.get(), &out.response_data); 1388 out.rv = ReadTransaction(trans4.get(), &out.response_data);
1416 EXPECT_EQ(OK, out.rv); 1389 EXPECT_EQ(OK, out.rv);
1417 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1390 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1418 EXPECT_EQ("hello!", out.response_data); 1391 EXPECT_EQ("hello!", out.response_data);
1419 helper.VerifyDataConsumed(); 1392 helper.VerifyDataConsumed();
1420 EXPECT_EQ(OK, out.rv); 1393 EXPECT_EQ(OK, out.rv);
1421 } 1394 }
1422 1395
1423 // Similar to ThreeGetsMaxConcurrrent above, however, this test 1396 // Similar to ThreeGetsMaxConcurrrent above, however, this test
1424 // deletes a session in the middle of the transaction to insure 1397 // deletes a session in the middle of the transaction to ensure
1425 // that we properly remove pendingcreatestream objects from 1398 // that we properly remove pendingcreatestream objects from
1426 // the spdy_session 1399 // the spdy_session
1427 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) { 1400 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) {
1428 // Construct the request. 1401 // Construct the request.
1429 scoped_ptr<SpdyFrame> req( 1402 scoped_ptr<SpdyFrame> req(
1430 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 1403 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
1431 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1404 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1432 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1405 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false));
1433 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1406 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true));
1434 1407
1435 scoped_ptr<SpdyFrame> req2( 1408 scoped_ptr<SpdyFrame> req2(
1436 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 1409 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
1437 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1410 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1438 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 1411 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false));
1439 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 1412 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true));
1440 1413
1441 SettingsMap settings; 1414 SettingsMap settings;
1442 const uint32 max_concurrent_streams = 1; 1415 const uint32 max_concurrent_streams = 1;
1443 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1416 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1444 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1417 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1445 scoped_ptr<SpdyFrame> settings_frame( 1418 scoped_ptr<SpdyFrame> settings_frame(
1446 spdy_util_.ConstructSpdySettings(settings)); 1419 spdy_util_.ConstructSpdySettings(settings));
1447 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1420 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck());
1448 1421
1449 MockWrite writes[] = { 1422 MockWrite writes[] = {
1450 CreateMockWrite(*req), 1423 CreateMockWrite(*req, 0),
1451 CreateMockWrite(*settings_ack, 2), 1424 CreateMockWrite(*settings_ack, 5),
1452 CreateMockWrite(*req2), 1425 CreateMockWrite(*req2, 6),
1453 }; 1426 };
1454 MockRead reads[] = { 1427 MockRead reads[] = {
1455 CreateMockRead(*settings_frame, 1), 1428 CreateMockRead(*settings_frame, 1),
1456 CreateMockRead(*resp), 1429 CreateMockRead(*resp, 2),
1457 CreateMockRead(*body), 1430 CreateMockRead(*body, 3),
1458 CreateMockRead(*fbody), 1431 CreateMockRead(*fbody, 4),
1459 CreateMockRead(*resp2, 8), 1432 CreateMockRead(*resp2, 7),
1460 CreateMockRead(*body2), 1433 CreateMockRead(*body2, 8),
1461 CreateMockRead(*fbody2), 1434 CreateMockRead(*fbody2, 9),
1462 MockRead(ASYNC, 0, 0), // EOF 1435 MockRead(ASYNC, 0, 10), // EOF
1463 }; 1436 };
1464 1437
1465 OrderedSocketData data(reads, arraysize(reads), 1438 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1466 writes, arraysize(writes));
1467 1439
1468 BoundNetLog log; 1440 BoundNetLog log;
1469 TransactionHelperResult out; 1441 TransactionHelperResult out;
1470 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1442 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1471 BoundNetLog(), GetParam(), NULL); 1443 BoundNetLog(), GetParam(), NULL);
1472 helper.RunPreTestSetup(); 1444 helper.RunPreTestSetup();
1473 helper.AddData(&data); 1445 helper.AddData(&data);
1474 scoped_ptr<HttpNetworkTransaction> trans1( 1446 scoped_ptr<HttpNetworkTransaction> trans1(
1475 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1447 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
1476 scoped_ptr<HttpNetworkTransaction> trans2( 1448 scoped_ptr<HttpNetworkTransaction> trans2(
(...skipping 16 matching lines...) Expand all
1493 ASSERT_EQ(OK, out.rv); 1465 ASSERT_EQ(OK, out.rv);
1494 1466
1495 out.rv = trans2->Start(&httpreq2, callback2.callback(), log); 1467 out.rv = trans2->Start(&httpreq2, callback2.callback(), log);
1496 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1468 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1497 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); 1469 out.rv = trans3->Start(&httpreq3, callback3.callback(), log);
1498 delete trans3.release(); 1470 delete trans3.release();
1499 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1471 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1500 out.rv = callback2.WaitForResult(); 1472 out.rv = callback2.WaitForResult();
1501 ASSERT_EQ(OK, out.rv); 1473 ASSERT_EQ(OK, out.rv);
1502 1474
1503 EXPECT_EQ(8U, data.read_index());
1504
1505 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); 1475 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
1506 ASSERT_TRUE(response1 != NULL); 1476 ASSERT_TRUE(response1 != NULL);
1507 EXPECT_TRUE(response1->headers.get() != NULL); 1477 EXPECT_TRUE(response1->headers.get() != NULL);
1508 EXPECT_TRUE(response1->was_fetched_via_spdy); 1478 EXPECT_TRUE(response1->was_fetched_via_spdy);
1509 out.status_line = response1->headers->GetStatusLine(); 1479 out.status_line = response1->headers->GetStatusLine();
1510 out.response_info = *response1; 1480 out.response_info = *response1;
1511 out.rv = ReadTransaction(trans1.get(), &out.response_data); 1481 out.rv = ReadTransaction(trans1.get(), &out.response_data);
1512 EXPECT_EQ(OK, out.rv); 1482 EXPECT_EQ(OK, out.rv);
1513 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1483 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1514 EXPECT_EQ("hello!hello!", out.response_data); 1484 EXPECT_EQ("hello!hello!", out.response_data);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 1542
1573 SettingsMap settings; 1543 SettingsMap settings;
1574 const uint32 max_concurrent_streams = 1; 1544 const uint32 max_concurrent_streams = 1;
1575 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1545 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1576 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1546 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1577 scoped_ptr<SpdyFrame> settings_frame( 1547 scoped_ptr<SpdyFrame> settings_frame(
1578 spdy_util_.ConstructSpdySettings(settings)); 1548 spdy_util_.ConstructSpdySettings(settings));
1579 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1549 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck());
1580 1550
1581 MockWrite writes[] = { 1551 MockWrite writes[] = {
1582 CreateMockWrite(*req), 1552 CreateMockWrite(*req, 0),
1583 CreateMockWrite(*settings_ack, 2), 1553 CreateMockWrite(*settings_ack, 5),
1584 CreateMockWrite(*req2), 1554 CreateMockWrite(*req2, 6),
1585 }; 1555 };
1586 MockRead reads[] = { 1556 MockRead reads[] = {
1587 CreateMockRead(*settings_frame, 1), 1557 CreateMockRead(*settings_frame, 1),
1588 CreateMockRead(*resp), 1558 CreateMockRead(*resp, 2),
1589 CreateMockRead(*body), 1559 CreateMockRead(*body, 3),
1590 CreateMockRead(*fin_body), 1560 CreateMockRead(*fin_body, 4),
1591 CreateMockRead(*resp2, 8), 1561 CreateMockRead(*resp2, 7),
1592 MockRead(ASYNC, ERR_CONNECTION_RESET, 0), // Abort! 1562 MockRead(ASYNC, ERR_CONNECTION_RESET, 8), // Abort!
1593 }; 1563 };
1594 1564
1595 OrderedSocketData data(reads, arraysize(reads), 1565 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1596 writes, arraysize(writes)); 1566 SequencedSocketData data_placeholder(NULL, 0, NULL, 0);
1597 OrderedSocketData data_placeholder(NULL, 0, NULL, 0);
1598 1567
1599 BoundNetLog log; 1568 BoundNetLog log;
1600 TransactionHelperResult out; 1569 TransactionHelperResult out;
1601 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1570 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1602 BoundNetLog(), GetParam(), NULL); 1571 BoundNetLog(), GetParam(), NULL);
1603 helper.RunPreTestSetup(); 1572 helper.RunPreTestSetup();
1604 helper.AddData(&data); 1573 helper.AddData(&data);
1605 // We require placeholder data because three get requests are sent out, so 1574 // We require placeholder data because three get requests are sent out, so
1606 // there needs to be three sets of SSL connection data. 1575 // there needs to be three sets of SSL connection data.
1607 helper.AddData(&data_placeholder); 1576 helper.AddData(&data_placeholder);
(...skipping 17 matching lines...) Expand all
1625 out.rv = callback1.WaitForResult(); 1594 out.rv = callback1.WaitForResult();
1626 ASSERT_EQ(OK, out.rv); 1595 ASSERT_EQ(OK, out.rv);
1627 1596
1628 out.rv = trans2.Start(&httpreq2, callback2.callback(), log); 1597 out.rv = trans2.Start(&httpreq2, callback2.callback(), log);
1629 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1598 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1630 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); 1599 out.rv = trans3->Start(&httpreq3, callback3.callback(), log);
1631 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1600 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1632 out.rv = callback3.WaitForResult(); 1601 out.rv = callback3.WaitForResult();
1633 ASSERT_EQ(ERR_ABORTED, out.rv); 1602 ASSERT_EQ(ERR_ABORTED, out.rv);
1634 1603
1635 EXPECT_EQ(6U, data.read_index());
1636
1637 const HttpResponseInfo* response1 = trans1.GetResponseInfo(); 1604 const HttpResponseInfo* response1 = trans1.GetResponseInfo();
1638 ASSERT_TRUE(response1 != NULL); 1605 ASSERT_TRUE(response1 != NULL);
1639 EXPECT_TRUE(response1->headers.get() != NULL); 1606 EXPECT_TRUE(response1->headers.get() != NULL);
1640 EXPECT_TRUE(response1->was_fetched_via_spdy); 1607 EXPECT_TRUE(response1->was_fetched_via_spdy);
1641 out.status_line = response1->headers->GetStatusLine(); 1608 out.status_line = response1->headers->GetStatusLine();
1642 out.response_info = *response1; 1609 out.response_info = *response1;
1643 out.rv = ReadTransaction(&trans1, &out.response_data); 1610 out.rv = ReadTransaction(&trans1, &out.response_data);
1644 EXPECT_EQ(OK, out.rv); 1611 EXPECT_EQ(OK, out.rv);
1645 1612
1646 const HttpResponseInfo* response2 = trans2.GetResponseInfo(); 1613 const HttpResponseInfo* response2 = trans2.GetResponseInfo();
(...skipping 11 matching lines...) Expand all
1658 // Setup the request 1625 // Setup the request
1659 HttpRequestInfo request; 1626 HttpRequestInfo request;
1660 request.method = "PUT"; 1627 request.method = "PUT";
1661 request.url = GURL(GetDefaultUrl()); 1628 request.url = GURL(GetDefaultUrl());
1662 1629
1663 scoped_ptr<SpdyHeaderBlock> put_headers( 1630 scoped_ptr<SpdyHeaderBlock> put_headers(
1664 spdy_util_.ConstructPutHeaderBlock(GetDefaultUrl(), 0)); 1631 spdy_util_.ConstructPutHeaderBlock(GetDefaultUrl(), 0));
1665 scoped_ptr<SpdyFrame> req( 1632 scoped_ptr<SpdyFrame> req(
1666 spdy_util_.ConstructSpdySyn(1, *put_headers, LOWEST, false, true)); 1633 spdy_util_.ConstructSpdySyn(1, *put_headers, LOWEST, false, true));
1667 MockWrite writes[] = { 1634 MockWrite writes[] = {
1668 CreateMockWrite(*req), 1635 CreateMockWrite(*req, 0),
1669 }; 1636 };
1670 1637
1671 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1638 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1672 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1639 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1673 MockRead reads[] = { 1640 MockRead reads[] = {
1674 CreateMockRead(*resp), 1641 CreateMockRead(*resp, 1),
1675 CreateMockRead(*body), 1642 CreateMockRead(*body, 2),
1676 MockRead(ASYNC, 0, 0) // EOF 1643 MockRead(ASYNC, 0, 3) // EOF
1677 }; 1644 };
1678 1645
1679 DelayedSocketData data(1, reads, arraysize(reads), 1646 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1680 writes, arraysize(writes));
1681 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1647 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1682 BoundNetLog(), GetParam(), NULL); 1648 BoundNetLog(), GetParam(), NULL);
1683 helper.RunToCompletion(&data); 1649 helper.RunToCompletion(&data);
1684 TransactionHelperResult out = helper.output(); 1650 TransactionHelperResult out = helper.output();
1685 1651
1686 EXPECT_EQ(OK, out.rv); 1652 EXPECT_EQ(OK, out.rv);
1687 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1653 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1688 } 1654 }
1689 1655
1690 // Test that a simple HEAD request works. 1656 // Test that a simple HEAD request works.
1691 TEST_P(SpdyNetworkTransactionTest, Head) { 1657 TEST_P(SpdyNetworkTransactionTest, Head) {
1692 // Setup the request 1658 // Setup the request
1693 HttpRequestInfo request; 1659 HttpRequestInfo request;
1694 request.method = "HEAD"; 1660 request.method = "HEAD";
1695 request.url = GURL(GetDefaultUrl()); 1661 request.url = GURL(GetDefaultUrl());
1696 1662
1697 scoped_ptr<SpdyHeaderBlock> head_headers( 1663 scoped_ptr<SpdyHeaderBlock> head_headers(
1698 spdy_util_.ConstructHeadHeaderBlock(GetDefaultUrl(), 0)); 1664 spdy_util_.ConstructHeadHeaderBlock(GetDefaultUrl(), 0));
1699 scoped_ptr<SpdyFrame> req( 1665 scoped_ptr<SpdyFrame> req(
1700 spdy_util_.ConstructSpdySyn(1, *head_headers, LOWEST, false, true)); 1666 spdy_util_.ConstructSpdySyn(1, *head_headers, LOWEST, false, true));
1701 MockWrite writes[] = { 1667 MockWrite writes[] = {
1702 CreateMockWrite(*req), 1668 CreateMockWrite(*req, 0),
1703 }; 1669 };
1704 1670
1705 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1671 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1706 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1672 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1707 MockRead reads[] = { 1673 MockRead reads[] = {
1708 CreateMockRead(*resp), 1674 CreateMockRead(*resp, 1),
1709 CreateMockRead(*body), 1675 CreateMockRead(*body, 2),
1710 MockRead(ASYNC, 0, 0) // EOF 1676 MockRead(ASYNC, 0, 3) // EOF
1711 }; 1677 };
1712 1678
1713 DelayedSocketData data(1, reads, arraysize(reads), 1679 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1714 writes, arraysize(writes));
1715 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1680 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1716 BoundNetLog(), GetParam(), NULL); 1681 BoundNetLog(), GetParam(), NULL);
1717 helper.RunToCompletion(&data); 1682 helper.RunToCompletion(&data);
1718 TransactionHelperResult out = helper.output(); 1683 TransactionHelperResult out = helper.output();
1719 1684
1720 EXPECT_EQ(OK, out.rv); 1685 EXPECT_EQ(OK, out.rv);
1721 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1686 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1722 } 1687 }
1723 1688
1724 // Test that a simple POST works. 1689 // Test that a simple POST works.
1725 TEST_P(SpdyNetworkTransactionTest, Post) { 1690 TEST_P(SpdyNetworkTransactionTest, Post) {
1726 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1691 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
1727 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1692 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1728 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1693 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1729 MockWrite writes[] = { 1694 MockWrite writes[] = {
1730 CreateMockWrite(*req), 1695 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1731 CreateMockWrite(*body), // POST upload frame
1732 }; 1696 };
1733 1697
1734 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1698 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1735 MockRead reads[] = { 1699 MockRead reads[] = {
1736 CreateMockRead(*resp), 1700 CreateMockRead(*resp, 2),
1737 CreateMockRead(*body), 1701 CreateMockRead(*body, 3),
1738 MockRead(ASYNC, 0, 0) // EOF 1702 MockRead(ASYNC, 0, 4) // EOF
1739 }; 1703 };
1740 1704
1741 DelayedSocketData data(2, reads, arraysize(reads), 1705 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1742 writes, arraysize(writes));
1743 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY, 1706 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY,
1744 BoundNetLog(), GetParam(), NULL); 1707 BoundNetLog(), GetParam(), NULL);
1745 helper.RunToCompletion(&data); 1708 helper.RunToCompletion(&data);
1746 TransactionHelperResult out = helper.output(); 1709 TransactionHelperResult out = helper.output();
1747 EXPECT_EQ(OK, out.rv); 1710 EXPECT_EQ(OK, out.rv);
1748 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1711 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1749 EXPECT_EQ("hello!", out.response_data); 1712 EXPECT_EQ("hello!", out.response_data);
1750 } 1713 }
1751 1714
1752 // Test that a POST with a file works. 1715 // Test that a POST with a file works.
1753 TEST_P(SpdyNetworkTransactionTest, FilePost) { 1716 TEST_P(SpdyNetworkTransactionTest, FilePost) {
1754 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1717 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
1755 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1718 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1756 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1719 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1757 MockWrite writes[] = { 1720 MockWrite writes[] = {
1758 CreateMockWrite(*req), 1721 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1759 CreateMockWrite(*body), // POST upload frame
1760 }; 1722 };
1761 1723
1762 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1724 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1763 MockRead reads[] = { 1725 MockRead reads[] = {
1764 CreateMockRead(*resp), 1726 CreateMockRead(*resp, 2),
1765 CreateMockRead(*body), 1727 CreateMockRead(*body, 3),
1766 MockRead(ASYNC, 0, 0) // EOF 1728 MockRead(ASYNC, 0, 4) // EOF
1767 }; 1729 };
1768 1730
1769 DelayedSocketData data(2, reads, arraysize(reads), 1731 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1770 writes, arraysize(writes));
1771 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY, 1732 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY,
1772 BoundNetLog(), GetParam(), NULL); 1733 BoundNetLog(), GetParam(), NULL);
1773 helper.RunToCompletion(&data); 1734 helper.RunToCompletion(&data);
1774 TransactionHelperResult out = helper.output(); 1735 TransactionHelperResult out = helper.output();
1775 EXPECT_EQ(OK, out.rv); 1736 EXPECT_EQ(OK, out.rv);
1776 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1737 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1777 EXPECT_EQ("hello!", out.response_data); 1738 EXPECT_EQ("hello!", out.response_data);
1778 } 1739 }
1779 1740
1780 // Test that a POST with a unreadable file fails. 1741 // Test that a POST with a unreadable file fails.
1781 TEST_P(SpdyNetworkTransactionTest, UnreadableFilePost) { 1742 TEST_P(SpdyNetworkTransactionTest, UnreadableFilePost) {
1782 MockWrite writes[] = { 1743 MockWrite writes[] = {
1783 MockWrite(ASYNC, 0, 0) // EOF 1744 MockWrite(ASYNC, 0, 0) // EOF
1784 }; 1745 };
1785 MockRead reads[] = { 1746 MockRead reads[] = {
1786 MockRead(ASYNC, 0, 0) // EOF 1747 MockRead(ASYNC, 0, 1) // EOF
1787 }; 1748 };
1788 1749
1789 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 1750 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1790 NormalSpdyTransactionHelper helper(CreateUnreadableFilePostRequest(), 1751 NormalSpdyTransactionHelper helper(CreateUnreadableFilePostRequest(),
1791 DEFAULT_PRIORITY, 1752 DEFAULT_PRIORITY,
1792 BoundNetLog(), GetParam(), NULL); 1753 BoundNetLog(), GetParam(), NULL);
1793 helper.RunPreTestSetup(); 1754 helper.RunPreTestSetup();
1794 helper.AddData(&data); 1755 helper.AddData(&data);
1795 helper.RunDefaultTest(); 1756 helper.RunDefaultTest();
1796 1757
1797 base::RunLoop().RunUntilIdle(); 1758 base::RunLoop().RunUntilIdle();
1798 helper.VerifyDataNotConsumed(); 1759 helper.VerifyDataNotConsumed();
1799 EXPECT_EQ(ERR_ACCESS_DENIED, helper.output().rv); 1760 EXPECT_EQ(ERR_ACCESS_DENIED, helper.output().rv);
1800 } 1761 }
1801 1762
1802 // Test that a complex POST works. 1763 // Test that a complex POST works.
1803 TEST_P(SpdyNetworkTransactionTest, ComplexPost) { 1764 TEST_P(SpdyNetworkTransactionTest, ComplexPost) {
1804 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1765 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
1805 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1766 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1806 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1767 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1807 MockWrite writes[] = { 1768 MockWrite writes[] = {
1808 CreateMockWrite(*req), 1769 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1809 CreateMockWrite(*body), // POST upload frame
1810 }; 1770 };
1811 1771
1812 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1772 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1813 MockRead reads[] = { 1773 MockRead reads[] = {
1814 CreateMockRead(*resp), 1774 CreateMockRead(*resp, 2),
1815 CreateMockRead(*body), 1775 CreateMockRead(*body, 3),
1816 MockRead(ASYNC, 0, 0) // EOF 1776 MockRead(ASYNC, 0, 4) // EOF
1817 }; 1777 };
1818 1778
1819 DelayedSocketData data(2, reads, arraysize(reads), 1779 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1820 writes, arraysize(writes));
1821 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(), 1780 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(),
1822 DEFAULT_PRIORITY, 1781 DEFAULT_PRIORITY,
1823 BoundNetLog(), GetParam(), NULL); 1782 BoundNetLog(), GetParam(), NULL);
1824 helper.RunToCompletion(&data); 1783 helper.RunToCompletion(&data);
1825 TransactionHelperResult out = helper.output(); 1784 TransactionHelperResult out = helper.output();
1826 EXPECT_EQ(OK, out.rv); 1785 EXPECT_EQ(OK, out.rv);
1827 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1786 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1828 EXPECT_EQ("hello!", out.response_data); 1787 EXPECT_EQ("hello!", out.response_data);
1829 } 1788 }
1830 1789
1831 // Test that a chunked POST works. 1790 // Test that a chunked POST works.
1832 TEST_P(SpdyNetworkTransactionTest, ChunkedPost) { 1791 TEST_P(SpdyNetworkTransactionTest, ChunkedPost) {
1833 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1792 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1834 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1793 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1835 MockWrite writes[] = { 1794 MockWrite writes[] = {
1836 CreateMockWrite(*req), 1795 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1),
1837 CreateMockWrite(*body),
1838 }; 1796 };
1839 1797
1840 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1798 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1841 MockRead reads[] = { 1799 MockRead reads[] = {
1842 CreateMockRead(*resp), 1800 CreateMockRead(*resp, 2),
1843 CreateMockRead(*body), 1801 CreateMockRead(*body, 3),
1844 MockRead(ASYNC, 0, 0) // EOF 1802 MockRead(ASYNC, 0, 4) // EOF
1845 }; 1803 };
1846 1804
1847 DelayedSocketData data(2, reads, arraysize(reads), 1805 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1848 writes, arraysize(writes));
1849 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1806 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1850 DEFAULT_PRIORITY, 1807 DEFAULT_PRIORITY,
1851 BoundNetLog(), GetParam(), NULL); 1808 BoundNetLog(), GetParam(), NULL);
1852 1809
1853 // These chunks get merged into a single frame when being sent. 1810 // These chunks get merged into a single frame when being sent.
1854 const int kFirstChunkSize = kUploadDataSize/2; 1811 const int kFirstChunkSize = kUploadDataSize/2;
1855 upload_chunked_data_stream()->AppendData(kUploadData, kFirstChunkSize, false); 1812 upload_chunked_data_stream()->AppendData(kUploadData, kFirstChunkSize, false);
1856 upload_chunked_data_stream()->AppendData( 1813 upload_chunked_data_stream()->AppendData(
1857 kUploadData + kFirstChunkSize, kUploadDataSize - kFirstChunkSize, true); 1814 kUploadData + kFirstChunkSize, kUploadDataSize - kFirstChunkSize, true);
1858 1815
1859 helper.RunToCompletion(&data); 1816 helper.RunToCompletion(&data);
1860 TransactionHelperResult out = helper.output(); 1817 TransactionHelperResult out = helper.output();
1861 EXPECT_EQ(OK, out.rv); 1818 EXPECT_EQ(OK, out.rv);
1862 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1819 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1863 EXPECT_EQ(kUploadData, out.response_data); 1820 EXPECT_EQ(kUploadData, out.response_data);
1864 } 1821 }
1865 1822
1866 // Test that a chunked POST works with chunks appended after transaction starts. 1823 // Test that a chunked POST works with chunks appended after transaction starts.
1867 TEST_P(SpdyNetworkTransactionTest, DelayedChunkedPost) { 1824 TEST_P(SpdyNetworkTransactionTest, DelayedChunkedPost) {
1868 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1825 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1869 scoped_ptr<SpdyFrame> chunk1(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1826 scoped_ptr<SpdyFrame> chunk1(spdy_util_.ConstructSpdyBodyFrame(1, false));
1870 scoped_ptr<SpdyFrame> chunk2(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1827 scoped_ptr<SpdyFrame> chunk2(spdy_util_.ConstructSpdyBodyFrame(1, false));
1871 scoped_ptr<SpdyFrame> chunk3(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1828 scoped_ptr<SpdyFrame> chunk3(spdy_util_.ConstructSpdyBodyFrame(1, true));
1872 MockWrite writes[] = { 1829 MockWrite writes[] = {
1873 CreateMockWrite(*req), 1830 CreateMockWrite(*req, 0),
1874 CreateMockWrite(*chunk1), 1831 CreateMockWrite(*chunk1, 1),
1875 CreateMockWrite(*chunk2), 1832 CreateMockWrite(*chunk2, 2),
1876 CreateMockWrite(*chunk3), 1833 CreateMockWrite(*chunk3, 3),
1877 }; 1834 };
1878 1835
1879 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1836 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1880 MockRead reads[] = { 1837 MockRead reads[] = {
1881 CreateMockRead(*resp), 1838 CreateMockRead(*resp, 4),
1882 CreateMockRead(*chunk1), 1839 CreateMockRead(*chunk1, 5),
1883 CreateMockRead(*chunk2), 1840 CreateMockRead(*chunk2, 6),
1884 CreateMockRead(*chunk3), 1841 CreateMockRead(*chunk3, 7),
1885 MockRead(ASYNC, 0, 0) // EOF 1842 MockRead(ASYNC, 0, 8) // EOF
1886 }; 1843 };
1887 1844
1888 DelayedSocketData data(4, reads, arraysize(reads), 1845 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1889 writes, arraysize(writes));
1890 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1846 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1891 DEFAULT_PRIORITY, 1847 DEFAULT_PRIORITY,
1892 BoundNetLog(), GetParam(), NULL); 1848 BoundNetLog(), GetParam(), NULL);
1893 1849
1894 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false); 1850 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false);
1895 1851
1896 helper.RunPreTestSetup(); 1852 helper.RunPreTestSetup();
1897 helper.AddData(&data); 1853 helper.AddData(&data);
1898 ASSERT_TRUE(helper.StartDefaultTest()); 1854 ASSERT_TRUE(helper.StartDefaultTest());
1899 1855
(...skipping 27 matching lines...) Expand all
1927 request.upload_data_stream = NULL; 1883 request.upload_data_stream = NULL;
1928 1884
1929 // When request.upload_data_stream is NULL for post, content-length is 1885 // When request.upload_data_stream is NULL for post, content-length is
1930 // expected to be 0. 1886 // expected to be 0.
1931 scoped_ptr<SpdyHeaderBlock> req_block( 1887 scoped_ptr<SpdyHeaderBlock> req_block(
1932 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), 0)); 1888 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), 0));
1933 scoped_ptr<SpdyFrame> req( 1889 scoped_ptr<SpdyFrame> req(
1934 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, false, true)); 1890 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, false, true));
1935 1891
1936 MockWrite writes[] = { 1892 MockWrite writes[] = {
1937 CreateMockWrite(*req), 1893 CreateMockWrite(*req, 0),
1938 }; 1894 };
1939 1895
1940 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1896 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1941 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1897 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1942 MockRead reads[] = { 1898 MockRead reads[] = {
1943 CreateMockRead(*resp), 1899 CreateMockRead(*resp, 1),
1944 CreateMockRead(*body), 1900 CreateMockRead(*body, 2),
1945 MockRead(ASYNC, 0, 0) // EOF 1901 MockRead(ASYNC, 0, 3) // EOF
1946 }; 1902 };
1947 1903
1948 DelayedSocketData data(1, reads, arraysize(reads), 1904 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1949 writes, arraysize(writes));
1950 1905
1951 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1906 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1952 BoundNetLog(), GetParam(), NULL); 1907 BoundNetLog(), GetParam(), NULL);
1953 helper.RunToCompletion(&data); 1908 helper.RunToCompletion(&data);
1954 TransactionHelperResult out = helper.output(); 1909 TransactionHelperResult out = helper.output();
1955 EXPECT_EQ(OK, out.rv); 1910 EXPECT_EQ(OK, out.rv);
1956 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1911 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1957 EXPECT_EQ("hello!", out.response_data); 1912 EXPECT_EQ("hello!", out.response_data);
1958 } 1913 }
1959 1914
(...skipping 11 matching lines...) Expand all
1971 request.upload_data_stream = &stream; 1926 request.upload_data_stream = &stream;
1972 1927
1973 const uint64 kContentLength = 0; 1928 const uint64 kContentLength = 0;
1974 1929
1975 scoped_ptr<SpdyHeaderBlock> req_block( 1930 scoped_ptr<SpdyHeaderBlock> req_block(
1976 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), kContentLength)); 1931 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), kContentLength));
1977 scoped_ptr<SpdyFrame> req( 1932 scoped_ptr<SpdyFrame> req(
1978 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, false, true)); 1933 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, false, true));
1979 1934
1980 MockWrite writes[] = { 1935 MockWrite writes[] = {
1981 CreateMockWrite(*req), 1936 CreateMockWrite(*req, 0),
1982 }; 1937 };
1983 1938
1984 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1939 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1985 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1940 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1986 MockRead reads[] = { 1941 MockRead reads[] = {
1987 CreateMockRead(*resp), 1942 CreateMockRead(*resp, 1),
1988 CreateMockRead(*body), 1943 CreateMockRead(*body, 2),
1989 MockRead(ASYNC, 0, 0) // EOF 1944 MockRead(ASYNC, 0, 3) // EOF
1990 }; 1945 };
1991 1946
1992 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 1947 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1993 1948
1994 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1949 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1995 BoundNetLog(), GetParam(), NULL); 1950 BoundNetLog(), GetParam(), NULL);
1996 helper.RunToCompletion(&data); 1951 helper.RunToCompletion(&data);
1997 TransactionHelperResult out = helper.output(); 1952 TransactionHelperResult out = helper.output();
1998 EXPECT_EQ(OK, out.rv); 1953 EXPECT_EQ(OK, out.rv);
1999 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1954 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
2000 EXPECT_EQ("hello!", out.response_data); 1955 EXPECT_EQ("hello!", out.response_data);
2001 } 1956 }
2002 1957
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2085 data.SetStop(20); 2040 data.SetStop(20);
2086 data.Run(); 2041 data.Run();
2087 2042
2088 helper.VerifyDataConsumed(); 2043 helper.VerifyDataConsumed();
2089 } 2044 }
2090 2045
2091 // Test that the transaction doesn't crash when we don't have a reply. 2046 // Test that the transaction doesn't crash when we don't have a reply.
2092 TEST_P(SpdyNetworkTransactionTest, ResponseWithoutSynReply) { 2047 TEST_P(SpdyNetworkTransactionTest, ResponseWithoutSynReply) {
2093 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2048 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2094 MockRead reads[] = { 2049 MockRead reads[] = {
2095 CreateMockRead(*body), 2050 CreateMockRead(*body, 1), MockRead(ASYNC, 0, 3) // EOF
2096 MockRead(ASYNC, 0, 0) // EOF
2097 }; 2051 };
2098 2052
2099 DelayedSocketData data(1, reads, arraysize(reads), NULL, 0); 2053 scoped_ptr<SpdyFrame> req(
2054 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2055 scoped_ptr<SpdyFrame> rst(
2056 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
2057 MockWrite writes[] = {
2058 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
2059 };
2060 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2100 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2061 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2101 BoundNetLog(), GetParam(), NULL); 2062 BoundNetLog(), GetParam(), NULL);
2102 helper.RunToCompletion(&data); 2063 helper.RunToCompletion(&data);
2103 TransactionHelperResult out = helper.output(); 2064 TransactionHelperResult out = helper.output();
2104 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 2065 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
2105 } 2066 }
2106 2067
2107 // Test that the transaction doesn't crash when we get two replies on the same 2068 // Test that the transaction doesn't crash when we get two replies on the same
2108 // stream ID. See http://crbug.com/45639. 2069 // stream ID. See http://crbug.com/45639.
2109 TEST_P(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { 2070 TEST_P(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) {
2110 scoped_ptr<SpdyFrame> req( 2071 scoped_ptr<SpdyFrame> req(
2111 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2072 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2112 scoped_ptr<SpdyFrame> rst( 2073 scoped_ptr<SpdyFrame> rst(
2113 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 2074 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
2114 MockWrite writes[] = { 2075 MockWrite writes[] = {
2115 CreateMockWrite(*req), 2076 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
2116 CreateMockWrite(*rst),
2117 }; 2077 };
2118 2078
2119 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2079 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2120 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2080 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2121 MockRead reads[] = { 2081 MockRead reads[] = {
2122 CreateMockRead(*resp), 2082 CreateMockRead(*resp, 1),
2123 CreateMockRead(*resp), 2083 CreateMockRead(*resp, 2),
2124 CreateMockRead(*body), 2084 CreateMockRead(*body, 3),
2125 MockRead(ASYNC, 0, 0) // EOF 2085 MockRead(ASYNC, 0, 5) // EOF
2126 }; 2086 };
2127 2087
2128 DelayedSocketData data(1, reads, arraysize(reads), 2088 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2129 writes, arraysize(writes));
2130 2089
2131 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2090 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2132 BoundNetLog(), GetParam(), NULL); 2091 BoundNetLog(), GetParam(), NULL);
2133 helper.RunPreTestSetup(); 2092 helper.RunPreTestSetup();
2134 helper.AddData(&data); 2093 helper.AddData(&data);
2135 2094
2136 HttpNetworkTransaction* trans = helper.trans(); 2095 HttpNetworkTransaction* trans = helper.trans();
2137 2096
2138 TestCompletionCallback callback; 2097 TestCompletionCallback callback;
2139 int rv = trans->Start(&helper.request(), callback.callback(), BoundNetLog()); 2098 int rv = trans->Start(&helper.request(), callback.callback(), BoundNetLog());
(...skipping 12 matching lines...) Expand all
2152 helper.VerifyDataConsumed(); 2111 helper.VerifyDataConsumed();
2153 } 2112 }
2154 2113
2155 TEST_P(SpdyNetworkTransactionTest, ResetReplyWithTransferEncoding) { 2114 TEST_P(SpdyNetworkTransactionTest, ResetReplyWithTransferEncoding) {
2156 // Construct the request. 2115 // Construct the request.
2157 scoped_ptr<SpdyFrame> req( 2116 scoped_ptr<SpdyFrame> req(
2158 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2117 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2159 scoped_ptr<SpdyFrame> rst( 2118 scoped_ptr<SpdyFrame> rst(
2160 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 2119 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
2161 MockWrite writes[] = { 2120 MockWrite writes[] = {
2162 CreateMockWrite(*req), 2121 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
2163 CreateMockWrite(*rst),
2164 }; 2122 };
2165 2123
2166 const char* const headers[] = { 2124 const char* const headers[] = {
2167 "transfer-encoding", "chunked" 2125 "transfer-encoding", "chunked"
2168 }; 2126 };
2169 scoped_ptr<SpdyFrame> resp( 2127 scoped_ptr<SpdyFrame> resp(
2170 spdy_util_.ConstructSpdyGetSynReply(headers, 1, 1)); 2128 spdy_util_.ConstructSpdyGetSynReply(headers, 1, 1));
2171 scoped_ptr<SpdyFrame> body( 2129 scoped_ptr<SpdyFrame> body(
2172 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2130 spdy_util_.ConstructSpdyBodyFrame(1, true));
2173 MockRead reads[] = { 2131 MockRead reads[] = {
2174 CreateMockRead(*resp), 2132 CreateMockRead(*resp, 1),
2175 CreateMockRead(*body), 2133 CreateMockRead(*body, 3),
2176 MockRead(ASYNC, 0, 0) // EOF 2134 MockRead(ASYNC, 0, 4) // EOF
2177 }; 2135 };
2178 2136
2179 DelayedSocketData data(1, reads, arraysize(reads), 2137 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2180 writes, arraysize(writes));
2181 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2138 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2182 BoundNetLog(), GetParam(), NULL); 2139 BoundNetLog(), GetParam(), NULL);
2183 helper.RunToCompletion(&data); 2140 helper.RunToCompletion(&data);
2184 TransactionHelperResult out = helper.output(); 2141 TransactionHelperResult out = helper.output();
2185 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 2142 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
2186 2143
2187 helper.session()->spdy_session_pool()->CloseAllSessions(); 2144 helper.session()->spdy_session_pool()->CloseAllSessions();
2188 helper.VerifyDataConsumed(); 2145 helper.VerifyDataConsumed();
2189 } 2146 }
2190 2147
2191 TEST_P(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) { 2148 TEST_P(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) {
2192 // Construct the request. 2149 // Construct the request.
2193 scoped_ptr<SpdyFrame> req( 2150 scoped_ptr<SpdyFrame> req(
2194 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2151 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2195 scoped_ptr<SpdyFrame> rst( 2152 scoped_ptr<SpdyFrame> rst(
2196 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2153 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2197 MockWrite writes[] = { 2154 MockWrite writes[] = {
2198 CreateMockWrite(*req), 2155 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
2199 CreateMockWrite(*rst),
2200 }; 2156 };
2201 2157
2202 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2158 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2203 const char* const headers[] = { 2159 const char* const headers[] = {
2204 "transfer-encoding", "chunked" 2160 "transfer-encoding", "chunked"
2205 }; 2161 };
2206 scoped_ptr<SpdyFrame> push( 2162 scoped_ptr<SpdyFrame> push(
2207 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1, 2163 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1,
2208 GetDefaultUrlWithPath("/1").c_str())); 2164 GetDefaultUrlWithPath("/1").c_str()));
2209 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2165 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2210 MockRead reads[] = { 2166 MockRead reads[] = {
2211 CreateMockRead(*resp), 2167 CreateMockRead(*resp, 1),
2212 CreateMockRead(*push), 2168 CreateMockRead(*push, 2),
2213 CreateMockRead(*body), 2169 CreateMockRead(*body, 3),
2214 MockRead(ASYNC, 0, 0) // EOF 2170 MockRead(ASYNC, 0, 5) // EOF
2215 }; 2171 };
2216 2172
2217 DelayedSocketData data(1, reads, arraysize(reads), 2173 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2218 writes, arraysize(writes));
2219 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2174 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2220 BoundNetLog(), GetParam(), NULL); 2175 BoundNetLog(), GetParam(), NULL);
2221 helper.RunToCompletion(&data); 2176 helper.RunToCompletion(&data);
2222 TransactionHelperResult out = helper.output(); 2177 TransactionHelperResult out = helper.output();
2223 EXPECT_EQ(OK, out.rv); 2178 EXPECT_EQ(OK, out.rv);
2224 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 2179 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
2225 EXPECT_EQ("hello!", out.response_data); 2180 EXPECT_EQ("hello!", out.response_data);
2226 2181
2227 helper.session()->spdy_session_pool()->CloseAllSessions(); 2182 helper.session()->spdy_session_pool()->CloseAllSessions();
2228 helper.VerifyDataConsumed(); 2183 helper.VerifyDataConsumed();
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
2309 2264
2310 helper.VerifyDataConsumed(); 2265 helper.VerifyDataConsumed();
2311 } 2266 }
2312 2267
2313 // Verify that the client can correctly deal with the user callback attempting 2268 // Verify that the client can correctly deal with the user callback attempting
2314 // to start another transaction on a session that is closing down. See 2269 // to start another transaction on a session that is closing down. See
2315 // http://crbug.com/47455 2270 // http://crbug.com/47455
2316 TEST_P(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) { 2271 TEST_P(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) {
2317 scoped_ptr<SpdyFrame> req( 2272 scoped_ptr<SpdyFrame> req(
2318 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2273 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2319 MockWrite writes[] = { CreateMockWrite(*req) }; 2274 MockWrite writes[] = {CreateMockWrite(*req)};
2320 MockWrite writes2[] = { CreateMockWrite(*req) }; 2275 MockWrite writes2[] = {CreateMockWrite(*req, 0)};
2321 2276
2322 // The indicated length of this frame is longer than its actual length. When 2277 // The indicated length of this frame is longer than its actual length. When
2323 // the session receives an empty frame after this one, it shuts down the 2278 // the session receives an empty frame after this one, it shuts down the
2324 // session, and calls the read callback with the incomplete data. 2279 // session, and calls the read callback with the incomplete data.
2325 const uint8 kGetBodyFrame2[] = { 2280 const uint8 kGetBodyFrame2[] = {
2326 0x00, 0x00, 0x00, 0x01, 2281 0x00, 0x00, 0x00, 0x01,
2327 0x01, 0x00, 0x00, 0x07, 2282 0x01, 0x00, 0x00, 0x07,
2328 'h', 'e', 'l', 'l', 'o', '!', 2283 'h', 'e', 'l', 'l', 'o', '!',
2329 }; 2284 };
2330 2285
2331 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2286 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2332 MockRead reads[] = { 2287 MockRead reads[] = {
2333 CreateMockRead(*resp, 2), 2288 CreateMockRead(*resp, 1),
2334 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause 2289 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
2335 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2), 2290 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2),
2336 arraysize(kGetBodyFrame2), 4), 2291 arraysize(kGetBodyFrame2), 3),
2337 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2292 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause
2338 MockRead(ASYNC, 0, 0, 6), // EOF 2293 MockRead(ASYNC, 0, 0, 5), // EOF
2339 }; 2294 };
2340 MockRead reads2[] = { 2295 MockRead reads2[] = {
2341 CreateMockRead(*resp, 2), 2296 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF
2342 MockRead(ASYNC, 0, 0, 3), // EOF
2343 }; 2297 };
2344 2298
2345 OrderedSocketData data(reads, arraysize(reads), 2299 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2346 writes, arraysize(writes)); 2300 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2347 DelayedSocketData data2(1, reads2, arraysize(reads2), 2301 arraysize(writes2));
2348 writes2, arraysize(writes2));
2349 2302
2350 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2303 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2351 BoundNetLog(), GetParam(), NULL); 2304 BoundNetLog(), GetParam(), NULL);
2352 helper.RunPreTestSetup(); 2305 helper.RunPreTestSetup();
2353 helper.AddData(&data); 2306 helper.AddData(&data);
2354 helper.AddData(&data2); 2307 helper.AddData(&data2);
2355 HttpNetworkTransaction* trans = helper.trans(); 2308 HttpNetworkTransaction* trans = helper.trans();
2356 2309
2357 // Start the transaction with basic parameters. 2310 // Start the transaction with basic parameters.
2358 TestCompletionCallback callback; 2311 TestCompletionCallback callback;
2359 int rv = trans->Start(&helper.request(), callback.callback(), BoundNetLog()); 2312 int rv = trans->Start(&helper.request(), callback.callback(), BoundNetLog());
2360 EXPECT_EQ(ERR_IO_PENDING, rv); 2313 EXPECT_EQ(ERR_IO_PENDING, rv);
2361 rv = callback.WaitForResult(); 2314 rv = callback.WaitForResult();
2362 2315
2363 const int kSize = 3000; 2316 const int kSize = 3000;
2364 scoped_refptr<IOBuffer> buf(new IOBuffer(kSize)); 2317 scoped_refptr<IOBuffer> buf(new IOBuffer(kSize));
2365 rv = trans->Read( 2318 rv = trans->Read(
2366 buf.get(), kSize, 2319 buf.get(), kSize,
2367 base::Bind(&SpdyNetworkTransactionTest::StartTransactionCallback, 2320 base::Bind(&SpdyNetworkTransactionTest::StartTransactionCallback,
2368 helper.session(), GURL(GetDefaultUrl()))); 2321 helper.session(), GURL(GetDefaultUrl())));
2322 ASSERT_EQ(ERR_IO_PENDING, rv);
2369 // This forces an err_IO_pending, which sets the callback. 2323 // This forces an err_IO_pending, which sets the callback.
2370 data.CompleteRead(); 2324 data.CompleteRead();
2371 // This finishes the read. 2325 // This finishes the read.
2372 data.CompleteRead(); 2326 data.CompleteRead();
2373 helper.VerifyDataConsumed(); 2327 helper.VerifyDataConsumed();
2374 } 2328 }
2375 2329
2376 // Verify that the client can correctly deal with the user callback deleting the 2330 // Verify that the client can correctly deal with the user callback deleting the
2377 // transaction. Failures will usually be valgrind errors. See 2331 // transaction. Failures will usually be valgrind errors. See
2378 // http://crbug.com/46925 2332 // http://crbug.com/46925
2379 TEST_P(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { 2333 TEST_P(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) {
2380 scoped_ptr<SpdyFrame> req( 2334 scoped_ptr<SpdyFrame> req(
2381 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2335 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2382 MockWrite writes[] = { CreateMockWrite(*req) }; 2336 MockWrite writes[] = {CreateMockWrite(*req, 0)};
2383 2337
2384 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2338 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2385 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2339 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2386 MockRead reads[] = { 2340 MockRead reads[] = {
2387 CreateMockRead(*resp.get(), 2), 2341 CreateMockRead(*resp.get(), 1),
2388 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause 2342 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
2389 CreateMockRead(*body.get(), 4), 2343 CreateMockRead(*body.get(), 3),
2390 MockRead(ASYNC, 0, 0, 5), // EOF 2344 MockRead(ASYNC, 0, 0, 4), // EOF
2391 }; 2345 };
2392 2346
2393 OrderedSocketData data(reads, arraysize(reads), 2347 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2394 writes, arraysize(writes));
2395 2348
2396 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2349 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2397 BoundNetLog(), GetParam(), NULL); 2350 BoundNetLog(), GetParam(), NULL);
2398 helper.RunPreTestSetup(); 2351 helper.RunPreTestSetup();
2399 helper.AddData(&data); 2352 helper.AddData(&data);
2400 HttpNetworkTransaction* trans = helper.trans(); 2353 HttpNetworkTransaction* trans = helper.trans();
2401 2354
2402 // Start the transaction with basic parameters. 2355 // Start the transaction with basic parameters.
2403 TestCompletionCallback callback; 2356 TestCompletionCallback callback;
2404 int rv = trans->Start(&helper.request(), callback.callback(), BoundNetLog()); 2357 int rv = trans->Start(&helper.request(), callback.callback(), BoundNetLog());
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2451 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2404 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2452 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2405 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true));
2453 MockWrite writes2[] = { 2406 MockWrite writes2[] = {
2454 CreateMockWrite(*req2, 1), 2407 CreateMockWrite(*req2, 1),
2455 }; 2408 };
2456 MockRead reads2[] = { 2409 MockRead reads2[] = {
2457 CreateMockRead(*resp2, 2), 2410 CreateMockRead(*resp2, 2),
2458 CreateMockRead(*body2, 3), 2411 CreateMockRead(*body2, 3),
2459 MockRead(ASYNC, 0, 0, 4) // EOF 2412 MockRead(ASYNC, 0, 0, 4) // EOF
2460 }; 2413 };
2461 OrderedSocketData data(reads, arraysize(reads), 2414 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2462 writes, arraysize(writes)); 2415 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2463 OrderedSocketData data2(reads2, arraysize(reads2), 2416 arraysize(writes2));
2464 writes2, arraysize(writes2));
2465 2417
2466 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN 2418 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN
2467 TestDelegate d; 2419 TestDelegate d;
2468 { 2420 {
2469 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol); 2421 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol);
2470 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest( 2422 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest(
2471 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d)); 2423 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d));
2472 spdy_url_request_context.socket_factory(). 2424 spdy_url_request_context.socket_factory().
2473 AddSocketDataProvider(&data); 2425 AddSocketDataProvider(&data);
2474 spdy_url_request_context.socket_factory(). 2426 spdy_url_request_context.socket_factory().
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
2534 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2486 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2535 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2487 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true));
2536 MockWrite writes2[] = { 2488 MockWrite writes2[] = {
2537 CreateMockWrite(*req2, 1), 2489 CreateMockWrite(*req2, 1),
2538 }; 2490 };
2539 MockRead reads2[] = { 2491 MockRead reads2[] = {
2540 CreateMockRead(*resp2, 2), 2492 CreateMockRead(*resp2, 2),
2541 CreateMockRead(*body2, 3), 2493 CreateMockRead(*body2, 3),
2542 MockRead(ASYNC, 0, 0, 5) // EOF 2494 MockRead(ASYNC, 0, 0, 5) // EOF
2543 }; 2495 };
2544 OrderedSocketData data(reads, arraysize(reads), 2496 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2545 writes, arraysize(writes)); 2497 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2546 OrderedSocketData data2(reads2, arraysize(reads2), 2498 arraysize(writes2));
2547 writes2, arraysize(writes2));
2548 2499
2549 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN 2500 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN
2550 TestDelegate d; 2501 TestDelegate d;
2551 TestDelegate d2; 2502 TestDelegate d2;
2552 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol); 2503 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol);
2553 { 2504 {
2554 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest( 2505 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest(
2555 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d)); 2506 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d));
2556 spdy_url_request_context.socket_factory(). 2507 spdy_url_request_context.socket_factory().
2557 AddSocketDataProvider(&data); 2508 AddSocketDataProvider(&data);
(...skipping 16 matching lines...) Expand all
2574 EXPECT_EQ(1, d2.received_redirect_count()); 2525 EXPECT_EQ(1, d2.received_redirect_count());
2575 2526
2576 r2->FollowDeferredRedirect(); 2527 r2->FollowDeferredRedirect();
2577 base::RunLoop().Run(); 2528 base::RunLoop().Run();
2578 EXPECT_EQ(1, d2.response_started_count()); 2529 EXPECT_EQ(1, d2.response_started_count());
2579 EXPECT_FALSE(d2.received_data_before_response()); 2530 EXPECT_FALSE(d2.received_data_before_response());
2580 EXPECT_EQ(URLRequestStatus::SUCCESS, r2->status().status()); 2531 EXPECT_EQ(URLRequestStatus::SUCCESS, r2->status().status());
2581 std::string contents2("hello!"); 2532 std::string contents2("hello!");
2582 EXPECT_EQ(contents2, d2.data_received()); 2533 EXPECT_EQ(contents2, d2.data_received());
2583 } 2534 }
2584 data.CompleteRead(); 2535 EXPECT_TRUE(data.AllReadDataConsumed());
2585 data2.CompleteRead(); 2536 EXPECT_TRUE(data.AllWriteDataConsumed());
2586 EXPECT_TRUE(data.at_read_eof()); 2537 EXPECT_TRUE(data2.AllReadDataConsumed());
2587 EXPECT_TRUE(data.at_write_eof()); 2538 EXPECT_TRUE(data2.AllWriteDataConsumed());
2588 EXPECT_TRUE(data2.at_read_eof());
2589 EXPECT_TRUE(data2.at_write_eof());
2590 } 2539 }
2591 2540
2592 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { 2541 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) {
2593 scoped_ptr<SpdyFrame> stream1_syn( 2542 scoped_ptr<SpdyFrame> stream1_syn(
2594 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2543 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2595 scoped_ptr<SpdyFrame> stream1_body( 2544 scoped_ptr<SpdyFrame> stream1_body(
2596 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2545 spdy_util_.ConstructSpdyBodyFrame(1, true));
2597 MockWrite writes[] = { 2546 MockWrite writes[] = {
2598 CreateMockWrite(*stream1_syn, 1), 2547 CreateMockWrite(*stream1_syn, 0),
2599 }; 2548 };
2600 2549
2601 scoped_ptr<SpdyFrame> 2550 scoped_ptr<SpdyFrame>
2602 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2551 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2603 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2552 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2604 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2553 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2605 const char kPushedData[] = "pushed"; 2554 const char kPushedData[] = "pushed";
2606 scoped_ptr<SpdyFrame> stream2_body( 2555 scoped_ptr<SpdyFrame> stream2_body(
2607 spdy_util_.ConstructSpdyBodyFrame( 2556 spdy_util_.ConstructSpdyBodyFrame(
2608 2, kPushedData, strlen(kPushedData), true)); 2557 2, kPushedData, strlen(kPushedData), true));
2609 MockRead reads[] = { 2558 MockRead reads[] = {
2610 CreateMockRead(*stream1_reply, 2), 2559 CreateMockRead(*stream1_reply, 1),
2611 CreateMockRead(*stream2_syn, 3), 2560 CreateMockRead(*stream2_syn, 2),
2612 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 2561 CreateMockRead(*stream1_body, 3, SYNCHRONOUS),
2613 CreateMockRead(*stream2_body, 5), 2562 CreateMockRead(*stream2_body, 4),
2614 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2563 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2615 }; 2564 };
2616 2565
2617 HttpResponseInfo response; 2566 HttpResponseInfo response;
2618 HttpResponseInfo response2; 2567 HttpResponseInfo response2;
2619 std::string expected_push_result("pushed"); 2568 std::string expected_push_result("pushed");
2620 OrderedSocketData data(reads, arraysize(reads), 2569 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2621 writes, arraysize(writes));
2622 RunServerPushTest(&data, 2570 RunServerPushTest(&data,
2623 &response, 2571 &response,
2624 &response2, 2572 &response2,
2625 expected_push_result); 2573 expected_push_result);
2626 2574
2627 // Verify the SYN_REPLY. 2575 // Verify the SYN_REPLY.
2628 EXPECT_TRUE(response.headers.get() != NULL); 2576 EXPECT_TRUE(response.headers.get() != NULL);
2629 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2577 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2630 2578
2631 // Verify the pushed stream. 2579 // Verify the pushed stream.
2632 EXPECT_TRUE(response2.headers.get() != NULL); 2580 EXPECT_TRUE(response2.headers.get() != NULL);
2633 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2581 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2634 } 2582 }
2635 2583
2636 TEST_P(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) { 2584 TEST_P(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) {
2637 scoped_ptr<SpdyFrame> stream1_syn( 2585 scoped_ptr<SpdyFrame> stream1_syn(
2638 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2586 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2639 scoped_ptr<SpdyFrame> stream1_body( 2587 scoped_ptr<SpdyFrame> stream1_body(
2640 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2588 spdy_util_.ConstructSpdyBodyFrame(1, true));
2641 MockWrite writes[] = { 2589 MockWrite writes[] = {
2642 CreateMockWrite(*stream1_syn, 1), 2590 CreateMockWrite(*stream1_syn, 0),
2643 }; 2591 };
2644 2592
2645 scoped_ptr<SpdyFrame> 2593 scoped_ptr<SpdyFrame>
2646 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2594 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2647 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2595 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2648 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2596 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2649 const char kPushedData[] = "pushed"; 2597 const char kPushedData[] = "pushed";
2650 scoped_ptr<SpdyFrame> stream2_body( 2598 scoped_ptr<SpdyFrame> stream2_body(
2651 spdy_util_.ConstructSpdyBodyFrame( 2599 spdy_util_.ConstructSpdyBodyFrame(
2652 2, kPushedData, strlen(kPushedData), true)); 2600 2, kPushedData, strlen(kPushedData), true));
2653 MockRead reads[] = { 2601 MockRead reads[] = {
2654 CreateMockRead(*stream2_syn, 2), 2602 CreateMockRead(*stream2_syn, 1),
2655 CreateMockRead(*stream1_reply, 3), 2603 CreateMockRead(*stream1_reply, 2),
2656 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 2604 CreateMockRead(*stream1_body, 3, SYNCHRONOUS),
2657 CreateMockRead(*stream2_body, 5), 2605 CreateMockRead(*stream2_body, 4),
2658 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2606 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2659 }; 2607 };
2660 2608
2661 HttpResponseInfo response; 2609 HttpResponseInfo response;
2662 HttpResponseInfo response2; 2610 HttpResponseInfo response2;
2663 std::string expected_push_result("pushed"); 2611 std::string expected_push_result("pushed");
2664 OrderedSocketData data(reads, arraysize(reads), 2612 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2665 writes, arraysize(writes));
2666 RunServerPushTest(&data, 2613 RunServerPushTest(&data,
2667 &response, 2614 &response,
2668 &response2, 2615 &response2,
2669 expected_push_result); 2616 expected_push_result);
2670 2617
2671 // Verify the SYN_REPLY. 2618 // Verify the SYN_REPLY.
2672 EXPECT_TRUE(response.headers.get() != NULL); 2619 EXPECT_TRUE(response.headers.get() != NULL);
2673 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2620 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2674 2621
2675 // Verify the pushed stream. 2622 // Verify the pushed stream.
2676 EXPECT_TRUE(response2.headers.get() != NULL); 2623 EXPECT_TRUE(response2.headers.get() != NULL);
2677 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2624 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2678 } 2625 }
2679 2626
2680 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) { 2627 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) {
2681 scoped_ptr<SpdyFrame> stream1_syn( 2628 scoped_ptr<SpdyFrame> stream1_syn(
2682 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2629 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2683 MockWrite writes[] = { CreateMockWrite(*stream1_syn, 1), }; 2630 MockWrite writes[] = {
2631 CreateMockWrite(*stream1_syn, 0),
2632 };
2684 2633
2685 scoped_ptr<SpdyFrame> 2634 scoped_ptr<SpdyFrame>
2686 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2635 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2687 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2636 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2688 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2637 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2689 const char kPushedData[] = "pushed"; 2638 const char kPushedData[] = "pushed";
2690 scoped_ptr<SpdyFrame> stream2_body( 2639 scoped_ptr<SpdyFrame> stream2_body(
2691 spdy_util_.ConstructSpdyBodyFrame( 2640 spdy_util_.ConstructSpdyBodyFrame(
2692 2, kPushedData, strlen(kPushedData), true)); 2641 2, kPushedData, strlen(kPushedData), true));
2693 scoped_ptr<SpdyFrame> 2642 scoped_ptr<SpdyFrame>
2694 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2643 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2695 MockRead reads[] = { 2644 MockRead reads[] = {
2696 CreateMockRead(*stream1_reply, 2), 2645 CreateMockRead(*stream1_reply, 1),
2697 CreateMockRead(*stream2_syn, 3), 2646 CreateMockRead(*stream2_syn, 2),
2698 CreateMockRead(*stream2_body, 4), 2647 CreateMockRead(*stream2_body, 3),
2699 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 2648 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
2700 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2649 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2701 }; 2650 };
2702 2651
2703 HttpResponseInfo response; 2652 HttpResponseInfo response;
2704 HttpResponseInfo response2; 2653 HttpResponseInfo response2;
2705 std::string expected_push_result("pushed"); 2654 std::string expected_push_result("pushed");
2706 OrderedSocketData data(reads, arraysize(reads), 2655 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2707 writes, arraysize(writes));
2708 RunServerPushTest(&data, 2656 RunServerPushTest(&data,
2709 &response, 2657 &response,
2710 &response2, 2658 &response2,
2711 expected_push_result); 2659 expected_push_result);
2712 2660
2713 // Verify the SYN_REPLY. 2661 // Verify the SYN_REPLY.
2714 EXPECT_TRUE(response.headers.get() != NULL); 2662 EXPECT_TRUE(response.headers.get() != NULL);
2715 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2663 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2716 2664
2717 // Verify the pushed stream. 2665 // Verify the pushed stream.
2718 EXPECT_TRUE(response2.headers.get() != NULL); 2666 EXPECT_TRUE(response2.headers.get() != NULL);
2719 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2667 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2720 } 2668 }
2721 2669
2722 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) { 2670 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) {
2723 scoped_ptr<SpdyFrame> stream1_syn( 2671 scoped_ptr<SpdyFrame> stream1_syn(
2724 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2672 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2725 scoped_ptr<SpdyFrame> stream1_body( 2673 scoped_ptr<SpdyFrame> stream1_body(
2726 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2674 spdy_util_.ConstructSpdyBodyFrame(1, true));
2727 MockWrite writes[] = { 2675 MockWrite writes[] = {
2728 CreateMockWrite(*stream1_syn, 1), 2676 CreateMockWrite(*stream1_syn, 0),
2729 }; 2677 };
2730 2678
2731 scoped_ptr<SpdyFrame> 2679 scoped_ptr<SpdyFrame>
2732 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2680 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2733 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2681 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2734 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2682 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2735 scoped_ptr<SpdyFrame> stream2_rst( 2683 scoped_ptr<SpdyFrame> stream2_rst(
2736 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2684 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2737 MockRead reads[] = { 2685 MockRead reads[] = {
2738 CreateMockRead(*stream1_reply, 2), 2686 CreateMockRead(*stream1_reply, 1),
2739 CreateMockRead(*stream2_syn, 3), 2687 CreateMockRead(*stream2_syn, 2),
2740 CreateMockRead(*stream2_rst, 4), 2688 CreateMockRead(*stream2_rst, 3),
2741 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 2689 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
2742 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2690 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2743 }; 2691 };
2744 2692
2745 OrderedSocketData data(reads, arraysize(reads), 2693 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2746 writes, arraysize(writes));
2747 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2694 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2748 BoundNetLog(), GetParam(), NULL); 2695 BoundNetLog(), GetParam(), NULL);
2749 2696
2750 helper.RunPreTestSetup(); 2697 helper.RunPreTestSetup();
2751 helper.AddData(&data); 2698 helper.AddData(&data);
2752 2699
2753 HttpNetworkTransaction* trans = helper.trans(); 2700 HttpNetworkTransaction* trans = helper.trans();
2754 2701
2755 // Start the transaction with basic parameters. 2702 // Start the transaction with basic parameters.
2756 TestCompletionCallback callback; 2703 TestCompletionCallback callback;
2757 int rv = trans->Start( 2704 int rv = trans->Start(
2758 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2705 &CreateGetRequest(), callback.callback(), BoundNetLog());
2759 EXPECT_EQ(ERR_IO_PENDING, rv); 2706 EXPECT_EQ(ERR_IO_PENDING, rv);
2760 rv = callback.WaitForResult(); 2707 rv = callback.WaitForResult();
2761 EXPECT_EQ(OK, rv); 2708 EXPECT_EQ(OK, rv);
2762 2709
2763 // Verify that we consumed all test data. 2710 // Verify that we consumed all test data.
2764 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 2711 EXPECT_TRUE(data.AllReadDataConsumed());
2765 << data.read_count() 2712 EXPECT_TRUE(data.AllWriteDataConsumed());
2766 << " Read index: "
2767 << data.read_index();
2768 EXPECT_TRUE(data.at_write_eof()) << "Write count: "
2769 << data.write_count()
2770 << " Write index: "
2771 << data.write_index();
2772 2713
2773 // Verify the SYN_REPLY. 2714 // Verify the SYN_REPLY.
2774 HttpResponseInfo response = *trans->GetResponseInfo(); 2715 HttpResponseInfo response = *trans->GetResponseInfo();
2775 EXPECT_TRUE(response.headers.get() != NULL); 2716 EXPECT_TRUE(response.headers.get() != NULL);
2776 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2717 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2777 } 2718 }
2778 2719
2779 // Verify that we don't leak streams and that we properly send a reset 2720 // Verify that we don't leak streams and that we properly send a reset
2780 // if the server pushes the same stream twice. 2721 // if the server pushes the same stream twice.
2781 TEST_P(SpdyNetworkTransactionTest, ServerPushDuplicate) { 2722 TEST_P(SpdyNetworkTransactionTest, ServerPushDuplicate) {
2782 scoped_ptr<SpdyFrame> stream1_syn( 2723 scoped_ptr<SpdyFrame> stream1_syn(
2783 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2724 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2784 scoped_ptr<SpdyFrame> stream1_body( 2725 scoped_ptr<SpdyFrame> stream1_body(
2785 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2726 spdy_util_.ConstructSpdyBodyFrame(1, true));
2786 scoped_ptr<SpdyFrame> stream3_rst( 2727 scoped_ptr<SpdyFrame> stream3_rst(
2787 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR)); 2728 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR));
2788 MockWrite writes[] = { 2729 MockWrite writes[] = {
2789 CreateMockWrite(*stream1_syn, 1), 2730 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream3_rst, 4),
2790 CreateMockWrite(*stream3_rst, 5),
2791 }; 2731 };
2792 2732
2793 scoped_ptr<SpdyFrame> 2733 scoped_ptr<SpdyFrame>
2794 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2734 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2795 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2735 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2796 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2736 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2797 const char kPushedData[] = "pushed"; 2737 const char kPushedData[] = "pushed";
2798 scoped_ptr<SpdyFrame> stream2_body( 2738 scoped_ptr<SpdyFrame> stream2_body(
2799 spdy_util_.ConstructSpdyBodyFrame( 2739 spdy_util_.ConstructSpdyBodyFrame(
2800 2, kPushedData, strlen(kPushedData), true)); 2740 2, kPushedData, strlen(kPushedData), true));
2801 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush( 2741 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush(
2802 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2742 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2803 MockRead reads[] = { 2743 MockRead reads[] = {
2804 CreateMockRead(*stream1_reply, 2), 2744 CreateMockRead(*stream1_reply, 1),
2805 CreateMockRead(*stream2_syn, 3), 2745 CreateMockRead(*stream2_syn, 2),
2806 CreateMockRead(*stream3_syn, 4), 2746 CreateMockRead(*stream3_syn, 3),
2807 CreateMockRead(*stream1_body, 6, SYNCHRONOUS), 2747 CreateMockRead(*stream1_body, 5),
2808 CreateMockRead(*stream2_body, 7), 2748 CreateMockRead(*stream2_body, 6),
2809 MockRead(ASYNC, ERR_IO_PENDING, 8), // Force a pause 2749 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause
2810 }; 2750 };
2811 2751
2812 HttpResponseInfo response; 2752 HttpResponseInfo response;
2813 HttpResponseInfo response2; 2753 HttpResponseInfo response2;
2814 std::string expected_push_result("pushed"); 2754 std::string expected_push_result("pushed");
2815 OrderedSocketData data(reads, arraysize(reads), 2755 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2816 writes, arraysize(writes));
2817 RunServerPushTest(&data, 2756 RunServerPushTest(&data,
2818 &response, 2757 &response,
2819 &response2, 2758 &response2,
2820 expected_push_result); 2759 expected_push_result);
2821 2760
2822 // Verify the SYN_REPLY. 2761 // Verify the SYN_REPLY.
2823 EXPECT_TRUE(response.headers.get() != NULL); 2762 EXPECT_TRUE(response.headers.get() != NULL);
2824 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2763 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2825 2764
2826 // Verify the pushed stream. 2765 // Verify the pushed stream.
2827 EXPECT_TRUE(response2.headers.get() != NULL); 2766 EXPECT_TRUE(response2.headers.get() != NULL);
2828 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2767 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2829 } 2768 }
2830 2769
2831 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { 2770 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) {
2832 scoped_ptr<SpdyFrame> stream1_syn( 2771 scoped_ptr<SpdyFrame> stream1_syn(
2833 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2772 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2834 scoped_ptr<SpdyFrame> stream1_body( 2773 scoped_ptr<SpdyFrame> stream1_body(
2835 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2774 spdy_util_.ConstructSpdyBodyFrame(1, true));
2836 MockWrite writes[] = { 2775 MockWrite writes[] = {
2837 CreateMockWrite(*stream1_syn, 1), 2776 CreateMockWrite(*stream1_syn, 0),
2838 }; 2777 };
2839 2778
2840 scoped_ptr<SpdyFrame> 2779 scoped_ptr<SpdyFrame>
2841 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2780 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2842 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2781 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2843 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2782 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2844 static const char kPushedData[] = "pushed my darling hello my baby"; 2783 static const char kPushedData[] = "pushed my darling hello my baby";
2845 scoped_ptr<SpdyFrame> stream2_body_base( 2784 scoped_ptr<SpdyFrame> stream2_body_base(
2846 spdy_util_.ConstructSpdyBodyFrame( 2785 spdy_util_.ConstructSpdyBodyFrame(
2847 2, kPushedData, strlen(kPushedData), true)); 2786 2, kPushedData, strlen(kPushedData), true));
2848 const size_t kChunkSize = strlen(kPushedData) / 4; 2787 const size_t kChunkSize = strlen(kPushedData) / 4;
2849 scoped_ptr<SpdyFrame> stream2_body1( 2788 scoped_ptr<SpdyFrame> stream2_body1(
2850 new SpdyFrame(stream2_body_base->data(), kChunkSize, false)); 2789 new SpdyFrame(stream2_body_base->data(), kChunkSize, false));
2851 scoped_ptr<SpdyFrame> stream2_body2( 2790 scoped_ptr<SpdyFrame> stream2_body2(
2852 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false)); 2791 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false));
2853 scoped_ptr<SpdyFrame> stream2_body3( 2792 scoped_ptr<SpdyFrame> stream2_body3(
2854 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize, 2793 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize,
2855 kChunkSize, false)); 2794 kChunkSize, false));
2856 scoped_ptr<SpdyFrame> stream2_body4( 2795 scoped_ptr<SpdyFrame> stream2_body4(
2857 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize, 2796 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize,
2858 stream2_body_base->size() - 3 * kChunkSize, false)); 2797 stream2_body_base->size() - 3 * kChunkSize, false));
2859 MockRead reads[] = { 2798 MockRead reads[] = {
2860 CreateMockRead(*stream1_reply, 2), 2799 CreateMockRead(*stream1_reply, 1),
2861 CreateMockRead(*stream2_syn, 3), 2800 CreateMockRead(*stream2_syn, 2),
2862 CreateMockRead(*stream2_body1, 4), 2801 CreateMockRead(*stream2_body1, 3),
2863 CreateMockRead(*stream2_body2, 5), 2802 CreateMockRead(*stream2_body2, 4),
2864 CreateMockRead(*stream2_body3, 6), 2803 CreateMockRead(*stream2_body3, 5),
2865 CreateMockRead(*stream2_body4, 7), 2804 CreateMockRead(*stream2_body4, 6),
2866 CreateMockRead(*stream1_body, 8, SYNCHRONOUS), 2805 CreateMockRead(*stream1_body, 7, SYNCHRONOUS),
2867 MockRead(ASYNC, ERR_IO_PENDING, 9), // Force a pause 2806 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause
2868 }; 2807 };
2869 2808
2870 HttpResponseInfo response; 2809 HttpResponseInfo response;
2871 HttpResponseInfo response2; 2810 HttpResponseInfo response2;
2872 std::string expected_push_result("pushed my darling hello my baby"); 2811 std::string expected_push_result("pushed my darling hello my baby");
2873 OrderedSocketData data(reads, arraysize(reads), 2812 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2874 writes, arraysize(writes));
2875 RunServerPushTest(&data, &response, &response2, kPushedData); 2813 RunServerPushTest(&data, &response, &response2, kPushedData);
2876 2814
2877 // Verify the SYN_REPLY. 2815 // Verify the SYN_REPLY.
2878 EXPECT_TRUE(response.headers.get() != NULL); 2816 EXPECT_TRUE(response.headers.get() != NULL);
2879 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2817 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2880 2818
2881 // Verify the pushed stream. 2819 // Verify the pushed stream.
2882 EXPECT_TRUE(response2.headers.get() != NULL); 2820 EXPECT_TRUE(response2.headers.get() != NULL);
2883 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2821 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2884 } 2822 }
2885 2823
2886 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { 2824 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
2887 scoped_ptr<SpdyFrame> stream1_syn( 2825 scoped_ptr<SpdyFrame> stream1_syn(
2888 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2826 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2889 scoped_ptr<SpdyFrame> stream1_body( 2827 scoped_ptr<SpdyFrame> stream1_body(
2890 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2828 spdy_util_.ConstructSpdyBodyFrame(1, true));
2891 MockWrite writes[] = { 2829 MockWrite writes[] = {
2892 CreateMockWrite(*stream1_syn, 1), 2830 CreateMockWrite(*stream1_syn, 0),
2893 }; 2831 };
2894 2832
2895 scoped_ptr<SpdyFrame> 2833 scoped_ptr<SpdyFrame>
2896 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2834 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2897 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2835 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2898 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2836 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2899 static const char kPushedData[] = "pushed my darling hello my baby"; 2837 static const char kPushedData[] = "pushed my darling hello my baby";
2900 scoped_ptr<SpdyFrame> stream2_body_base( 2838 scoped_ptr<SpdyFrame> stream2_body_base(
2901 spdy_util_.ConstructSpdyBodyFrame( 2839 spdy_util_.ConstructSpdyBodyFrame(
2902 2, kPushedData, strlen(kPushedData), true)); 2840 2, kPushedData, strlen(kPushedData), true));
2903 const size_t kChunkSize = strlen(kPushedData) / 4; 2841 const size_t kChunkSize = strlen(kPushedData) / 4;
2904 scoped_ptr<SpdyFrame> stream2_body1( 2842 scoped_ptr<SpdyFrame> stream2_body1(
2905 new SpdyFrame(stream2_body_base->data(), kChunkSize, false)); 2843 new SpdyFrame(stream2_body_base->data(), kChunkSize, false));
2906 scoped_ptr<SpdyFrame> stream2_body2( 2844 scoped_ptr<SpdyFrame> stream2_body2(
2907 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false)); 2845 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false));
2908 scoped_ptr<SpdyFrame> stream2_body3( 2846 scoped_ptr<SpdyFrame> stream2_body3(
2909 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize, 2847 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize,
2910 kChunkSize, false)); 2848 kChunkSize, false));
2911 scoped_ptr<SpdyFrame> stream2_body4( 2849 scoped_ptr<SpdyFrame> stream2_body4(
2912 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize, 2850 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize,
2913 stream2_body_base->size() - 3 * kChunkSize, false)); 2851 stream2_body_base->size() - 3 * kChunkSize, false));
2914 MockRead reads[] = { 2852 MockRead reads[] = {
2915 CreateMockRead(*stream1_reply, 2), 2853 CreateMockRead(*stream1_reply, 1),
2916 CreateMockRead(*stream2_syn, 3), 2854 CreateMockRead(*stream2_syn, 2),
2917 CreateMockRead(*stream2_body1, 4), 2855 CreateMockRead(*stream2_body1, 3),
2918 CreateMockRead(*stream2_body2, 5), 2856 CreateMockRead(*stream2_body2, 4),
2919 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2857 CreateMockRead(*stream2_body3, 5),
2920 CreateMockRead(*stream2_body3, 7), 2858 CreateMockRead(*stream2_body4, 6),
2921 CreateMockRead(*stream2_body4, 8), 2859 CreateMockRead(*stream1_body.get(), 7, SYNCHRONOUS),
2922 CreateMockRead(*stream1_body.get(), 9, SYNCHRONOUS), 2860 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause.
2923 MockRead(ASYNC, ERR_IO_PENDING, 10) // Force a pause.
2924 }; 2861 };
2925 2862
2926 HttpResponseInfo response; 2863 HttpResponseInfo response;
2927 HttpResponseInfo response2; 2864 HttpResponseInfo response2;
2928 OrderedSocketData data(reads, arraysize(reads), 2865 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2929 writes, arraysize(writes));
2930 RunServerPushTest(&data, &response, &response2, kPushedData); 2866 RunServerPushTest(&data, &response, &response2, kPushedData);
2931 2867
2932 // Verify the SYN_REPLY. 2868 // Verify the SYN_REPLY.
2933 EXPECT_TRUE(response.headers.get() != NULL); 2869 EXPECT_TRUE(response.headers.get() != NULL);
2934 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2870 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2935 2871
2936 // Verify the pushed stream. 2872 // Verify the pushed stream.
2937 EXPECT_TRUE(response2.headers.get() != NULL); 2873 EXPECT_TRUE(response2.headers.get() != NULL);
2938 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2874 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2939 } 2875 }
2940 2876
2941 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { 2877 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
2942 if (spdy_util_.spdy_version() == SPDY4) { 2878 if (spdy_util_.spdy_version() == SPDY4) {
2943 // PUSH_PROMISE with stream id 0 is connection-level error. 2879 // PUSH_PROMISE with stream id 0 is connection-level error.
2944 // TODO(baranovich): Test session going away. 2880 // TODO(baranovich): Test session going away.
2945 return; 2881 return;
2946 } 2882 }
2947 2883
2948 scoped_ptr<SpdyFrame> stream1_syn( 2884 scoped_ptr<SpdyFrame> stream1_syn(
2949 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2885 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2950 scoped_ptr<SpdyFrame> stream1_body( 2886 scoped_ptr<SpdyFrame> stream1_body(
2951 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2887 spdy_util_.ConstructSpdyBodyFrame(1, true));
2952 scoped_ptr<SpdyFrame> stream2_rst( 2888 scoped_ptr<SpdyFrame> stream2_rst(
2953 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 2889 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
2954 MockWrite writes[] = { 2890 MockWrite writes[] = {
2955 CreateMockWrite(*stream1_syn, 1), 2891 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
2956 CreateMockWrite(*stream2_rst, 4),
2957 }; 2892 };
2958 2893
2959 scoped_ptr<SpdyFrame> 2894 scoped_ptr<SpdyFrame>
2960 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2895 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2961 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2896 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2962 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); 2897 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str()));
2963 MockRead reads[] = { 2898 MockRead reads[] = {
2964 CreateMockRead(*stream1_reply, 2), 2899 CreateMockRead(*stream1_reply, 1),
2965 CreateMockRead(*stream2_syn, 3), 2900 CreateMockRead(*stream2_syn, 2),
2966 CreateMockRead(*stream1_body, 4), 2901 CreateMockRead(*stream1_body, 4),
2967 MockRead(ASYNC, ERR_IO_PENDING, 5) // Force a pause 2902 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
2968 }; 2903 };
2969 2904
2970 OrderedSocketData data(reads, arraysize(reads), 2905 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2971 writes, arraysize(writes));
2972 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2906 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2973 BoundNetLog(), GetParam(), NULL); 2907 BoundNetLog(), GetParam(), NULL);
2974 2908
2975 helper.RunPreTestSetup(); 2909 helper.RunPreTestSetup();
2976 helper.AddData(&data); 2910 helper.AddData(&data);
2977 2911
2978 HttpNetworkTransaction* trans = helper.trans(); 2912 HttpNetworkTransaction* trans = helper.trans();
2979 2913
2980 // Start the transaction with basic parameters. 2914 // Start the transaction with basic parameters.
2981 TestCompletionCallback callback; 2915 TestCompletionCallback callback;
2982 int rv = trans->Start( 2916 int rv = trans->Start(
2983 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2917 &CreateGetRequest(), callback.callback(), BoundNetLog());
2984 EXPECT_EQ(ERR_IO_PENDING, rv); 2918 EXPECT_EQ(ERR_IO_PENDING, rv);
2985 rv = callback.WaitForResult(); 2919 rv = callback.WaitForResult();
2986 EXPECT_EQ(OK, rv); 2920 EXPECT_EQ(OK, rv);
2987 2921
2988 // Verify that we consumed all test data. 2922 // Verify that we consumed all test data.
2989 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 2923 EXPECT_TRUE(data.AllReadDataConsumed());
2990 << data.read_count() 2924 EXPECT_TRUE(data.AllWriteDataConsumed());
2991 << " Read index: "
2992 << data.read_index();
2993 EXPECT_TRUE(data.at_write_eof()) << "Write count: "
2994 << data.write_count()
2995 << " Write index: "
2996 << data.write_index();
2997 2925
2998 // Verify the SYN_REPLY. 2926 // Verify the SYN_REPLY.
2999 HttpResponseInfo response = *trans->GetResponseInfo(); 2927 HttpResponseInfo response = *trans->GetResponseInfo();
3000 EXPECT_TRUE(response.headers.get() != NULL); 2928 EXPECT_TRUE(response.headers.get() != NULL);
3001 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2929 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
3002 } 2930 }
3003 2931
3004 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { 2932 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
3005 scoped_ptr<SpdyFrame> stream1_syn( 2933 scoped_ptr<SpdyFrame> stream1_syn(
3006 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2934 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3007 scoped_ptr<SpdyFrame> stream1_body( 2935 scoped_ptr<SpdyFrame> stream1_body(
3008 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2936 spdy_util_.ConstructSpdyBodyFrame(1, true));
3009 scoped_ptr<SpdyFrame> stream2_rst( 2937 scoped_ptr<SpdyFrame> stream2_rst(
3010 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); 2938 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM));
3011 MockWrite writes[] = { 2939 MockWrite writes[] = {
3012 CreateMockWrite(*stream1_syn, 1), 2940 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
3013 CreateMockWrite(*stream2_rst, 4),
3014 }; 2941 };
3015 2942
3016 scoped_ptr<SpdyFrame> 2943 scoped_ptr<SpdyFrame>
3017 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2944 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3018 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2945 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
3019 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); 2946 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str()));
3020 MockRead reads[] = { 2947 MockRead reads[] = {
3021 CreateMockRead(*stream1_reply, 2), 2948 CreateMockRead(*stream1_reply, 1),
3022 CreateMockRead(*stream2_syn, 3), 2949 CreateMockRead(*stream2_syn, 2),
3023 CreateMockRead(*stream1_body, 4), 2950 CreateMockRead(*stream1_body, 4),
3024 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2951 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
3025 }; 2952 };
3026 2953
3027 OrderedSocketData data(reads, arraysize(reads), 2954 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3028 writes, arraysize(writes));
3029 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2955 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3030 BoundNetLog(), GetParam(), NULL); 2956 BoundNetLog(), GetParam(), NULL);
3031 2957
3032 helper.RunPreTestSetup(); 2958 helper.RunPreTestSetup();
3033 helper.AddData(&data); 2959 helper.AddData(&data);
3034 2960
3035 HttpNetworkTransaction* trans = helper.trans(); 2961 HttpNetworkTransaction* trans = helper.trans();
3036 2962
3037 // Start the transaction with basic parameters. 2963 // Start the transaction with basic parameters.
3038 TestCompletionCallback callback; 2964 TestCompletionCallback callback;
3039 int rv = trans->Start( 2965 int rv = trans->Start(
3040 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2966 &CreateGetRequest(), callback.callback(), BoundNetLog());
3041 EXPECT_EQ(ERR_IO_PENDING, rv); 2967 EXPECT_EQ(ERR_IO_PENDING, rv);
3042 rv = callback.WaitForResult(); 2968 rv = callback.WaitForResult();
3043 EXPECT_EQ(OK, rv); 2969 EXPECT_EQ(OK, rv);
3044 2970
3045 // Verify that we consumed all test data. 2971 // Verify that we consumed all test data.
3046 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 2972 EXPECT_TRUE(data.AllReadDataConsumed());
3047 << data.read_count() 2973 EXPECT_TRUE(data.AllWriteDataConsumed());
3048 << " Read index: "
3049 << data.read_index();
3050 EXPECT_TRUE(data.at_write_eof()) << "Write count: "
3051 << data.write_count()
3052 << " Write index: "
3053 << data.write_index();
3054 2974
3055 // Verify the SYN_REPLY. 2975 // Verify the SYN_REPLY.
3056 HttpResponseInfo response = *trans->GetResponseInfo(); 2976 HttpResponseInfo response = *trans->GetResponseInfo();
3057 EXPECT_TRUE(response.headers.get() != NULL); 2977 EXPECT_TRUE(response.headers.get() != NULL);
3058 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2978 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
3059 } 2979 }
3060 2980
3061 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) { 2981 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) {
3062 scoped_ptr<SpdyFrame> stream1_syn( 2982 scoped_ptr<SpdyFrame> stream1_syn(
3063 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2983 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3064 scoped_ptr<SpdyFrame> stream1_body( 2984 scoped_ptr<SpdyFrame> stream1_body(
3065 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2985 spdy_util_.ConstructSpdyBodyFrame(1, true));
3066 scoped_ptr<SpdyFrame> stream2_rst( 2986 scoped_ptr<SpdyFrame> stream2_rst(
3067 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2987 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
3068 MockWrite writes[] = { 2988 MockWrite writes[] = {
3069 CreateMockWrite(*stream1_syn, 1), 2989 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
3070 CreateMockWrite(*stream2_rst, 4),
3071 }; 2990 };
3072 2991
3073 scoped_ptr<SpdyFrame> 2992 scoped_ptr<SpdyFrame>
3074 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2993 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3075 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock()); 2994 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock());
3076 (*incomplete_headers)["hello"] = "bye"; 2995 (*incomplete_headers)["hello"] = "bye";
3077 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK"; 2996 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK";
3078 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 2997 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
3079 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 2998 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
3080 incomplete_headers.Pass(), 2, 1)); 2999 incomplete_headers.Pass(), 2, 1));
3081 MockRead reads[] = { 3000 MockRead reads[] = {
3082 CreateMockRead(*stream1_reply, 2), 3001 CreateMockRead(*stream1_reply, 1),
3083 CreateMockRead(*stream2_syn, 3), 3002 CreateMockRead(*stream2_syn, 2),
3084 CreateMockRead(*stream1_body, 4), 3003 CreateMockRead(*stream1_body, 4),
3085 MockRead(ASYNC, ERR_IO_PENDING, 5) // Force a pause 3004 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
3086 }; 3005 };
3087 3006
3088 OrderedSocketData data(reads, arraysize(reads), 3007 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3089 writes, arraysize(writes));
3090 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3008 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3091 BoundNetLog(), GetParam(), NULL); 3009 BoundNetLog(), GetParam(), NULL);
3092 3010
3093 helper.RunPreTestSetup(); 3011 helper.RunPreTestSetup();
3094 helper.AddData(&data); 3012 helper.AddData(&data);
3095 3013
3096 HttpNetworkTransaction* trans = helper.trans(); 3014 HttpNetworkTransaction* trans = helper.trans();
3097 3015
3098 // Start the transaction with basic parameters. 3016 // Start the transaction with basic parameters.
3099 TestCompletionCallback callback; 3017 TestCompletionCallback callback;
3100 int rv = trans->Start( 3018 int rv = trans->Start(
3101 &CreateGetRequest(), callback.callback(), BoundNetLog()); 3019 &CreateGetRequest(), callback.callback(), BoundNetLog());
3102 EXPECT_EQ(ERR_IO_PENDING, rv); 3020 EXPECT_EQ(ERR_IO_PENDING, rv);
3103 rv = callback.WaitForResult(); 3021 rv = callback.WaitForResult();
3104 EXPECT_EQ(OK, rv); 3022 EXPECT_EQ(OK, rv);
3023
3105 // Verify that we consumed all test data. 3024 // Verify that we consumed all test data.
3106 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 3025 EXPECT_TRUE(data.AllReadDataConsumed());
3107 << data.read_count() 3026 EXPECT_TRUE(data.AllWriteDataConsumed());
3108 << " Read index: "
3109 << data.read_index();
3110 EXPECT_TRUE(data.at_write_eof()) << "Write count: "
3111 << data.write_count()
3112 << " Write index: "
3113 << data.write_index();
3114 3027
3115 // Verify the SYN_REPLY. 3028 // Verify the SYN_REPLY.
3116 HttpResponseInfo response = *trans->GetResponseInfo(); 3029 HttpResponseInfo response = *trans->GetResponseInfo();
3117 EXPECT_TRUE(response.headers.get() != NULL); 3030 EXPECT_TRUE(response.headers.get() != NULL);
3118 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 3031 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
3119 } 3032 }
3120 3033
3121 // Verify that various SynReply headers parse correctly through the 3034 // Verify that various SynReply headers parse correctly through the
3122 // HTTP layer. 3035 // HTTP layer.
3123 TEST_P(SpdyNetworkTransactionTest, SynReplyHeaders) { 3036 TEST_P(SpdyNetworkTransactionTest, SynReplyHeaders) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3161 if (spdy_util_.spdy_version() < SPDY4) { 3074 if (spdy_util_.spdy_version() < SPDY4) {
3162 // SPDY4/HTTP2 eliminates use of the :version header. 3075 // SPDY4/HTTP2 eliminates use of the :version header.
3163 test_cases[0].expected_headers["version"] = "HTTP/1.1"; 3076 test_cases[0].expected_headers["version"] = "HTTP/1.1";
3164 test_cases[1].expected_headers["version"] = "HTTP/1.1"; 3077 test_cases[1].expected_headers["version"] = "HTTP/1.1";
3165 test_cases[2].expected_headers["version"] = "HTTP/1.1"; 3078 test_cases[2].expected_headers["version"] = "HTTP/1.1";
3166 } 3079 }
3167 3080
3168 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3081 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3169 scoped_ptr<SpdyFrame> req( 3082 scoped_ptr<SpdyFrame> req(
3170 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3083 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3171 MockWrite writes[] = { CreateMockWrite(*req) }; 3084 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3172 3085
3173 scoped_ptr<SpdyFrame> resp( 3086 scoped_ptr<SpdyFrame> resp(
3174 spdy_util_.ConstructSpdyGetSynReply(test_cases[i].extra_headers, 3087 spdy_util_.ConstructSpdyGetSynReply(test_cases[i].extra_headers,
3175 test_cases[i].num_headers, 3088 test_cases[i].num_headers,
3176 1)); 3089 1));
3177 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3090 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3178 MockRead reads[] = { 3091 MockRead reads[] = {
3179 CreateMockRead(*resp), 3092 CreateMockRead(*resp, 1),
3180 CreateMockRead(*body), 3093 CreateMockRead(*body, 2),
3181 MockRead(ASYNC, 0, 0) // EOF 3094 MockRead(ASYNC, 0, 3) // EOF
3182 }; 3095 };
3183 3096
3184 DelayedSocketData data(1, reads, arraysize(reads), 3097 SequencedSocketData data(reads, arraysize(reads), writes,
3185 writes, arraysize(writes)); 3098 arraysize(writes));
3186 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3099 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3187 BoundNetLog(), GetParam(), NULL); 3100 BoundNetLog(), GetParam(), NULL);
3188 helper.RunToCompletion(&data); 3101 helper.RunToCompletion(&data);
3189 TransactionHelperResult out = helper.output(); 3102 TransactionHelperResult out = helper.output();
3190 3103
3191 EXPECT_EQ(OK, out.rv); 3104 EXPECT_EQ(OK, out.rv);
3192 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3105 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3193 EXPECT_EQ("hello!", out.response_data); 3106 EXPECT_EQ("hello!", out.response_data);
3194 3107
3195 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers; 3108 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers;
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
3279 }; 3192 };
3280 3193
3281 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3194 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3282 // Construct the request. 3195 // Construct the request.
3283 scoped_ptr<SpdyFrame> frame_req( 3196 scoped_ptr<SpdyFrame> frame_req(
3284 spdy_util_.ConstructSpdyGet(test_cases[i].extra_headers[0], 3197 spdy_util_.ConstructSpdyGet(test_cases[i].extra_headers[0],
3285 test_cases[i].num_headers[0], 3198 test_cases[i].num_headers[0],
3286 false, 1, LOWEST, true)); 3199 false, 1, LOWEST, true));
3287 3200
3288 MockWrite writes[] = { 3201 MockWrite writes[] = {
3289 CreateMockWrite(*frame_req), 3202 CreateMockWrite(*frame_req, 0),
3290 }; 3203 };
3291 3204
3292 // Construct the reply. 3205 // Construct the reply.
3293 SpdyHeaderBlock reply_headers; 3206 SpdyHeaderBlock reply_headers;
3294 AppendToHeaderBlock(test_cases[i].extra_headers[1], 3207 AppendToHeaderBlock(test_cases[i].extra_headers[1],
3295 test_cases[i].num_headers[1], 3208 test_cases[i].num_headers[1],
3296 &reply_headers); 3209 &reply_headers);
3297 scoped_ptr<SpdyFrame> frame_reply( 3210 scoped_ptr<SpdyFrame> frame_reply(
3298 spdy_util_.ConstructSpdyReply(1, reply_headers)); 3211 spdy_util_.ConstructSpdyReply(1, reply_headers));
3299 3212
3300 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3213 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3301 MockRead reads[] = { 3214 MockRead reads[] = {
3302 CreateMockRead(*frame_reply), 3215 CreateMockRead(*frame_reply, 1),
3303 CreateMockRead(*body), 3216 CreateMockRead(*body, 2),
3304 MockRead(ASYNC, 0, 0) // EOF 3217 MockRead(ASYNC, 0, 3) // EOF
3305 }; 3218 };
3306 3219
3307 // Attach the headers to the request. 3220 // Attach the headers to the request.
3308 int header_count = test_cases[i].num_headers[0]; 3221 int header_count = test_cases[i].num_headers[0];
3309 3222
3310 HttpRequestInfo request = CreateGetRequest(); 3223 HttpRequestInfo request = CreateGetRequest();
3311 for (int ct = 0; ct < header_count; ct++) { 3224 for (int ct = 0; ct < header_count; ct++) {
3312 const char* header_key = test_cases[i].extra_headers[0][ct * 2]; 3225 const char* header_key = test_cases[i].extra_headers[0][ct * 2];
3313 const char* header_value = test_cases[i].extra_headers[0][ct * 2 + 1]; 3226 const char* header_value = test_cases[i].extra_headers[0][ct * 2 + 1];
3314 request.extra_headers.SetHeader(header_key, header_value); 3227 request.extra_headers.SetHeader(header_key, header_value);
3315 } 3228 }
3316 3229
3317 DelayedSocketData data(1, reads, arraysize(reads), 3230 SequencedSocketData data(reads, arraysize(reads), writes,
3318 writes, arraysize(writes)); 3231 arraysize(writes));
3319 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 3232 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
3320 BoundNetLog(), GetParam(), NULL); 3233 BoundNetLog(), GetParam(), NULL);
3321 helper.RunToCompletion(&data); 3234 helper.RunToCompletion(&data);
3322 TransactionHelperResult out = helper.output(); 3235 TransactionHelperResult out = helper.output();
3323 3236
3324 EXPECT_EQ(OK, out.rv) << i; 3237 EXPECT_EQ(OK, out.rv) << i;
3325 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line) << i; 3238 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line) << i;
3326 EXPECT_EQ("hello!", out.response_data) << i; 3239 EXPECT_EQ("hello!", out.response_data) << i;
3327 3240
3328 // Test the response information. 3241 // Test the response information.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
3373 // SYN_REPLY with no headers 3286 // SYN_REPLY with no headers
3374 { 0, { NULL }, }, 3287 { 0, { NULL }, },
3375 }; 3288 };
3376 3289
3377 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3290 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3378 scoped_ptr<SpdyFrame> req( 3291 scoped_ptr<SpdyFrame> req(
3379 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3292 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3380 scoped_ptr<SpdyFrame> rst( 3293 scoped_ptr<SpdyFrame> rst(
3381 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 3294 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
3382 MockWrite writes[] = { 3295 MockWrite writes[] = {
3383 CreateMockWrite(*req), 3296 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
3384 CreateMockWrite(*rst),
3385 }; 3297 };
3386 3298
3387 // Construct the reply. 3299 // Construct the reply.
3388 SpdyHeaderBlock reply_headers; 3300 SpdyHeaderBlock reply_headers;
3389 AppendToHeaderBlock( 3301 AppendToHeaderBlock(
3390 test_cases[i].headers, test_cases[i].num_headers, &reply_headers); 3302 test_cases[i].headers, test_cases[i].num_headers, &reply_headers);
3391 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyReply(1, reply_headers)); 3303 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyReply(1, reply_headers));
3392 MockRead reads[] = { 3304 MockRead reads[] = {
3393 CreateMockRead(*resp), 3305 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3) // EOF
3394 MockRead(ASYNC, 0, 0) // EOF
3395 }; 3306 };
3396 3307
3397 DelayedSocketData data(1, reads, arraysize(reads), 3308 SequencedSocketData data(reads, arraysize(reads), writes,
3398 writes, arraysize(writes)); 3309 arraysize(writes));
3399 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3310 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3400 BoundNetLog(), GetParam(), NULL); 3311 BoundNetLog(), GetParam(), NULL);
3401 helper.RunToCompletion(&data); 3312 helper.RunToCompletion(&data);
3402 TransactionHelperResult out = helper.output(); 3313 TransactionHelperResult out = helper.output();
3403 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3314 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3404 } 3315 }
3405 } 3316 }
3406 3317
3407 // Verify that we don't crash on some corrupt frames. 3318 // Verify that we don't crash on some corrupt frames.
3408 // TODO(jgraettinger): SPDY4 and up treats a header decompression failure as a 3319 // TODO(jgraettinger): SPDY4 and up treats a header decompression failure as a
(...skipping 20 matching lines...) Expand all
3429 } test_cases[] = { 3340 } test_cases[] = {
3430 { syn_reply_wrong_length.get(), }, 3341 { syn_reply_wrong_length.get(), },
3431 }; 3342 };
3432 3343
3433 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3344 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3434 scoped_ptr<SpdyFrame> req( 3345 scoped_ptr<SpdyFrame> req(
3435 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3346 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3436 scoped_ptr<SpdyFrame> rst( 3347 scoped_ptr<SpdyFrame> rst(
3437 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 3348 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
3438 MockWrite writes[] = { 3349 MockWrite writes[] = {
3439 CreateMockWrite(*req), 3350 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3),
3440 CreateMockWrite(*rst),
3441 }; 3351 };
3442 3352
3443 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3353 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3444 MockRead reads[] = { 3354 MockRead reads[] = {
3445 MockRead(ASYNC, test_cases[i].syn_reply->data(), wrong_size), 3355 MockRead(ASYNC, test_cases[i].syn_reply->data(), wrong_size, 1),
3446 CreateMockRead(*body), 3356 CreateMockRead(*body, 2),
3447 MockRead(ASYNC, 0, 0) // EOF 3357 MockRead(ASYNC, 0, 4) // EOF
3448 }; 3358 };
3449 3359
3450 DelayedSocketData data(1, reads, arraysize(reads), 3360 SequencedSocketData data(reads, arraysize(reads), writes,
3451 writes, arraysize(writes)); 3361 arraysize(writes));
3452 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3362 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3453 BoundNetLog(), GetParam(), NULL); 3363 BoundNetLog(), GetParam(), NULL);
3454 helper.RunToCompletion(&data); 3364 helper.RunToCompletion(&data);
3455 TransactionHelperResult out = helper.output(); 3365 TransactionHelperResult out = helper.output();
3456 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3366 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3457 } 3367 }
3458 } 3368 }
3459 3369
3460 // SPDY4 treats a header decompression failure as a connection-level error. 3370 // SPDY4 treats a header decompression failure as a connection-level error.
3461 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionErrorSpdy4) { 3371 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionErrorSpdy4) {
3462 if (spdy_util_.spdy_version() < SPDY4) { 3372 if (spdy_util_.spdy_version() < SPDY4) {
3463 return; 3373 return;
3464 } 3374 }
3465 // This is the length field that's too short. 3375 // This is the length field that's too short.
3466 scoped_ptr<SpdyFrame> syn_reply_wrong_length( 3376 scoped_ptr<SpdyFrame> syn_reply_wrong_length(
3467 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3377 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3468 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3378 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3469 size_t right_size = 3379 size_t right_size =
3470 syn_reply_wrong_length->size() - framer.GetControlFrameHeaderSize(); 3380 syn_reply_wrong_length->size() - framer.GetControlFrameHeaderSize();
3471 size_t wrong_size = right_size - 4; 3381 size_t wrong_size = right_size - 4;
3472 test::SetFrameLength(syn_reply_wrong_length.get(), 3382 test::SetFrameLength(syn_reply_wrong_length.get(),
3473 wrong_size, 3383 wrong_size,
3474 spdy_util_.spdy_version()); 3384 spdy_util_.spdy_version());
3475 3385
3476 scoped_ptr<SpdyFrame> req( 3386 scoped_ptr<SpdyFrame> req(
3477 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3387 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3478 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3388 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3479 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3389 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3480 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3390 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3481 3391
3482 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3392 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3483 MockRead reads[] = { 3393 MockRead reads[] = {
3484 MockRead(ASYNC, syn_reply_wrong_length->data(), 3394 MockRead(ASYNC, syn_reply_wrong_length->data(),
3485 syn_reply_wrong_length->size() - 4), 3395 syn_reply_wrong_length->size() - 4, 1),
3486 }; 3396 };
3487 3397
3488 DelayedSocketData data(1, reads, arraysize(reads), 3398 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3489 writes, arraysize(writes));
3490 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3399 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3491 BoundNetLog(), GetParam(), NULL); 3400 BoundNetLog(), GetParam(), NULL);
3492 helper.RunToCompletion(&data); 3401 helper.RunToCompletion(&data);
3493 TransactionHelperResult out = helper.output(); 3402 TransactionHelperResult out = helper.output();
3494 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3403 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3495 } 3404 }
3496 3405
3497 TEST_P(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) { 3406 TEST_P(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) {
3498 if (GetParam().protocol < kProtoSPDY4MinimumVersion) { 3407 if (GetParam().protocol < kProtoSPDY4MinimumVersion) {
3499 // Decompression failures are a stream error in SPDY3 and above. 3408 // Decompression failures are a stream error in SPDY3 and above.
3500 return; 3409 return;
3501 } 3410 }
3502 scoped_ptr<SpdyFrame> req( 3411 scoped_ptr<SpdyFrame> req(
3503 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3412 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3504 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3413 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3505 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3414 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3506 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3415 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3507 3416
3508 // Read HEADERS with corrupted payload. 3417 // Read HEADERS with corrupted payload.
3509 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3418 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3510 memset(resp->data() + 12, 0xff, resp->size() - 12); 3419 memset(resp->data() + 12, 0xff, resp->size() - 12);
3511 MockRead reads[] = {CreateMockRead(*resp)}; 3420 MockRead reads[] = {CreateMockRead(*resp, 1)};
3512 3421
3513 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 3422 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3514 NormalSpdyTransactionHelper helper( 3423 NormalSpdyTransactionHelper helper(
3515 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 3424 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
3516 helper.RunToCompletion(&data); 3425 helper.RunToCompletion(&data);
3517 TransactionHelperResult out = helper.output(); 3426 TransactionHelperResult out = helper.output();
3518 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3427 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3519 } 3428 }
3520 3429
3521 TEST_P(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) { 3430 TEST_P(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) {
3522 scoped_ptr<SpdyFrame> req( 3431 scoped_ptr<SpdyFrame> req(
3523 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3432 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3524 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3433 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3525 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME).")); 3434 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME)."));
3526 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3435 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3527 3436
3528 // Read WINDOW_UPDATE with incorrectly-sized payload. 3437 // Read WINDOW_UPDATE with incorrectly-sized payload.
3529 // TODO(jgraettinger): SpdyFramer signals this as an INVALID_CONTROL_FRAME, 3438 // TODO(jgraettinger): SpdyFramer signals this as an INVALID_CONTROL_FRAME,
3530 // which is mapped to a protocol error, and not a frame size error. 3439 // which is mapped to a protocol error, and not a frame size error.
3531 scoped_ptr<SpdyFrame> bad_window_update( 3440 scoped_ptr<SpdyFrame> bad_window_update(
3532 spdy_util_.ConstructSpdyWindowUpdate(1, 1)); 3441 spdy_util_.ConstructSpdyWindowUpdate(1, 1));
3533 test::SetFrameLength(bad_window_update.get(), 3442 test::SetFrameLength(bad_window_update.get(),
3534 bad_window_update->size() - 1, 3443 bad_window_update->size() - 1,
3535 spdy_util_.spdy_version()); 3444 spdy_util_.spdy_version());
3536 MockRead reads[] = {CreateMockRead(*bad_window_update)}; 3445 MockRead reads[] = {CreateMockRead(*bad_window_update, 1)};
3537 3446
3538 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 3447 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3539 NormalSpdyTransactionHelper helper( 3448 NormalSpdyTransactionHelper helper(
3540 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 3449 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
3541 helper.RunToCompletion(&data); 3450 helper.RunToCompletion(&data);
3542 TransactionHelperResult out = helper.output(); 3451 TransactionHelperResult out = helper.output();
3543 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3452 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3544 } 3453 }
3545 3454
3546 // Test that we shutdown correctly on write errors. 3455 // Test that we shutdown correctly on write errors.
3547 TEST_P(SpdyNetworkTransactionTest, WriteError) { 3456 TEST_P(SpdyNetworkTransactionTest, WriteError) {
3548 scoped_ptr<SpdyFrame> req( 3457 scoped_ptr<SpdyFrame> req(
(...skipping 28 matching lines...) Expand all
3577 EXPECT_EQ(ERR_FAILED, out.rv); 3486 EXPECT_EQ(ERR_FAILED, out.rv);
3578 } 3487 }
3579 3488
3580 // Test that partial writes work. 3489 // Test that partial writes work.
3581 TEST_P(SpdyNetworkTransactionTest, PartialWrite) { 3490 TEST_P(SpdyNetworkTransactionTest, PartialWrite) {
3582 // Chop the SYN_STREAM frame into 5 chunks. 3491 // Chop the SYN_STREAM frame into 5 chunks.
3583 scoped_ptr<SpdyFrame> req( 3492 scoped_ptr<SpdyFrame> req(
3584 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3493 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3585 const int kChunks = 5; 3494 const int kChunks = 5;
3586 scoped_ptr<MockWrite[]> writes(ChopWriteFrame(*req.get(), kChunks)); 3495 scoped_ptr<MockWrite[]> writes(ChopWriteFrame(*req.get(), kChunks));
3496 for (int i = 0; i < kChunks; ++i) {
3497 writes[i].sequence_number = i;
3498 }
3587 3499
3588 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3500 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3589 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3501 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3590 MockRead reads[] = { 3502 MockRead reads[] = {
3591 CreateMockRead(*resp), 3503 CreateMockRead(*resp, kChunks),
3592 CreateMockRead(*body), 3504 CreateMockRead(*body, kChunks + 1),
3593 MockRead(ASYNC, 0, 0) // EOF 3505 MockRead(ASYNC, 0, kChunks + 2) // EOF
3594 }; 3506 };
3595 3507
3596 DelayedSocketData data(kChunks, reads, arraysize(reads), 3508 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks);
3597 writes.get(), kChunks);
3598 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3509 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3599 BoundNetLog(), GetParam(), NULL); 3510 BoundNetLog(), GetParam(), NULL);
3600 helper.RunToCompletion(&data); 3511 helper.RunToCompletion(&data);
3601 TransactionHelperResult out = helper.output(); 3512 TransactionHelperResult out = helper.output();
3602 EXPECT_EQ(OK, out.rv); 3513 EXPECT_EQ(OK, out.rv);
3603 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3514 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3604 EXPECT_EQ("hello!", out.response_data); 3515 EXPECT_EQ("hello!", out.response_data);
3605 } 3516 }
3606 3517
3607 // In this test, we enable compression, but get a uncompressed SynReply from 3518 // In this test, we enable compression, but get a uncompressed SynReply from
3608 // the server. Verify that teardown is all clean. 3519 // the server. Verify that teardown is all clean.
3609 TEST_P(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) { 3520 TEST_P(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) {
3610 if (spdy_util_.spdy_version() >= SPDY4) { 3521 if (spdy_util_.spdy_version() >= SPDY4) {
3611 // HPACK doesn't use deflate compression. 3522 // HPACK doesn't use deflate compression.
3612 return; 3523 return;
3613 } 3524 }
3614 scoped_ptr<SpdyFrame> compressed( 3525 scoped_ptr<SpdyFrame> compressed(
3615 spdy_util_.ConstructSpdyGet(NULL, 0, true, 1, LOWEST, true)); 3526 spdy_util_.ConstructSpdyGet(NULL, 0, true, 1, LOWEST, true));
3616 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3527 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3617 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3528 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3618 MockWrite writes[] = {CreateMockWrite(*compressed), CreateMockWrite(*goaway)}; 3529 MockWrite writes[] = {CreateMockWrite(*compressed, 0),
3530 CreateMockWrite(*goaway, 2)};
3619 3531
3620 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3532 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3621 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3533 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3622 MockRead reads[] = { 3534 MockRead reads[] = {
3623 CreateMockRead(*resp), 3535 CreateMockRead(*resp, 1),
3624 }; 3536 };
3625 3537
3626 DelayedSocketData data(1, reads, arraysize(reads), 3538 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3627 writes, arraysize(writes));
3628 SpdySessionDependencies* session_deps = 3539 SpdySessionDependencies* session_deps =
3629 CreateSpdySessionDependencies(GetParam()); 3540 CreateSpdySessionDependencies(GetParam());
3630 session_deps->enable_compression = true; 3541 session_deps->enable_compression = true;
3631 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3542 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3632 BoundNetLog(), GetParam(), session_deps); 3543 BoundNetLog(), GetParam(), session_deps);
3633 helper.RunToCompletion(&data); 3544 helper.RunToCompletion(&data);
3634 TransactionHelperResult out = helper.output(); 3545 TransactionHelperResult out = helper.output();
3635 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3546 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3636 data.Reset(); 3547 data.Reset();
3637 } 3548 }
3638 3549
3639 // Test that the NetLog contains good data for a simple GET request. 3550 // Test that the NetLog contains good data for a simple GET request.
3640 TEST_P(SpdyNetworkTransactionTest, NetLog) { 3551 TEST_P(SpdyNetworkTransactionTest, NetLog) {
3641 static const char* const kExtraHeaders[] = { 3552 static const char* const kExtraHeaders[] = {
3642 "user-agent", "Chrome", 3553 "user-agent", "Chrome",
3643 }; 3554 };
3644 scoped_ptr<SpdyFrame> req( 3555 scoped_ptr<SpdyFrame> req(
3645 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, false, 1, LOWEST, true)); 3556 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, false, 1, LOWEST, true));
3646 MockWrite writes[] = { CreateMockWrite(*req) }; 3557 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3647 3558
3648 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3559 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3649 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3560 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3650 MockRead reads[] = { 3561 MockRead reads[] = {
3651 CreateMockRead(*resp), 3562 CreateMockRead(*resp, 1),
3652 CreateMockRead(*body), 3563 CreateMockRead(*body, 2),
3653 MockRead(ASYNC, 0, 0) // EOF 3564 MockRead(ASYNC, 0, 3) // EOF
3654 }; 3565 };
3655 3566
3656 BoundTestNetLog log; 3567 BoundTestNetLog log;
3657 3568
3658 DelayedSocketData data(1, reads, arraysize(reads), 3569 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3659 writes, arraysize(writes));
3660 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(), 3570 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(),
3661 DEFAULT_PRIORITY, 3571 DEFAULT_PRIORITY,
3662 log.bound(), GetParam(), NULL); 3572 log.bound(), GetParam(), NULL);
3663 helper.RunToCompletion(&data); 3573 helper.RunToCompletion(&data);
3664 TransactionHelperResult out = helper.output(); 3574 TransactionHelperResult out = helper.output();
3665 EXPECT_EQ(OK, out.rv); 3575 EXPECT_EQ(OK, out.rv);
3666 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3576 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3667 EXPECT_EQ("hello!", out.response_data); 3577 EXPECT_EQ("hello!", out.response_data);
3668 3578
3669 // Check that the NetLog was filled reasonably. 3579 // Check that the NetLog was filled reasonably.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
3728 3638
3729 // Since we buffer the IO from the stream to the renderer, this test verifies 3639 // Since we buffer the IO from the stream to the renderer, this test verifies
3730 // that when we read out the maximum amount of data (e.g. we received 50 bytes 3640 // that when we read out the maximum amount of data (e.g. we received 50 bytes
3731 // on the network, but issued a Read for only 5 of those bytes) that the data 3641 // on the network, but issued a Read for only 5 of those bytes) that the data
3732 // flow still works correctly. 3642 // flow still works correctly.
3733 TEST_P(SpdyNetworkTransactionTest, BufferFull) { 3643 TEST_P(SpdyNetworkTransactionTest, BufferFull) {
3734 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3644 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3735 3645
3736 scoped_ptr<SpdyFrame> req( 3646 scoped_ptr<SpdyFrame> req(
3737 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3647 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3738 MockWrite writes[] = { CreateMockWrite(*req) }; 3648 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3739 3649
3740 // 2 data frames in a single read. 3650 // 2 data frames in a single read.
3741 scoped_ptr<SpdyFrame> data_frame_1( 3651 scoped_ptr<SpdyFrame> data_frame_1(
3742 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE)); 3652 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE));
3743 scoped_ptr<SpdyFrame> data_frame_2( 3653 scoped_ptr<SpdyFrame> data_frame_2(
3744 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE)); 3654 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE));
3745 const SpdyFrame* data_frames[2] = { 3655 const SpdyFrame* data_frames[2] = {
3746 data_frame_1.get(), 3656 data_frame_1.get(),
3747 data_frame_2.get(), 3657 data_frame_2.get(),
3748 }; 3658 };
3749 char combined_data_frames[100]; 3659 char combined_data_frames[100];
3750 int combined_data_frames_len = 3660 int combined_data_frames_len =
3751 CombineFrames(data_frames, arraysize(data_frames), 3661 CombineFrames(data_frames, arraysize(data_frames),
3752 combined_data_frames, arraysize(combined_data_frames)); 3662 combined_data_frames, arraysize(combined_data_frames));
3753 scoped_ptr<SpdyFrame> last_frame( 3663 scoped_ptr<SpdyFrame> last_frame(
3754 framer.CreateDataFrame(1, "d", 1, DATA_FLAG_FIN)); 3664 framer.CreateDataFrame(1, "d", 1, DATA_FLAG_FIN));
3755 3665
3756 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3666 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3757 MockRead reads[] = { 3667 MockRead reads[] = {
3758 CreateMockRead(*resp), 3668 CreateMockRead(*resp, 1),
3759 MockRead(ASYNC, ERR_IO_PENDING), // Force a pause 3669 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
3760 MockRead(ASYNC, combined_data_frames, combined_data_frames_len), 3670 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3761 MockRead(ASYNC, ERR_IO_PENDING), // Force a pause 3671 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause
3762 CreateMockRead(*last_frame), 3672 CreateMockRead(*last_frame, 5),
3763 MockRead(ASYNC, 0, 0) // EOF 3673 MockRead(ASYNC, 0, 6) // EOF
3764 }; 3674 };
3765 3675
3766 DelayedSocketData data(1, reads, arraysize(reads), 3676 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3767 writes, arraysize(writes));
3768 3677
3769 TestCompletionCallback callback; 3678 TestCompletionCallback callback;
3770 3679
3771 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3680 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3772 BoundNetLog(), GetParam(), NULL); 3681 BoundNetLog(), GetParam(), NULL);
3773 helper.RunPreTestSetup(); 3682 helper.RunPreTestSetup();
3774 helper.AddData(&data); 3683 helper.AddData(&data);
3775 HttpNetworkTransaction* trans = helper.trans(); 3684 HttpNetworkTransaction* trans = helper.trans();
3776 int rv = trans->Start( 3685 int rv = trans->Start(
3777 &CreateGetRequest(), callback.callback(), BoundNetLog()); 3686 &CreateGetRequest(), callback.callback(), BoundNetLog());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
3822 } 3731 }
3823 3732
3824 // Verify that basic buffering works; when multiple data frames arrive 3733 // Verify that basic buffering works; when multiple data frames arrive
3825 // at the same time, ensure that we don't notify a read completion for 3734 // at the same time, ensure that we don't notify a read completion for
3826 // each data frame individually. 3735 // each data frame individually.
3827 TEST_P(SpdyNetworkTransactionTest, Buffering) { 3736 TEST_P(SpdyNetworkTransactionTest, Buffering) {
3828 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3737 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3829 3738
3830 scoped_ptr<SpdyFrame> req( 3739 scoped_ptr<SpdyFrame> req(
3831 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3740 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3832 MockWrite writes[] = { CreateMockWrite(*req) }; 3741 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3833 3742
3834 // 4 data frames in a single read. 3743 // 4 data frames in a single read.
3835 scoped_ptr<SpdyFrame> data_frame( 3744 scoped_ptr<SpdyFrame> data_frame(
3836 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 3745 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
3837 scoped_ptr<SpdyFrame> data_frame_fin( 3746 scoped_ptr<SpdyFrame> data_frame_fin(
3838 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN)); 3747 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN));
3839 const SpdyFrame* data_frames[4] = { 3748 const SpdyFrame* data_frames[4] = {
3840 data_frame.get(), 3749 data_frame.get(),
3841 data_frame.get(), 3750 data_frame.get(),
3842 data_frame.get(), 3751 data_frame.get(),
3843 data_frame_fin.get() 3752 data_frame_fin.get()
3844 }; 3753 };
3845 char combined_data_frames[100]; 3754 char combined_data_frames[100];
3846 int combined_data_frames_len = 3755 int combined_data_frames_len =
3847 CombineFrames(data_frames, arraysize(data_frames), 3756 CombineFrames(data_frames, arraysize(data_frames),
3848 combined_data_frames, arraysize(combined_data_frames)); 3757 combined_data_frames, arraysize(combined_data_frames));
3849 3758
3850 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3759 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3851 MockRead reads[] = { 3760 MockRead reads[] = {
3852 CreateMockRead(*resp), 3761 CreateMockRead(*resp, 1),
3853 MockRead(ASYNC, ERR_IO_PENDING), // Force a pause 3762 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
3854 MockRead(ASYNC, combined_data_frames, combined_data_frames_len), 3763 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3855 MockRead(ASYNC, 0, 0) // EOF 3764 MockRead(ASYNC, 0, 4) // EOF
3856 }; 3765 };
3857 3766
3858 DelayedSocketData data(1, reads, arraysize(reads), 3767 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3859 writes, arraysize(writes));
3860 3768
3861 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3769 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3862 BoundNetLog(), GetParam(), NULL); 3770 BoundNetLog(), GetParam(), NULL);
3863 helper.RunPreTestSetup(); 3771 helper.RunPreTestSetup();
3864 helper.AddData(&data); 3772 helper.AddData(&data);
3865 HttpNetworkTransaction* trans = helper.trans(); 3773 HttpNetworkTransaction* trans = helper.trans();
3866 3774
3867 TestCompletionCallback callback; 3775 TestCompletionCallback callback;
3868 int rv = trans->Start( 3776 int rv = trans->Start(
3869 &CreateGetRequest(), callback.callback(), BoundNetLog()); 3777 &CreateGetRequest(), callback.callback(), BoundNetLog());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3917 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3825 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3918 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 3826 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
3919 } 3827 }
3920 3828
3921 // Verify the case where we buffer data but read it after it has been buffered. 3829 // Verify the case where we buffer data but read it after it has been buffered.
3922 TEST_P(SpdyNetworkTransactionTest, BufferedAll) { 3830 TEST_P(SpdyNetworkTransactionTest, BufferedAll) {
3923 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3831 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3924 3832
3925 scoped_ptr<SpdyFrame> req( 3833 scoped_ptr<SpdyFrame> req(
3926 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3834 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3927 MockWrite writes[] = { CreateMockWrite(*req) }; 3835 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3928 3836
3929 // 5 data frames in a single read. 3837 // 5 data frames in a single read.
3930 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3838 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3931 scoped_ptr<SpdyFrame> data_frame( 3839 scoped_ptr<SpdyFrame> data_frame(
3932 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 3840 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
3933 scoped_ptr<SpdyFrame> data_frame_fin( 3841 scoped_ptr<SpdyFrame> data_frame_fin(
3934 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN)); 3842 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN));
3935 const SpdyFrame* frames[5] = {reply.get(), data_frame.get(), data_frame.get(), 3843 const SpdyFrame* frames[5] = {reply.get(), data_frame.get(), data_frame.get(),
3936 data_frame.get(), data_frame_fin.get()}; 3844 data_frame.get(), data_frame_fin.get()};
3937 char combined_frames[200]; 3845 char combined_frames[200];
3938 int combined_frames_len = 3846 int combined_frames_len =
3939 CombineFrames(frames, arraysize(frames), 3847 CombineFrames(frames, arraysize(frames),
3940 combined_frames, arraysize(combined_frames)); 3848 combined_frames, arraysize(combined_frames));
3941 3849
3942 MockRead reads[] = { 3850 MockRead reads[] = {
3943 MockRead(ASYNC, combined_frames, combined_frames_len), 3851 MockRead(ASYNC, combined_frames, combined_frames_len, 1),
3944 MockRead(ASYNC, 0, 0) // EOF 3852 MockRead(ASYNC, 0, 2) // EOF
3945 }; 3853 };
3946 3854
3947 DelayedSocketData data(1, reads, arraysize(reads), 3855 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3948 writes, arraysize(writes));
3949 3856
3950 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3857 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3951 BoundNetLog(), GetParam(), NULL); 3858 BoundNetLog(), GetParam(), NULL);
3952 helper.RunPreTestSetup(); 3859 helper.RunPreTestSetup();
3953 helper.AddData(&data); 3860 helper.AddData(&data);
3954 HttpNetworkTransaction* trans = helper.trans(); 3861 HttpNetworkTransaction* trans = helper.trans();
3955 3862
3956 TestCompletionCallback callback; 3863 TestCompletionCallback callback;
3957 int rv = trans->Start( 3864 int rv = trans->Start(
3958 &CreateGetRequest(), callback.callback(), BoundNetLog()); 3865 &CreateGetRequest(), callback.callback(), BoundNetLog());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
4002 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3909 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
4003 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 3910 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
4004 } 3911 }
4005 3912
4006 // Verify the case where we buffer data and close the connection. 3913 // Verify the case where we buffer data and close the connection.
4007 TEST_P(SpdyNetworkTransactionTest, BufferedClosed) { 3914 TEST_P(SpdyNetworkTransactionTest, BufferedClosed) {
4008 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3915 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
4009 3916
4010 scoped_ptr<SpdyFrame> req( 3917 scoped_ptr<SpdyFrame> req(
4011 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3918 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4012 MockWrite writes[] = { CreateMockWrite(*req) }; 3919 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4013 3920
4014 // All data frames in a single read. 3921 // All data frames in a single read.
4015 // NOTE: We don't FIN the stream. 3922 // NOTE: We don't FIN the stream.
4016 scoped_ptr<SpdyFrame> data_frame( 3923 scoped_ptr<SpdyFrame> data_frame(
4017 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 3924 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
4018 const SpdyFrame* data_frames[4] = { 3925 const SpdyFrame* data_frames[4] = {
4019 data_frame.get(), 3926 data_frame.get(),
4020 data_frame.get(), 3927 data_frame.get(),
4021 data_frame.get(), 3928 data_frame.get(),
4022 data_frame.get() 3929 data_frame.get()
4023 }; 3930 };
4024 char combined_data_frames[100]; 3931 char combined_data_frames[100];
4025 int combined_data_frames_len = 3932 int combined_data_frames_len =
4026 CombineFrames(data_frames, arraysize(data_frames), 3933 CombineFrames(data_frames, arraysize(data_frames),
4027 combined_data_frames, arraysize(combined_data_frames)); 3934 combined_data_frames, arraysize(combined_data_frames));
4028 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3935 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4029 MockRead reads[] = { 3936 MockRead reads[] = {
4030 CreateMockRead(*resp), 3937 CreateMockRead(*resp, 1),
4031 MockRead(ASYNC, ERR_IO_PENDING), // Force a wait 3938 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait
4032 MockRead(ASYNC, combined_data_frames, combined_data_frames_len), 3939 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
4033 MockRead(ASYNC, 0, 0) // EOF 3940 MockRead(ASYNC, 0, 4) // EOF
4034 }; 3941 };
4035 3942
4036 DelayedSocketData data(1, reads, arraysize(reads), 3943 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4037 writes, arraysize(writes));
4038 3944
4039 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3945 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4040 BoundNetLog(), GetParam(), NULL); 3946 BoundNetLog(), GetParam(), NULL);
4041 helper.RunPreTestSetup(); 3947 helper.RunPreTestSetup();
4042 helper.AddData(&data); 3948 helper.AddData(&data);
4043 HttpNetworkTransaction* trans = helper.trans(); 3949 HttpNetworkTransaction* trans = helper.trans();
4044 3950
4045 TestCompletionCallback callback; 3951 TestCompletionCallback callback;
4046 3952
4047 int rv = trans->Start( 3953 int rv = trans->Start(
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
4095 } 4001 }
4096 4002
4097 // Verify the case where we buffer data and cancel the transaction. 4003 // Verify the case where we buffer data and cancel the transaction.
4098 TEST_P(SpdyNetworkTransactionTest, BufferedCancelled) { 4004 TEST_P(SpdyNetworkTransactionTest, BufferedCancelled) {
4099 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 4005 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
4100 4006
4101 scoped_ptr<SpdyFrame> req( 4007 scoped_ptr<SpdyFrame> req(
4102 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4008 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4103 scoped_ptr<SpdyFrame> rst( 4009 scoped_ptr<SpdyFrame> rst(
4104 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 4010 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
4105 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*rst)}; 4011 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4)};
4106 4012
4107 // NOTE: We don't FIN the stream. 4013 // NOTE: We don't FIN the stream.
4108 scoped_ptr<SpdyFrame> data_frame( 4014 scoped_ptr<SpdyFrame> data_frame(
4109 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 4015 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
4110 4016
4111 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4017 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4112 MockRead reads[] = { 4018 MockRead reads[] = {
4113 CreateMockRead(*resp), 4019 CreateMockRead(*resp, 1),
4114 MockRead(ASYNC, ERR_IO_PENDING), // Force a wait 4020 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait
4115 CreateMockRead(*data_frame), 4021 CreateMockRead(*data_frame, 3),
4116 MockRead(ASYNC, 0, 0) // EOF 4022 MockRead(ASYNC, 0, 5) // EOF
4117 }; 4023 };
4118 4024
4119 DelayedSocketData data(1, reads, arraysize(reads), 4025 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4120 writes, arraysize(writes));
4121 4026
4122 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4027 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4123 BoundNetLog(), GetParam(), NULL); 4028 BoundNetLog(), GetParam(), NULL);
4124 helper.RunPreTestSetup(); 4029 helper.RunPreTestSetup();
4125 helper.AddData(&data); 4030 helper.AddData(&data);
4126 HttpNetworkTransaction* trans = helper.trans(); 4031 HttpNetworkTransaction* trans = helper.trans();
4127 TestCompletionCallback callback; 4032 TestCompletionCallback callback;
4128 4033
4129 int rv = trans->Start( 4034 int rv = trans->Start(
4130 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4035 &CreateGetRequest(), callback.callback(), BoundNetLog());
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
4191 4096
4192 // Verify that no settings exist initially. 4097 // Verify that no settings exist initially.
4193 HostPortPair host_port_pair("www.example.org", helper.port()); 4098 HostPortPair host_port_pair("www.example.org", helper.port());
4194 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4099 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4195 EXPECT_TRUE(spdy_session_pool->http_server_properties()->GetSpdySettings( 4100 EXPECT_TRUE(spdy_session_pool->http_server_properties()->GetSpdySettings(
4196 host_port_pair).empty()); 4101 host_port_pair).empty());
4197 4102
4198 // Construct the request. 4103 // Construct the request.
4199 scoped_ptr<SpdyFrame> req( 4104 scoped_ptr<SpdyFrame> req(
4200 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4105 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4201 MockWrite writes[] = { CreateMockWrite(*req) }; 4106 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4202 4107
4203 // Construct the reply. 4108 // Construct the reply.
4204 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); 4109 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock());
4205 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; 4110 (*reply_headers)[spdy_util_.GetStatusKey()] = "200";
4206 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 4111 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
4207 scoped_ptr<SpdyFrame> reply( 4112 scoped_ptr<SpdyFrame> reply(
4208 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass())); 4113 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass()));
4209 4114
4210 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH; 4115 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH;
4211 unsigned int kSampleValue1 = 0x0a0a0a0a; 4116 unsigned int kSampleValue1 = 0x0a0a0a0a;
(...skipping 12 matching lines...) Expand all
4224 settings[kSampleId2] = 4129 settings[kSampleId2] =
4225 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kSampleValue2); 4130 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kSampleValue2);
4226 // Next add another persisted setting. 4131 // Next add another persisted setting.
4227 settings[kSampleId3] = 4132 settings[kSampleId3] =
4228 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue3); 4133 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue3);
4229 settings_frame.reset(spdy_util_.ConstructSpdySettings(settings)); 4134 settings_frame.reset(spdy_util_.ConstructSpdySettings(settings));
4230 } 4135 }
4231 4136
4232 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4137 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4233 MockRead reads[] = { 4138 MockRead reads[] = {
4234 CreateMockRead(*reply), 4139 CreateMockRead(*reply, 1),
4235 CreateMockRead(*body), 4140 CreateMockRead(*body, 2),
4236 CreateMockRead(*settings_frame), 4141 CreateMockRead(*settings_frame, 3),
4237 MockRead(ASYNC, 0, 0) // EOF 4142 MockRead(ASYNC, 0, 4) // EOF
4238 }; 4143 };
4239 4144
4240 DelayedSocketData data(1, reads, arraysize(reads), 4145 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4241 writes, arraysize(writes));
4242 helper.AddData(&data); 4146 helper.AddData(&data);
4243 helper.RunDefaultTest(); 4147 helper.RunDefaultTest();
4244 helper.VerifyDataConsumed(); 4148 helper.VerifyDataConsumed();
4245 TransactionHelperResult out = helper.output(); 4149 TransactionHelperResult out = helper.output();
4246 EXPECT_EQ(OK, out.rv); 4150 EXPECT_EQ(OK, out.rv);
4247 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 4151 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
4248 EXPECT_EQ("hello!", out.response_data); 4152 EXPECT_EQ("hello!", out.response_data);
4249 4153
4250 { 4154 {
4251 // Verify we had two persisted settings. 4155 // Verify we had two persisted settings.
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
4340 const SettingsMap& settings = 4244 const SettingsMap& settings =
4341 spdy_session_pool->http_server_properties()->GetSpdySettings( 4245 spdy_session_pool->http_server_properties()->GetSpdySettings(
4342 host_port_pair); 4246 host_port_pair);
4343 scoped_ptr<SpdyFrame> settings_frame( 4247 scoped_ptr<SpdyFrame> settings_frame(
4344 spdy_util_.ConstructSpdySettings(settings)); 4248 spdy_util_.ConstructSpdySettings(settings));
4345 4249
4346 // Construct the request. 4250 // Construct the request.
4347 scoped_ptr<SpdyFrame> req( 4251 scoped_ptr<SpdyFrame> req(
4348 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4252 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4349 4253
4350 std::vector<MockWrite> writes; 4254 MockWrite writes[] = {
4351 if ((GetParam().protocol >= kProtoSPDY4MinimumVersion) && 4255 CreateMockWrite(*initial_settings_frame, 0),
4352 (GetParam().protocol <= kProtoSPDY4MaximumVersion)) { 4256 CreateMockWrite(*settings_frame, 1),
4353 writes.push_back( 4257 CreateMockWrite(*req, 2),
4354 MockWrite(ASYNC, 4258 };
4355 kHttp2ConnectionHeaderPrefix,
4356 kHttp2ConnectionHeaderPrefixSize));
4357 }
4358 writes.push_back(CreateMockWrite(*initial_settings_frame));
4359 writes.push_back(CreateMockWrite(*settings_frame));
4360 writes.push_back(CreateMockWrite(*req));
4361 4259
4362 // Construct the reply. 4260 // Construct the reply.
4363 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); 4261 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock());
4364 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; 4262 (*reply_headers)[spdy_util_.GetStatusKey()] = "200";
4365 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 4263 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
4366 scoped_ptr<SpdyFrame> reply( 4264 scoped_ptr<SpdyFrame> reply(
4367 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass())); 4265 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass()));
4368 4266
4369 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4267 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4370 MockRead reads[] = { 4268 MockRead reads[] = {
4371 CreateMockRead(*reply), 4269 CreateMockRead(*reply, 3),
4372 CreateMockRead(*body), 4270 CreateMockRead(*body, 4),
4373 MockRead(ASYNC, 0, 0) // EOF 4271 MockRead(ASYNC, 0, 5) // EOF
4374 }; 4272 };
4375 4273
4376 DelayedSocketData data(2, reads, arraysize(reads), 4274 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4377 vector_as_array(&writes), writes.size());
4378 helper.AddData(&data); 4275 helper.AddData(&data);
4379 helper.RunDefaultTest(); 4276 helper.RunDefaultTest();
4380 helper.VerifyDataConsumed(); 4277 helper.VerifyDataConsumed();
4381 TransactionHelperResult out = helper.output(); 4278 TransactionHelperResult out = helper.output();
4382 EXPECT_EQ(OK, out.rv); 4279 EXPECT_EQ(OK, out.rv);
4383 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 4280 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
4384 EXPECT_EQ("hello!", out.response_data); 4281 EXPECT_EQ("hello!", out.response_data);
4385 4282
4386 { 4283 {
4387 // Verify we had two persisted settings. 4284 // Verify we had two persisted settings.
(...skipping 14 matching lines...) Expand all
4402 EXPECT_TRUE(it2 != settings_map.end()); 4299 EXPECT_TRUE(it2 != settings_map.end());
4403 SettingsFlagsAndValue flags_and_value2 = it2->second; 4300 SettingsFlagsAndValue flags_and_value2 = it2->second;
4404 EXPECT_EQ(SETTINGS_FLAG_PERSISTED, flags_and_value2.first); 4301 EXPECT_EQ(SETTINGS_FLAG_PERSISTED, flags_and_value2.first);
4405 EXPECT_EQ(kSampleValue2, flags_and_value2.second); 4302 EXPECT_EQ(kSampleValue2, flags_and_value2.second);
4406 } 4303 }
4407 } 4304 }
4408 4305
4409 TEST_P(SpdyNetworkTransactionTest, GoAwayWithActiveStream) { 4306 TEST_P(SpdyNetworkTransactionTest, GoAwayWithActiveStream) {
4410 scoped_ptr<SpdyFrame> req( 4307 scoped_ptr<SpdyFrame> req(
4411 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4308 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4412 MockWrite writes[] = { CreateMockWrite(*req) }; 4309 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4413 4310
4414 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway()); 4311 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway());
4415 MockRead reads[] = { 4312 MockRead reads[] = {
4416 CreateMockRead(*go_away), 4313 CreateMockRead(*go_away, 1),
4417 }; 4314 };
4418 4315
4419 DelayedSocketData data(1, reads, arraysize(reads), 4316 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4420 writes, arraysize(writes));
4421 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4317 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4422 BoundNetLog(), GetParam(), NULL); 4318 BoundNetLog(), GetParam(), NULL);
4423 helper.AddData(&data); 4319 helper.AddData(&data);
4424 helper.RunToCompletion(&data); 4320 helper.RunToCompletion(&data);
4425 TransactionHelperResult out = helper.output(); 4321 TransactionHelperResult out = helper.output();
4426 EXPECT_EQ(ERR_ABORTED, out.rv); 4322 EXPECT_EQ(ERR_ABORTED, out.rv);
4427 } 4323 }
4428 4324
4429 TEST_P(SpdyNetworkTransactionTest, CloseWithActiveStream) { 4325 TEST_P(SpdyNetworkTransactionTest, CloseWithActiveStream) {
4430 scoped_ptr<SpdyFrame> req( 4326 scoped_ptr<SpdyFrame> req(
4431 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4327 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4432 MockWrite writes[] = { CreateMockWrite(*req) }; 4328 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4433 4329
4434 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4330 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4435 MockRead reads[] = { 4331 MockRead reads[] = {
4436 CreateMockRead(*resp), 4332 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
4437 MockRead(SYNCHRONOUS, 0, 0) // EOF
4438 }; 4333 };
4439 4334
4440 DelayedSocketData data(1, reads, arraysize(reads), 4335 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4441 writes, arraysize(writes));
4442 BoundNetLog log; 4336 BoundNetLog log;
4443 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4337 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4444 log, GetParam(), NULL); 4338 log, GetParam(), NULL);
4445 helper.RunPreTestSetup(); 4339 helper.RunPreTestSetup();
4446 helper.AddData(&data); 4340 helper.AddData(&data);
4447 HttpNetworkTransaction* trans = helper.trans(); 4341 HttpNetworkTransaction* trans = helper.trans();
4448 4342
4449 TestCompletionCallback callback; 4343 TestCompletionCallback callback;
4450 TransactionHelperResult out; 4344 TransactionHelperResult out;
4451 out.rv = trans->Start(&CreateGetRequest(), callback.callback(), log); 4345 out.rv = trans->Start(&CreateGetRequest(), callback.callback(), log);
(...skipping 17 matching lines...) Expand all
4469 // HTTP_1_1_REQUIRED is only supported by SPDY4. 4363 // HTTP_1_1_REQUIRED is only supported by SPDY4.
4470 if (spdy_util_.spdy_version() < SPDY4) 4364 if (spdy_util_.spdy_version() < SPDY4)
4471 return; 4365 return;
4472 4366
4473 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4367 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4474 BoundNetLog(), GetParam(), nullptr); 4368 BoundNetLog(), GetParam(), nullptr);
4475 4369
4476 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4370 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4477 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4371 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4478 MockRead reads[] = { 4372 MockRead reads[] = {
4479 CreateMockRead(*go_away), 4373 CreateMockRead(*go_away, 0),
4480 }; 4374 };
4481 DelayedSocketData data(0, reads, arraysize(reads), nullptr, 0); 4375 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
4482 4376
4483 helper.RunToCompletion(&data); 4377 helper.RunToCompletion(&data);
4484 TransactionHelperResult out = helper.output(); 4378 TransactionHelperResult out = helper.output();
4485 EXPECT_EQ(ERR_HTTP_1_1_REQUIRED, out.rv); 4379 EXPECT_EQ(ERR_HTTP_1_1_REQUIRED, out.rv);
4486 } 4380 }
4487 4381
4488 // Retry with HTTP/1.1 when receiving HTTP_1_1_REQUIRED. Note that no actual 4382 // Retry with HTTP/1.1 when receiving HTTP_1_1_REQUIRED. Note that no actual
4489 // protocol negotiation happens, instead this test forces protocols for both 4383 // protocol negotiation happens, instead this test forces protocols for both
4490 // sockets. 4384 // sockets.
4491 TEST_P(SpdyNetworkTransactionTest, HTTP11RequiredRetry) { 4385 TEST_P(SpdyNetworkTransactionTest, HTTP11RequiredRetry) {
(...skipping 13 matching lines...) Expand all
4505 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 4399 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
4506 session_deps->next_protos = SpdyNextProtos(); 4400 session_deps->next_protos = SpdyNextProtos();
4507 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 4401 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
4508 GetParam(), session_deps.release()); 4402 GetParam(), session_deps.release());
4509 4403
4510 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. 4404 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED.
4511 const char* url = request.url.spec().c_str(); 4405 const char* url = request.url.spec().c_str();
4512 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url)); 4406 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url));
4513 scoped_ptr<SpdyFrame> req( 4407 scoped_ptr<SpdyFrame> req(
4514 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, false, true)); 4408 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, false, true));
4515 MockWrite writes0[] = {CreateMockWrite(*req)}; 4409 MockWrite writes0[] = {CreateMockWrite(*req, 0)};
4516 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4410 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4517 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4411 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4518 MockRead reads0[] = {CreateMockRead(*go_away)}; 4412 MockRead reads0[] = {CreateMockRead(*go_away, 1)};
4519 DelayedSocketData data0(1, reads0, arraysize(reads0), writes0, 4413 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4520 arraysize(writes0)); 4414 arraysize(writes0));
4521 4415
4522 scoped_ptr<SSLSocketDataProvider> ssl_provider0( 4416 scoped_ptr<SSLSocketDataProvider> ssl_provider0(
4523 new SSLSocketDataProvider(ASYNC, OK)); 4417 new SSLSocketDataProvider(ASYNC, OK));
4524 // Expect HTTP/2 protocols too in SSLConfig. 4418 // Expect HTTP/2 protocols too in SSLConfig.
4525 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4419 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4526 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); 4420 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31);
4527 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14); 4421 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14);
4528 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4); 4422 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4);
4529 // Force SPDY. 4423 // Force SPDY.
4530 ssl_provider0->SetNextProto(GetParam().protocol); 4424 ssl_provider0->SetNextProto(GetParam().protocol);
4531 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass()); 4425 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass());
4532 4426
4533 // Second socket: falling back to HTTP/1.1. 4427 // Second socket: falling back to HTTP/1.1.
4534 MockWrite writes1[] = {MockWrite( 4428 MockWrite writes1[] = {MockWrite(ASYNC, 0,
4535 "GET / HTTP/1.1\r\n" 4429 "GET / HTTP/1.1\r\n"
4536 "Host: www.example.org\r\n" 4430 "Host: www.example.org\r\n"
4537 "Connection: keep-alive\r\n\r\n")}; 4431 "Connection: keep-alive\r\n\r\n")};
4538 MockRead reads1[] = {MockRead( 4432 MockRead reads1[] = {MockRead(ASYNC, 1,
4539 "HTTP/1.1 200 OK\r\n" 4433 "HTTP/1.1 200 OK\r\n"
4540 "Content-Length: 5\r\n\r\n" 4434 "Content-Length: 5\r\n\r\n"
4541 "hello")}; 4435 "hello")};
4542 DelayedSocketData data1(1, reads1, arraysize(reads1), writes1, 4436 SequencedSocketData data1(reads1, arraysize(reads1), writes1,
4543 arraysize(writes1)); 4437 arraysize(writes1));
4544 4438
4545 scoped_ptr<SSLSocketDataProvider> ssl_provider1( 4439 scoped_ptr<SSLSocketDataProvider> ssl_provider1(
4546 new SSLSocketDataProvider(ASYNC, OK)); 4440 new SSLSocketDataProvider(ASYNC, OK));
4547 // Expect only HTTP/1.1 protocol in SSLConfig. 4441 // Expect only HTTP/1.1 protocol in SSLConfig.
4548 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4442 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4549 // Force HTTP/1.1. 4443 // Force HTTP/1.1.
4550 ssl_provider1->SetNextProto(kProtoHTTP11); 4444 ssl_provider1->SetNextProto(kProtoHTTP11);
4551 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass()); 4445 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass());
4552 4446
4553 base::WeakPtr<HttpServerProperties> http_server_properties = 4447 base::WeakPtr<HttpServerProperties> http_server_properties =
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4596 GetParam(), 4490 GetParam(),
4597 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70"))); 4491 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70")));
4598 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 4492 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
4599 session_deps->next_protos = SpdyNextProtos(); 4493 session_deps->next_protos = SpdyNextProtos();
4600 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 4494 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
4601 GetParam(), session_deps.release()); 4495 GetParam(), session_deps.release());
4602 4496
4603 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED. 4497 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED.
4604 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect( 4498 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect(
4605 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443))); 4499 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
4606 MockWrite writes0[] = {CreateMockWrite(*req)}; 4500 MockWrite writes0[] = {CreateMockWrite(*req, 0)};
4607 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4501 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4608 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4502 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4609 MockRead reads0[] = {CreateMockRead(*go_away)}; 4503 MockRead reads0[] = {CreateMockRead(*go_away, 1)};
4610 DelayedSocketData data0(1, reads0, arraysize(reads0), writes0, 4504 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4611 arraysize(writes0)); 4505 arraysize(writes0));
4612 4506
4613 scoped_ptr<SSLSocketDataProvider> ssl_provider0( 4507 scoped_ptr<SSLSocketDataProvider> ssl_provider0(
4614 new SSLSocketDataProvider(ASYNC, OK)); 4508 new SSLSocketDataProvider(ASYNC, OK));
4615 // Expect HTTP/2 protocols too in SSLConfig. 4509 // Expect HTTP/2 protocols too in SSLConfig.
4616 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4510 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4617 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); 4511 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31);
4618 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14); 4512 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14);
4619 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4); 4513 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4);
4620 // Force SPDY. 4514 // Force SPDY.
4621 ssl_provider0->SetNextProto(GetParam().protocol); 4515 ssl_provider0->SetNextProto(GetParam().protocol);
4622 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass()); 4516 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass());
4623 4517
4624 // Second socket: retry using HTTP/1.1. 4518 // Second socket: retry using HTTP/1.1.
4625 MockWrite writes1[] = { 4519 MockWrite writes1[] = {
4626 MockWrite(ASYNC, 1, 4520 MockWrite(ASYNC, 0,
4627 "CONNECT www.example.org:443 HTTP/1.1\r\n" 4521 "CONNECT www.example.org:443 HTTP/1.1\r\n"
4628 "Host: www.example.org\r\n" 4522 "Host: www.example.org\r\n"
4629 "Proxy-Connection: keep-alive\r\n\r\n"), 4523 "Proxy-Connection: keep-alive\r\n\r\n"),
4630 MockWrite(ASYNC, 3, 4524 MockWrite(ASYNC, 2,
4631 "GET / HTTP/1.1\r\n" 4525 "GET / HTTP/1.1\r\n"
4632 "Host: www.example.org\r\n" 4526 "Host: www.example.org\r\n"
4633 "Connection: keep-alive\r\n\r\n"), 4527 "Connection: keep-alive\r\n\r\n"),
4634 }; 4528 };
4635 4529
4636 MockRead reads1[] = { 4530 MockRead reads1[] = {
4637 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n\r\n"), 4531 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n\r\n"),
4638 MockRead(ASYNC, 4, 4532 MockRead(ASYNC, 3,
4639 "HTTP/1.1 200 OK\r\n" 4533 "HTTP/1.1 200 OK\r\n"
4640 "Content-Length: 5\r\n\r\n" 4534 "Content-Length: 5\r\n\r\n"
4641 "hello"), 4535 "hello"),
4642 }; 4536 };
4643 DelayedSocketData data1(1, reads1, arraysize(reads1), writes1, 4537 SequencedSocketData data1(reads1, arraysize(reads1), writes1,
4644 arraysize(writes1)); 4538 arraysize(writes1));
4645 4539
4646 scoped_ptr<SSLSocketDataProvider> ssl_provider1( 4540 scoped_ptr<SSLSocketDataProvider> ssl_provider1(
4647 new SSLSocketDataProvider(ASYNC, OK)); 4541 new SSLSocketDataProvider(ASYNC, OK));
4648 // Expect only HTTP/1.1 protocol in SSLConfig. 4542 // Expect only HTTP/1.1 protocol in SSLConfig.
4649 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4543 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4650 // Force HTTP/1.1. 4544 // Force HTTP/1.1.
4651 ssl_provider1->SetNextProto(kProtoHTTP11); 4545 ssl_provider1->SetNextProto(kProtoHTTP11);
4652 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass()); 4546 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass());
4653 4547
4654 // A third socket is needed for the tunnelled connection. 4548 // A third socket is needed for the tunnelled connection.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
4708 MockWrite writes[] = { 4602 MockWrite writes[] = {
4709 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4603 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4710 CreateMockWrite(*req, 2), 4604 CreateMockWrite(*req, 2),
4711 }; 4605 };
4712 MockRead reads[] = { 4606 MockRead reads[] = {
4713 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4607 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4714 CreateMockRead(*resp, 3), 4608 CreateMockRead(*resp, 3),
4715 CreateMockRead(*body.get(), 4), 4609 CreateMockRead(*body.get(), 4),
4716 MockRead(ASYNC, 0, 0, 5), 4610 MockRead(ASYNC, 0, 0, 5),
4717 }; 4611 };
4718 scoped_ptr<OrderedSocketData> data(new OrderedSocketData( 4612 scoped_ptr<SequencedSocketData> data(new SequencedSocketData(
4719 reads, arraysize(reads), writes, arraysize(writes))); 4613 reads, arraysize(reads), writes, arraysize(writes)));
4720 4614
4721 helper.AddData(data.get()); 4615 helper.AddData(data.get());
4722 TestCompletionCallback callback; 4616 TestCompletionCallback callback;
4723 4617
4724 int rv = trans->Start( 4618 int rv = trans->Start(
4725 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4619 &CreateGetRequest(), callback.callback(), BoundNetLog());
4726 EXPECT_EQ(ERR_IO_PENDING, rv); 4620 EXPECT_EQ(ERR_IO_PENDING, rv);
4727 4621
4728 rv = callback.WaitForResult(); 4622 rv = callback.WaitForResult();
(...skipping 29 matching lines...) Expand all
4758 helper.SetSession(make_scoped_refptr( 4652 helper.SetSession(make_scoped_refptr(
4759 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get()))); 4653 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get())));
4760 4654
4761 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4655 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4762 helper.RunPreTestSetup(); 4656 helper.RunPreTestSetup();
4763 4657
4764 // Construct and send a simple GET request. 4658 // Construct and send a simple GET request.
4765 scoped_ptr<SpdyFrame> req( 4659 scoped_ptr<SpdyFrame> req(
4766 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4660 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4767 MockWrite writes[] = { 4661 MockWrite writes[] = {
4768 CreateMockWrite(*req, 1), 4662 CreateMockWrite(*req, 0),
4769 }; 4663 };
4770 4664
4771 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4665 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4772 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4666 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4773 MockRead reads[] = { 4667 MockRead reads[] = {
4774 CreateMockRead(*resp, 2), 4668 CreateMockRead(*resp, 1),
4775 CreateMockRead(*body, 3), 4669 CreateMockRead(*body, 2),
4776 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 4670 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause
4777 MockRead(ASYNC, 0, 5) // EOF
4778 }; 4671 };
4779 OrderedSocketData data(reads, arraysize(reads), 4672 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4780 writes, arraysize(writes));
4781 helper.AddData(&data); 4673 helper.AddData(&data);
4782 HttpNetworkTransaction* trans = helper.trans(); 4674 HttpNetworkTransaction* trans = helper.trans();
4783 4675
4784 TestCompletionCallback callback; 4676 TestCompletionCallback callback;
4785 TransactionHelperResult out; 4677 TransactionHelperResult out;
4786 out.rv = trans->Start( 4678 out.rv = trans->Start(
4787 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4679 &CreateGetRequest(), callback.callback(), BoundNetLog());
4788 4680
4789 EXPECT_EQ(out.rv, ERR_IO_PENDING); 4681 EXPECT_EQ(out.rv, ERR_IO_PENDING);
4790 out.rv = callback.WaitForResult(); 4682 out.rv = callback.WaitForResult();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4825 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4717 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4826 CreateMockWrite(*req2, 2), 4718 CreateMockWrite(*req2, 2),
4827 }; 4719 };
4828 MockRead reads2[] = { 4720 MockRead reads2[] = {
4829 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4721 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4830 CreateMockRead(*resp2, 3), 4722 CreateMockRead(*resp2, 3),
4831 CreateMockRead(*body2, 4), 4723 CreateMockRead(*body2, 4),
4832 MockRead(ASYNC, 0, 5) // EOF 4724 MockRead(ASYNC, 0, 5) // EOF
4833 }; 4725 };
4834 4726
4835 scoped_ptr<OrderedSocketData> data_proxy(new OrderedSocketData( 4727 scoped_ptr<SequencedSocketData> data_proxy(new SequencedSocketData(
4836 reads2, arraysize(reads2), writes2, arraysize(writes2))); 4728 reads2, arraysize(reads2), writes2, arraysize(writes2)));
4837 4729
4838 // Create another request to www.example.org, but this time through a proxy. 4730 // Create another request to www.example.org, but this time through a proxy.
4839 HttpRequestInfo request_proxy; 4731 HttpRequestInfo request_proxy;
4840 request_proxy.method = "GET"; 4732 request_proxy.method = "GET";
4841 request_proxy.url = GURL(GetDefaultUrlWithPath("/foo.dat")); 4733 request_proxy.url = GURL(GetDefaultUrlWithPath("/foo.dat"));
4842 request_proxy.load_flags = 0; 4734 request_proxy.load_flags = 0;
4843 scoped_ptr<SpdySessionDependencies> ssd_proxy( 4735 scoped_ptr<SpdySessionDependencies> ssd_proxy(
4844 CreateSpdySessionDependencies(GetParam())); 4736 CreateSpdySessionDependencies(GetParam()));
4845 // Ensure that this transaction uses the same SpdySessionPool. 4737 // Ensure that this transaction uses the same SpdySessionPool.
(...skipping 19 matching lines...) Expand all
4865 EXPECT_EQ(0, rv); 4757 EXPECT_EQ(0, rv);
4866 4758
4867 HttpResponseInfo response_proxy = *trans_proxy->GetResponseInfo(); 4759 HttpResponseInfo response_proxy = *trans_proxy->GetResponseInfo();
4868 EXPECT_TRUE(response_proxy.headers.get() != NULL); 4760 EXPECT_TRUE(response_proxy.headers.get() != NULL);
4869 EXPECT_EQ("HTTP/1.1 200 OK", response_proxy.headers->GetStatusLine()); 4761 EXPECT_EQ("HTTP/1.1 200 OK", response_proxy.headers->GetStatusLine());
4870 4762
4871 std::string response_data; 4763 std::string response_data;
4872 ASSERT_EQ(OK, ReadTransaction(trans_proxy, &response_data)); 4764 ASSERT_EQ(OK, ReadTransaction(trans_proxy, &response_data));
4873 EXPECT_EQ("hello!", response_data); 4765 EXPECT_EQ("hello!", response_data);
4874 4766
4875 data.CompleteRead();
4876 helper_proxy.VerifyDataConsumed(); 4767 helper_proxy.VerifyDataConsumed();
4877 } 4768 }
4878 4769
4879 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction 4770 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction
4880 // on a new connection, if the connection was previously known to be good. 4771 // on a new connection, if the connection was previously known to be good.
4881 // This can happen when a server reboots without saying goodbye, or when 4772 // This can happen when a server reboots without saying goodbye, or when
4882 // we're behind a NAT that masked the RST. 4773 // we're behind a NAT that masked the RST.
4883 TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) { 4774 TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) {
4884 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4775 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4885 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4776 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4886 MockRead reads[] = { 4777 MockRead reads[] = {
4887 CreateMockRead(*resp), 4778 CreateMockRead(*resp, 1),
4888 CreateMockRead(*body), 4779 CreateMockRead(*body, 2),
4889 MockRead(ASYNC, ERR_IO_PENDING), 4780 MockRead(ASYNC, ERR_IO_PENDING, 3),
4890 MockRead(ASYNC, ERR_CONNECTION_RESET), 4781 MockRead(ASYNC, ERR_CONNECTION_RESET, 4),
4891 }; 4782 };
4892 4783
4893 MockRead reads2[] = { 4784 MockRead reads2[] = {
4894 CreateMockRead(*resp), 4785 CreateMockRead(*resp, 1),
4895 CreateMockRead(*body), 4786 CreateMockRead(*body, 2),
4896 MockRead(ASYNC, 0, 0) // EOF 4787 MockRead(ASYNC, 0, 3) // EOF
4897 }; 4788 };
4898 4789
4790 scoped_ptr<SpdyFrame> req(
4791 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4792 scoped_ptr<SpdyFrame> req3(
4793 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
4794 MockWrite writes1[] = {CreateMockWrite(*req, 0), CreateMockWrite(*req3, 5)};
4795 MockWrite writes2[] = {CreateMockWrite(*req, 0)};
4796
4899 // This test has a couple of variants. 4797 // This test has a couple of variants.
4900 enum { 4798 enum {
4901 // Induce the RST while waiting for our transaction to send. 4799 // Induce the RST while waiting for our transaction to send.
4902 VARIANT_RST_DURING_SEND_COMPLETION, 4800 VARIANT_RST_DURING_SEND_COMPLETION = 0,
4903 // Induce the RST while waiting for our transaction to read. 4801 // Induce the RST while waiting for our transaction to read.
4904 // In this case, the send completed - everything copied into the SNDBUF. 4802 // In this case, the send completed - everything copied into the SNDBUF.
4905 VARIANT_RST_DURING_READ_COMPLETION 4803 VARIANT_RST_DURING_READ_COMPLETION = 1
4906 }; 4804 };
4907 4805
4908 for (int variant = VARIANT_RST_DURING_SEND_COMPLETION; 4806 for (int variant = VARIANT_RST_DURING_SEND_COMPLETION;
4909 variant <= VARIANT_RST_DURING_READ_COMPLETION; 4807 variant <= VARIANT_RST_DURING_READ_COMPLETION;
4910 ++variant) { 4808 ++variant) {
4911 DelayedSocketData data1(1, reads, arraysize(reads), NULL, 0); 4809 SequencedSocketData data1(reads, arraysize(reads), writes1, 1 + variant);
4912 4810
4913 DelayedSocketData data2(1, reads2, arraysize(reads2), NULL, 0); 4811 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
4812 arraysize(writes2));
4914 4813
4915 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4814 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4916 BoundNetLog(), GetParam(), NULL); 4815 BoundNetLog(), GetParam(), NULL);
4917 helper.AddData(&data1); 4816 helper.AddData(&data1);
4918 helper.AddData(&data2); 4817 helper.AddData(&data2);
4919 helper.RunPreTestSetup(); 4818 helper.RunPreTestSetup();
4920 4819
4921 for (int i = 0; i < 2; ++i) { 4820 for (int i = 0; i < 2; ++i) {
4922 scoped_ptr<HttpNetworkTransaction> trans( 4821 scoped_ptr<HttpNetworkTransaction> trans(
4923 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 4822 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
4924 4823
4925 TestCompletionCallback callback; 4824 TestCompletionCallback callback;
4926 int rv = trans->Start( 4825 int rv = trans->Start(
4927 &helper.request(), callback.callback(), BoundNetLog()); 4826 &helper.request(), callback.callback(), BoundNetLog());
4928 EXPECT_EQ(ERR_IO_PENDING, rv); 4827 EXPECT_EQ(ERR_IO_PENDING, rv);
4929 // On the second transaction, we trigger the RST. 4828 // On the second transaction, we trigger the RST.
4930 if (i == 1) { 4829 if (i == 1) {
4931 if (variant == VARIANT_RST_DURING_READ_COMPLETION) { 4830 if (variant == VARIANT_RST_DURING_READ_COMPLETION) {
4932 // Writes to the socket complete asynchronously on SPDY by running 4831 // Writes to the socket complete asynchronously on SPDY by running
4933 // through the message loop. Complete the write here. 4832 // through the message loop. Complete the write here.
4934 base::RunLoop().RunUntilIdle(); 4833 base::RunLoop().RunUntilIdle();
4935 } 4834 }
4936 4835
4937 // Now schedule the ERR_CONNECTION_RESET. 4836 // Now schedule the ERR_CONNECTION_RESET.
4938 EXPECT_EQ(3u, data1.read_index());
4939 data1.CompleteRead(); 4837 data1.CompleteRead();
4940 EXPECT_EQ(4u, data1.read_index());
4941 } 4838 }
4942 rv = callback.WaitForResult(); 4839 rv = callback.WaitForResult();
4943 EXPECT_EQ(OK, rv); 4840 EXPECT_EQ(OK, rv);
4944 4841
4945 const HttpResponseInfo* response = trans->GetResponseInfo(); 4842 const HttpResponseInfo* response = trans->GetResponseInfo();
4946 ASSERT_TRUE(response != NULL); 4843 ASSERT_TRUE(response != NULL);
4947 EXPECT_TRUE(response->headers.get() != NULL); 4844 EXPECT_TRUE(response->headers.get() != NULL);
4948 EXPECT_TRUE(response->was_fetched_via_spdy); 4845 EXPECT_TRUE(response->was_fetched_via_spdy);
4949 std::string response_data; 4846 std::string response_data;
4950 rv = ReadTransaction(trans.get(), &response_data); 4847 rv = ReadTransaction(trans.get(), &response_data);
4951 EXPECT_EQ(OK, rv); 4848 EXPECT_EQ(OK, rv);
4952 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 4849 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
4953 EXPECT_EQ("hello!", response_data); 4850 EXPECT_EQ("hello!", response_data);
4851 base::RunLoop().RunUntilIdle();
4954 } 4852 }
4955 4853
4956 helper.VerifyDataConsumed(); 4854 helper.VerifyDataConsumed();
4855 base::RunLoop().RunUntilIdle();
4957 } 4856 }
4958 } 4857 }
4959 4858
4960 // Test that turning SPDY on and off works properly. 4859 // Test that turning SPDY on and off works properly.
4961 TEST_P(SpdyNetworkTransactionTest, SpdyOnOffToggle) { 4860 TEST_P(SpdyNetworkTransactionTest, SpdyOnOffToggle) {
4962 HttpStreamFactory::set_spdy_enabled(true); 4861 HttpStreamFactory::set_spdy_enabled(true);
4963 scoped_ptr<SpdyFrame> req( 4862 scoped_ptr<SpdyFrame> req(
4964 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4863 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4965 MockWrite spdy_writes[] = { CreateMockWrite(*req) }; 4864 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)};
4966 4865
4967 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4866 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4968 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4867 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4969 MockRead spdy_reads[] = { 4868 MockRead spdy_reads[] = {
4970 CreateMockRead(*resp), 4869 CreateMockRead(*resp, 1),
4971 CreateMockRead(*body), 4870 CreateMockRead(*body, 2),
4972 MockRead(ASYNC, 0, 0) // EOF 4871 MockRead(ASYNC, 0, 3) // EOF
4973 }; 4872 };
4974 4873
4975 DelayedSocketData data(1, spdy_reads, arraysize(spdy_reads), 4874 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
4976 spdy_writes, arraysize(spdy_writes)); 4875 arraysize(spdy_writes));
4977 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4876 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4978 BoundNetLog(), GetParam(), NULL); 4877 BoundNetLog(), GetParam(), NULL);
4979 helper.RunToCompletion(&data); 4878 helper.RunToCompletion(&data);
4980 TransactionHelperResult out = helper.output(); 4879 TransactionHelperResult out = helper.output();
4981 EXPECT_EQ(OK, out.rv); 4880 EXPECT_EQ(OK, out.rv);
4982 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 4881 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
4983 EXPECT_EQ("hello!", out.response_data); 4882 EXPECT_EQ("hello!", out.response_data);
4984 4883
4985 HttpStreamFactory::set_spdy_enabled(false); 4884 HttpStreamFactory::set_spdy_enabled(false);
4885 MockWrite http_writes[] = {
4886 MockWrite(SYNCHRONOUS, 0,
4887 "GET / HTTP/1.1\r\n"
4888 "Host: www.example.org\r\n"
4889 "Connection: keep-alive\r\n\r\n"),
4890 };
4891
4986 MockRead http_reads[] = { 4892 MockRead http_reads[] = {
4987 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 4893 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"),
4988 MockRead("hello from http"), 4894 MockRead(SYNCHRONOUS, 2, "hello from http"),
4989 MockRead(SYNCHRONOUS, OK), 4895 MockRead(SYNCHRONOUS, OK, 3),
4990 }; 4896 };
4991 DelayedSocketData data2(1, http_reads, arraysize(http_reads), NULL, 0); 4897 SequencedSocketData data2(http_reads, arraysize(http_reads), http_writes,
4898 arraysize(http_writes));
4992 NormalSpdyTransactionHelper helper2(CreateGetRequest(), DEFAULT_PRIORITY, 4899 NormalSpdyTransactionHelper helper2(CreateGetRequest(), DEFAULT_PRIORITY,
4993 BoundNetLog(), GetParam(), NULL); 4900 BoundNetLog(), GetParam(), NULL);
4994 helper2.SetSpdyDisabled(); 4901 helper2.SetSpdyDisabled();
4995 helper2.RunToCompletion(&data2); 4902 helper2.RunToCompletion(&data2);
4996 TransactionHelperResult out2 = helper2.output(); 4903 TransactionHelperResult out2 = helper2.output();
4997 EXPECT_EQ(OK, out2.rv); 4904 EXPECT_EQ(OK, out2.rv);
4998 EXPECT_EQ("HTTP/1.1 200 OK", out2.status_line); 4905 EXPECT_EQ("HTTP/1.1 200 OK", out2.status_line);
4999 EXPECT_EQ("hello from http", out2.response_data); 4906 EXPECT_EQ("hello from http", out2.response_data);
5000 4907
5001 HttpStreamFactory::set_spdy_enabled(true); 4908 HttpStreamFactory::set_spdy_enabled(true);
5002 } 4909 }
5003 4910
5004 // Tests that Basic authentication works over SPDY 4911 // Tests that Basic authentication works over SPDY
5005 TEST_P(SpdyNetworkTransactionTest, SpdyBasicAuth) { 4912 TEST_P(SpdyNetworkTransactionTest, SpdyBasicAuth) {
5006 HttpStreamFactory::set_spdy_enabled(true); 4913 HttpStreamFactory::set_spdy_enabled(true);
5007 4914
5008 // The first request will be a bare GET, the second request will be a 4915 // The first request will be a bare GET, the second request will be a
5009 // GET with an Authorization header. 4916 // GET with an Authorization header.
5010 scoped_ptr<SpdyFrame> req_get( 4917 scoped_ptr<SpdyFrame> req_get(
5011 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4918 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5012 const char* const kExtraAuthorizationHeaders[] = { 4919 const char* const kExtraAuthorizationHeaders[] = {
5013 "authorization", "Basic Zm9vOmJhcg==" 4920 "authorization", "Basic Zm9vOmJhcg=="
5014 }; 4921 };
5015 scoped_ptr<SpdyFrame> req_get_authorization( 4922 scoped_ptr<SpdyFrame> req_get_authorization(
5016 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders, 4923 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders,
5017 arraysize(kExtraAuthorizationHeaders) / 2, 4924 arraysize(kExtraAuthorizationHeaders) / 2,
5018 false, 3, LOWEST, true)); 4925 false, 3, LOWEST, true));
5019 MockWrite spdy_writes[] = { 4926 MockWrite spdy_writes[] = {
5020 CreateMockWrite(*req_get, 1), 4927 CreateMockWrite(*req_get, 0), CreateMockWrite(*req_get_authorization, 3),
5021 CreateMockWrite(*req_get_authorization, 4),
5022 }; 4928 };
5023 4929
5024 // The first response is a 401 authentication challenge, and the second 4930 // The first response is a 401 authentication challenge, and the second
5025 // response will be a 200 response since the second request includes a valid 4931 // response will be a 200 response since the second request includes a valid
5026 // Authorization header. 4932 // Authorization header.
5027 const char* const kExtraAuthenticationHeaders[] = { 4933 const char* const kExtraAuthenticationHeaders[] = {
5028 "www-authenticate", 4934 "www-authenticate",
5029 "Basic realm=\"MyRealm\"" 4935 "Basic realm=\"MyRealm\""
5030 }; 4936 };
5031 scoped_ptr<SpdyFrame> resp_authentication( 4937 scoped_ptr<SpdyFrame> resp_authentication(
5032 spdy_util_.ConstructSpdySynReplyError( 4938 spdy_util_.ConstructSpdySynReplyError(
5033 "401 Authentication Required", 4939 "401 Authentication Required",
5034 kExtraAuthenticationHeaders, 4940 kExtraAuthenticationHeaders,
5035 arraysize(kExtraAuthenticationHeaders) / 2, 4941 arraysize(kExtraAuthenticationHeaders) / 2,
5036 1)); 4942 1));
5037 scoped_ptr<SpdyFrame> body_authentication( 4943 scoped_ptr<SpdyFrame> body_authentication(
5038 spdy_util_.ConstructSpdyBodyFrame(1, true)); 4944 spdy_util_.ConstructSpdyBodyFrame(1, true));
5039 scoped_ptr<SpdyFrame> resp_data( 4945 scoped_ptr<SpdyFrame> resp_data(
5040 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 4946 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
5041 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true)); 4947 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true));
5042 MockRead spdy_reads[] = { 4948 MockRead spdy_reads[] = {
5043 CreateMockRead(*resp_authentication, 2), 4949 CreateMockRead(*resp_authentication, 1),
5044 CreateMockRead(*body_authentication, 3), 4950 CreateMockRead(*body_authentication, 2),
5045 CreateMockRead(*resp_data, 5), 4951 CreateMockRead(*resp_data, 4),
5046 CreateMockRead(*body_data, 6), 4952 CreateMockRead(*body_data, 5),
5047 MockRead(ASYNC, 0, 7), 4953 MockRead(ASYNC, 0, 6),
5048 }; 4954 };
5049 4955
5050 OrderedSocketData data(spdy_reads, arraysize(spdy_reads), 4956 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
5051 spdy_writes, arraysize(spdy_writes)); 4957 arraysize(spdy_writes));
5052 HttpRequestInfo request(CreateGetRequest()); 4958 HttpRequestInfo request(CreateGetRequest());
5053 BoundNetLog net_log; 4959 BoundNetLog net_log;
5054 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 4960 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
5055 net_log, GetParam(), NULL); 4961 net_log, GetParam(), NULL);
5056 4962
5057 helper.RunPreTestSetup(); 4963 helper.RunPreTestSetup();
5058 helper.AddData(&data); 4964 helper.AddData(&data);
5059 HttpNetworkTransaction* trans = helper.trans(); 4965 HttpNetworkTransaction* trans = helper.trans();
5060 TestCompletionCallback callback; 4966 TestCompletionCallback callback;
5061 const int rv_start = trans->Start(&request, callback.callback(), net_log); 4967 const int rv_start = trans->Start(&request, callback.callback(), net_log);
(...skipping 30 matching lines...) Expand all
5092 EXPECT_EQ(200, response_restart->headers->response_code()); 4998 EXPECT_EQ(200, response_restart->headers->response_code());
5093 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL); 4999 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL);
5094 } 5000 }
5095 5001
5096 TEST_P(SpdyNetworkTransactionTest, ServerPushWithHeaders) { 5002 TEST_P(SpdyNetworkTransactionTest, ServerPushWithHeaders) {
5097 scoped_ptr<SpdyFrame> stream1_syn( 5003 scoped_ptr<SpdyFrame> stream1_syn(
5098 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5004 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5099 scoped_ptr<SpdyFrame> stream1_body( 5005 scoped_ptr<SpdyFrame> stream1_body(
5100 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5006 spdy_util_.ConstructSpdyBodyFrame(1, true));
5101 MockWrite writes[] = { 5007 MockWrite writes[] = {
5102 CreateMockWrite(*stream1_syn, 1), 5008 CreateMockWrite(*stream1_syn, 0),
5103 }; 5009 };
5104 5010
5105 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); 5011 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock());
5106 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 5012 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
5107 initial_headers.get()); 5013 initial_headers.get());
5108 scoped_ptr<SpdyFrame> stream2_syn( 5014 scoped_ptr<SpdyFrame> stream2_syn(
5109 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1)); 5015 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1));
5110 5016
5111 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5017 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5112 (*late_headers)["hello"] = "bye"; 5018 (*late_headers)["hello"] = "bye";
5113 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; 5019 (*late_headers)[spdy_util_.GetStatusKey()] = "200";
5114 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 5020 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
5115 scoped_ptr<SpdyFrame> stream2_headers( 5021 scoped_ptr<SpdyFrame> stream2_headers(
5116 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5022 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5117 false, 5023 false,
5118 2, 5024 2,
5119 LOWEST, 5025 LOWEST,
5120 HEADERS, 5026 HEADERS,
5121 CONTROL_FLAG_NONE, 5027 CONTROL_FLAG_NONE,
5122 0)); 5028 0));
5123 5029
5124 scoped_ptr<SpdyFrame> 5030 scoped_ptr<SpdyFrame>
5125 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5031 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5126 const char kPushedData[] = "pushed"; 5032 const char kPushedData[] = "pushed";
5127 scoped_ptr<SpdyFrame> stream2_body( 5033 scoped_ptr<SpdyFrame> stream2_body(
5128 spdy_util_.ConstructSpdyBodyFrame( 5034 spdy_util_.ConstructSpdyBodyFrame(
5129 2, kPushedData, strlen(kPushedData), true)); 5035 2, kPushedData, strlen(kPushedData), true));
5130 MockRead reads[] = { 5036 MockRead reads[] = {
5131 CreateMockRead(*stream1_reply, 2), 5037 CreateMockRead(*stream1_reply, 1),
5132 CreateMockRead(*stream2_syn, 3), 5038 CreateMockRead(*stream2_syn, 2),
5133 CreateMockRead(*stream2_headers, 4), 5039 CreateMockRead(*stream2_headers, 3),
5134 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 5040 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
5135 CreateMockRead(*stream2_body, 5), 5041 CreateMockRead(*stream2_body, 5),
5136 MockRead(ASYNC, ERR_IO_PENDING, 7), // Force a pause 5042 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
5137 }; 5043 };
5138 5044
5139 HttpResponseInfo response; 5045 HttpResponseInfo response;
5140 HttpResponseInfo response2; 5046 HttpResponseInfo response2;
5141 std::string expected_push_result("pushed"); 5047 std::string expected_push_result("pushed");
5142 OrderedSocketData data(reads, arraysize(reads), 5048 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5143 writes, arraysize(writes));
5144 RunServerPushTest(&data, 5049 RunServerPushTest(&data,
5145 &response, 5050 &response,
5146 &response2, 5051 &response2,
5147 expected_push_result); 5052 expected_push_result);
5148 5053
5149 // Verify the SYN_REPLY. 5054 // Verify the SYN_REPLY.
5150 EXPECT_TRUE(response.headers.get() != NULL); 5055 EXPECT_TRUE(response.headers.get() != NULL);
5151 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 5056 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
5152 5057
5153 // Verify the pushed stream. 5058 // Verify the pushed stream.
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
5519 EXPECT_TRUE(data.at_read_eof()); 5424 EXPECT_TRUE(data.at_read_eof());
5520 EXPECT_TRUE(data.at_write_eof()); 5425 EXPECT_TRUE(data.at_write_eof());
5521 } 5426 }
5522 5427
5523 TEST_P(SpdyNetworkTransactionTest, SynReplyWithHeaders) { 5428 TEST_P(SpdyNetworkTransactionTest, SynReplyWithHeaders) {
5524 scoped_ptr<SpdyFrame> req( 5429 scoped_ptr<SpdyFrame> req(
5525 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5430 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5526 scoped_ptr<SpdyFrame> rst( 5431 scoped_ptr<SpdyFrame> rst(
5527 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 5432 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
5528 MockWrite writes[] = { 5433 MockWrite writes[] = {
5529 CreateMockWrite(*req), CreateMockWrite(*rst), 5434 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
5530 }; 5435 };
5531 5436
5532 scoped_ptr<SpdyFrame> stream1_reply( 5437 scoped_ptr<SpdyFrame> stream1_reply(
5533 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5438 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5534 5439
5535 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5440 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5536 (*late_headers)["hello"] = "bye"; 5441 (*late_headers)["hello"] = "bye";
5537 scoped_ptr<SpdyFrame> stream1_headers( 5442 scoped_ptr<SpdyFrame> stream1_headers(
5538 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5443 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5539 false, 5444 false,
5540 1, 5445 1,
5541 LOWEST, 5446 LOWEST,
5542 HEADERS, 5447 HEADERS,
5543 CONTROL_FLAG_NONE, 5448 CONTROL_FLAG_NONE,
5544 0)); 5449 0));
5545 scoped_ptr<SpdyFrame> stream1_body( 5450 scoped_ptr<SpdyFrame> stream1_body(
5546 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5451 spdy_util_.ConstructSpdyBodyFrame(1, true));
5547 MockRead reads[] = { 5452 MockRead reads[] = {
5548 CreateMockRead(*stream1_reply), 5453 CreateMockRead(*stream1_reply, 1),
5549 CreateMockRead(*stream1_headers), 5454 CreateMockRead(*stream1_headers, 2),
5550 CreateMockRead(*stream1_body), 5455 CreateMockRead(*stream1_body, 3),
5551 MockRead(ASYNC, 0, 0) // EOF 5456 MockRead(ASYNC, 0, 5) // EOF
5552 }; 5457 };
5553 5458
5554 DelayedSocketData data(1, reads, arraysize(reads), 5459 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5555 writes, arraysize(writes));
5556 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5460 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5557 BoundNetLog(), GetParam(), NULL); 5461 BoundNetLog(), GetParam(), NULL);
5558 helper.RunToCompletion(&data); 5462 helper.RunToCompletion(&data);
5559 TransactionHelperResult out = helper.output(); 5463 TransactionHelperResult out = helper.output();
5560 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 5464 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
5561 } 5465 }
5562 5466
5563 TEST_P(SpdyNetworkTransactionTest, SynReplyWithLateHeaders) { 5467 TEST_P(SpdyNetworkTransactionTest, SynReplyWithLateHeaders) {
5564 scoped_ptr<SpdyFrame> req( 5468 scoped_ptr<SpdyFrame> req(
5565 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5469 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5566 scoped_ptr<SpdyFrame> rst( 5470 scoped_ptr<SpdyFrame> rst(
5567 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 5471 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
5568 MockWrite writes[] = { 5472 MockWrite writes[] = {
5569 CreateMockWrite(*req), 5473 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
5570 CreateMockWrite(*rst),
5571 }; 5474 };
5572 5475
5573 scoped_ptr<SpdyFrame> stream1_reply( 5476 scoped_ptr<SpdyFrame> stream1_reply(
5574 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5477 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5575 5478
5576 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5479 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5577 (*late_headers)["hello"] = "bye"; 5480 (*late_headers)["hello"] = "bye";
5578 scoped_ptr<SpdyFrame> stream1_headers( 5481 scoped_ptr<SpdyFrame> stream1_headers(
5579 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5482 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5580 false, 5483 false,
5581 1, 5484 1,
5582 LOWEST, 5485 LOWEST,
5583 HEADERS, 5486 HEADERS,
5584 CONTROL_FLAG_NONE, 5487 CONTROL_FLAG_NONE,
5585 0)); 5488 0));
5586 scoped_ptr<SpdyFrame> stream1_body( 5489 scoped_ptr<SpdyFrame> stream1_body(
5587 spdy_util_.ConstructSpdyBodyFrame(1, false)); 5490 spdy_util_.ConstructSpdyBodyFrame(1, false));
5588 scoped_ptr<SpdyFrame> stream1_body2( 5491 scoped_ptr<SpdyFrame> stream1_body2(
5589 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5492 spdy_util_.ConstructSpdyBodyFrame(1, true));
5590 MockRead reads[] = { 5493 MockRead reads[] = {
5591 CreateMockRead(*stream1_reply), 5494 CreateMockRead(*stream1_reply, 1),
5592 CreateMockRead(*stream1_body), 5495 CreateMockRead(*stream1_body, 2),
5593 CreateMockRead(*stream1_headers), 5496 CreateMockRead(*stream1_headers, 3),
5594 CreateMockRead(*stream1_body2), 5497 CreateMockRead(*stream1_body2, 5),
5595 MockRead(ASYNC, 0, 0) // EOF 5498 MockRead(ASYNC, 0, 6) // EOF
5596 }; 5499 };
5597 5500
5598 DelayedSocketData data(1, reads, arraysize(reads), 5501 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5599 writes, arraysize(writes));
5600 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5502 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5601 BoundNetLog(), GetParam(), NULL); 5503 BoundNetLog(), GetParam(), NULL);
5602 helper.RunToCompletion(&data); 5504 helper.RunToCompletion(&data);
5603 TransactionHelperResult out = helper.output(); 5505 TransactionHelperResult out = helper.output();
5604 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 5506 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
5605 } 5507 }
5606 5508
5607 TEST_P(SpdyNetworkTransactionTest, ServerPushCrossOriginCorrectness) { 5509 TEST_P(SpdyNetworkTransactionTest, ServerPushCrossOriginCorrectness) {
5608 // Running these tests via Alt-Svc is too complicated to be worthwhile. 5510 // Running these tests via Alt-Svc is too complicated to be worthwhile.
5609 if (GetParam().ssl_type != HTTPS_SPDY_VIA_NPN) 5511 if (GetParam().ssl_type != HTTPS_SPDY_VIA_NPN)
(...skipping 27 matching lines...) Expand all
5637 const char* url_to_fetch = kTestCases[index]; 5539 const char* url_to_fetch = kTestCases[index];
5638 const char* url_to_push = kTestCases[index + 1]; 5540 const char* url_to_push = kTestCases[index + 1];
5639 5541
5640 scoped_ptr<SpdyFrame> stream1_syn( 5542 scoped_ptr<SpdyFrame> stream1_syn(
5641 spdy_util_.ConstructSpdyGet(url_to_fetch, false, 1, LOWEST)); 5543 spdy_util_.ConstructSpdyGet(url_to_fetch, false, 1, LOWEST));
5642 scoped_ptr<SpdyFrame> stream1_body( 5544 scoped_ptr<SpdyFrame> stream1_body(
5643 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5545 spdy_util_.ConstructSpdyBodyFrame(1, true));
5644 scoped_ptr<SpdyFrame> push_rst( 5546 scoped_ptr<SpdyFrame> push_rst(
5645 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 5547 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
5646 MockWrite writes[] = { 5548 MockWrite writes[] = {
5647 CreateMockWrite(*stream1_syn, 1), 5549 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*push_rst, 3),
5648 CreateMockWrite(*push_rst, 4),
5649 }; 5550 };
5650 5551
5651 scoped_ptr<SpdyFrame> 5552 scoped_ptr<SpdyFrame>
5652 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5553 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5653 scoped_ptr<SpdyFrame> 5554 scoped_ptr<SpdyFrame>
5654 stream2_syn(spdy_util_.ConstructSpdyPush(NULL, 5555 stream2_syn(spdy_util_.ConstructSpdyPush(NULL,
5655 0, 5556 0,
5656 2, 5557 2,
5657 1, 5558 1,
5658 url_to_push)); 5559 url_to_push));
5659 const char kPushedData[] = "pushed"; 5560 const char kPushedData[] = "pushed";
5660 scoped_ptr<SpdyFrame> stream2_body( 5561 scoped_ptr<SpdyFrame> stream2_body(
5661 spdy_util_.ConstructSpdyBodyFrame( 5562 spdy_util_.ConstructSpdyBodyFrame(
5662 2, kPushedData, strlen(kPushedData), true)); 5563 2, kPushedData, strlen(kPushedData), true));
5663 scoped_ptr<SpdyFrame> rst( 5564 scoped_ptr<SpdyFrame> rst(
5664 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); 5565 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL));
5665 5566
5666 MockRead reads[] = { 5567 MockRead reads[] = {
5667 CreateMockRead(*stream1_reply, 2), 5568 CreateMockRead(*stream1_reply, 1),
5668 CreateMockRead(*stream2_syn, 3), 5569 CreateMockRead(*stream2_syn, 2),
5669 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 5570 CreateMockRead(*stream1_body, 4),
5670 CreateMockRead(*stream2_body, 6), 5571 CreateMockRead(*stream2_body, 5),
5671 MockRead(ASYNC, ERR_IO_PENDING, 7), // Force a pause 5572 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
5672 }; 5573 };
5673 5574
5674 HttpResponseInfo response; 5575 HttpResponseInfo response;
5675 OrderedSocketData data(reads, arraysize(reads), 5576 SequencedSocketData data(reads, arraysize(reads), writes,
5676 writes, arraysize(writes)); 5577 arraysize(writes));
5677 5578
5678 HttpRequestInfo request; 5579 HttpRequestInfo request;
5679 request.method = "GET"; 5580 request.method = "GET";
5680 request.url = GURL(url_to_fetch); 5581 request.url = GURL(url_to_fetch);
5681 request.load_flags = 0; 5582 request.load_flags = 0;
5682 5583
5683 // Enable cross-origin push. Since we are not using a proxy, this should 5584 // Enable cross-origin push. Since we are not using a proxy, this should
5684 // not actually enable cross-origin SPDY push. 5585 // not actually enable cross-origin SPDY push.
5685 scoped_ptr<SpdySessionDependencies> session_deps( 5586 scoped_ptr<SpdySessionDependencies> session_deps(
5686 CreateSpdySessionDependencies(GetParam())); 5587 CreateSpdySessionDependencies(GetParam()));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5720 } 5621 }
5721 } 5622 }
5722 5623
5723 TEST_P(SpdyNetworkTransactionTest, RetryAfterRefused) { 5624 TEST_P(SpdyNetworkTransactionTest, RetryAfterRefused) {
5724 // Construct the request. 5625 // Construct the request.
5725 scoped_ptr<SpdyFrame> req( 5626 scoped_ptr<SpdyFrame> req(
5726 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5627 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5727 scoped_ptr<SpdyFrame> req2( 5628 scoped_ptr<SpdyFrame> req2(
5728 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 5629 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
5729 MockWrite writes[] = { 5630 MockWrite writes[] = {
5730 CreateMockWrite(*req, 1), 5631 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 2),
5731 CreateMockWrite(*req2, 3),
5732 }; 5632 };
5733 5633
5734 scoped_ptr<SpdyFrame> refused( 5634 scoped_ptr<SpdyFrame> refused(
5735 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); 5635 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM));
5736 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 5636 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
5737 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(3, true)); 5637 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(3, true));
5738 MockRead reads[] = { 5638 MockRead reads[] = {
5739 CreateMockRead(*refused, 2), 5639 CreateMockRead(*refused, 1),
5740 CreateMockRead(*resp, 4), 5640 CreateMockRead(*resp, 3),
5741 CreateMockRead(*body, 5), 5641 CreateMockRead(*body, 4),
5742 MockRead(ASYNC, 0, 6) // EOF 5642 MockRead(ASYNC, 0, 5) // EOF
5743 }; 5643 };
5744 5644
5745 OrderedSocketData data(reads, arraysize(reads), 5645 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5746 writes, arraysize(writes));
5747 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5646 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5748 BoundNetLog(), GetParam(), NULL); 5647 BoundNetLog(), GetParam(), NULL);
5749 5648
5750 helper.RunPreTestSetup(); 5649 helper.RunPreTestSetup();
5751 helper.AddData(&data); 5650 helper.AddData(&data);
5752 5651
5753 HttpNetworkTransaction* trans = helper.trans(); 5652 HttpNetworkTransaction* trans = helper.trans();
5754 5653
5755 // Start the transaction with basic parameters. 5654 // Start the transaction with basic parameters.
5756 TestCompletionCallback callback; 5655 TestCompletionCallback callback;
5757 int rv = trans->Start( 5656 int rv = trans->Start(
5758 &CreateGetRequest(), callback.callback(), BoundNetLog()); 5657 &CreateGetRequest(), callback.callback(), BoundNetLog());
5759 EXPECT_EQ(ERR_IO_PENDING, rv); 5658 EXPECT_EQ(ERR_IO_PENDING, rv);
5760 rv = callback.WaitForResult(); 5659 rv = callback.WaitForResult();
5761 EXPECT_EQ(OK, rv); 5660 EXPECT_EQ(OK, rv);
5762 5661
5763 // Verify that we consumed all test data. 5662 // Verify that we consumed all test data.
5764 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 5663 EXPECT_TRUE(data.AllReadDataConsumed());
5765 << data.read_count() 5664 EXPECT_TRUE(data.AllWriteDataConsumed());
5766 << " Read index: "
5767 << data.read_index();
5768 EXPECT_TRUE(data.at_write_eof()) << "Write count: "
5769 << data.write_count()
5770 << " Write index: "
5771 << data.write_index();
5772 5665
5773 // Verify the SYN_REPLY. 5666 // Verify the SYN_REPLY.
5774 HttpResponseInfo response = *trans->GetResponseInfo(); 5667 HttpResponseInfo response = *trans->GetResponseInfo();
5775 EXPECT_TRUE(response.headers.get() != NULL); 5668 EXPECT_TRUE(response.headers.get() != NULL);
5776 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 5669 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
5777 } 5670 }
5778 5671
5779 TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) { 5672 TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) {
5780 // This first request will start to establish the SpdySession. 5673 // This first request will start to establish the SpdySession.
5781 // Then we will start the second (MEDIUM priority) and then third 5674 // Then we will start the second (MEDIUM priority) and then third
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
6022 spdy_util_.ConstructSpdyWindowUpdate(0, session_window_update_delta)); 5915 spdy_util_.ConstructSpdyWindowUpdate(0, session_window_update_delta));
6023 scoped_ptr<SpdyFrame> stream_window_update( 5916 scoped_ptr<SpdyFrame> stream_window_update(
6024 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta)); 5917 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta));
6025 5918
6026 std::vector<MockWrite> writes; 5919 std::vector<MockWrite> writes;
6027 if ((GetParam().protocol >= kProtoSPDY4MinimumVersion) && 5920 if ((GetParam().protocol >= kProtoSPDY4MinimumVersion) &&
6028 (GetParam().protocol <= kProtoSPDY4MaximumVersion)) { 5921 (GetParam().protocol <= kProtoSPDY4MaximumVersion)) {
6029 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, 5922 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix,
6030 kHttp2ConnectionHeaderPrefixSize, 0)); 5923 kHttp2ConnectionHeaderPrefixSize, 0));
6031 } 5924 }
6032 writes.push_back(CreateMockWrite(*initial_settings_frame)); 5925 writes.push_back(CreateMockWrite(*initial_settings_frame, writes.size()));
6033 writes.push_back(CreateMockWrite(*initial_window_update)); 5926 writes.push_back(CreateMockWrite(*initial_window_update, writes.size()));
6034 writes.push_back(CreateMockWrite(*req)); 5927 writes.push_back(CreateMockWrite(*req, writes.size()));
6035 writes.push_back(CreateMockWrite(*session_window_update));
6036 writes.push_back(CreateMockWrite(*stream_window_update));
6037 5928
6038 std::vector<MockRead> reads; 5929 std::vector<MockRead> reads;
6039 scoped_ptr<SpdyFrame> resp( 5930 scoped_ptr<SpdyFrame> resp(
6040 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5931 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
6041 reads.push_back(CreateMockRead(*resp)); 5932 reads.push_back(CreateMockRead(*resp, writes.size() + reads.size()));
6042 5933
6043 ScopedVector<SpdyFrame> body_frames; 5934 ScopedVector<SpdyFrame> body_frames;
6044 const std::string body_data(kChunkSize, 'x'); 5935 const std::string body_data(kChunkSize, 'x');
6045 for (size_t remaining = kTargetSize; remaining != 0;) { 5936 for (size_t remaining = kTargetSize; remaining != 0;) {
6046 size_t frame_size = std::min(remaining, body_data.size()); 5937 size_t frame_size = std::min(remaining, body_data.size());
6047 body_frames.push_back(spdy_util_.ConstructSpdyBodyFrame( 5938 body_frames.push_back(spdy_util_.ConstructSpdyBodyFrame(
6048 1, body_data.data(), frame_size, false)); 5939 1, body_data.data(), frame_size, false));
6049 reads.push_back(CreateMockRead(*body_frames.back())); 5940 reads.push_back(
5941 CreateMockRead(*body_frames.back(), writes.size() + reads.size()));
6050 remaining -= frame_size; 5942 remaining -= frame_size;
6051 } 5943 }
6052 reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, 0)); // Yield. 5944 reads.push_back(
5945 MockRead(ASYNC, ERR_IO_PENDING, writes.size() + reads.size())); // Yield.
6053 5946
6054 DelayedSocketData data(2, vector_as_array(&reads), reads.size(), 5947 writes.push_back(
6055 vector_as_array(&writes), writes.size()); 5948 CreateMockWrite(*session_window_update, writes.size() + reads.size()));
5949 writes.push_back(
5950 CreateMockWrite(*stream_window_update, writes.size() + reads.size()));
5951
5952 SequencedSocketData data(vector_as_array(&reads), reads.size(),
5953 vector_as_array(&writes), writes.size());
6056 5954
6057 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5955 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
6058 BoundNetLog(), GetParam(), NULL); 5956 BoundNetLog(), GetParam(), NULL);
6059 helper.AddData(&data); 5957 helper.AddData(&data);
6060 helper.RunPreTestSetup(); 5958 helper.RunPreTestSetup();
6061 5959
6062 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 5960 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
6063 SpdySessionPoolPeer pool_peer(spdy_session_pool); 5961 SpdySessionPoolPeer pool_peer(spdy_session_pool);
6064 pool_peer.SetEnableSendingInitialData(true); 5962 pool_peer.SetEnableSendingInitialData(true);
6065 pool_peer.SetSessionMaxRecvWindowSize(session_max_recv_window_size); 5963 pool_peer.SetSessionMaxRecvWindowSize(session_max_recv_window_size);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
6167 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, callback.WaitForResult()); 6065 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, callback.WaitForResult());
6168 helper.VerifyDataConsumed(); 6066 helper.VerifyDataConsumed();
6169 } 6067 }
6170 6068
6171 // Test that after hitting a send window size of 0, the write process 6069 // Test that after hitting a send window size of 0, the write process
6172 // stalls and upon receiving WINDOW_UPDATE frame write resumes. 6070 // stalls and upon receiving WINDOW_UPDATE frame write resumes.
6173 6071
6174 // This test constructs a POST request followed by enough data frames 6072 // This test constructs a POST request followed by enough data frames
6175 // containing 'a' that would make the window size 0, followed by another 6073 // containing 'a' that would make the window size 0, followed by another
6176 // data frame containing default content (which is "hello!") and this frame 6074 // data frame containing default content (which is "hello!") and this frame
6177 // also contains a FIN flag. DelayedSocketData is used to enforce all 6075 // also contains a FIN flag. SequencedSocketData is used to enforce all
6178 // writes go through before a read could happen. However, the last frame 6076 // writes, save the last, go through before a read could happen. The last frame
6179 // ("hello!") is not supposed to go through since by the time its turn 6077 // ("hello!") is not permitted to go through since by the time its turn
6180 // arrives, window size is 0. At this point MessageLoop::Run() called via 6078 // arrives, window size is 0. At this point MessageLoop::Run() called via
6181 // callback would block. Therefore we call MessageLoop::RunUntilIdle() 6079 // callback would block. Therefore we call MessageLoop::RunUntilIdle()
6182 // which returns after performing all possible writes. We use DCHECKS to 6080 // which returns after performing all possible writes. We use DCHECKS to
6183 // ensure that last data frame is still there and stream has stalled. 6081 // ensure that last data frame is still there and stream has stalled.
6184 // After that, next read is artifically enforced, which causes a 6082 // After that, next read is artifically enforced, which causes a
6185 // WINDOW_UPDATE to be read and I/O process resumes. 6083 // WINDOW_UPDATE to be read and I/O process resumes.
6186 TEST_P(SpdyNetworkTransactionTest, FlowControlStallResume) { 6084 TEST_P(SpdyNetworkTransactionTest, FlowControlStallResume) {
6187 const int32 initial_window_size = 6085 const int32 initial_window_size =
6188 SpdySession::GetDefaultInitialWindowSize(GetParam().protocol); 6086 SpdySession::GetDefaultInitialWindowSize(GetParam().protocol);
6189 // Number of frames we need to send to zero out the window size: data 6087 // Number of frames we need to send to zero out the window size: data
(...skipping 21 matching lines...) Expand all
6211 scoped_ptr<SpdyFrame> body2( 6109 scoped_ptr<SpdyFrame> body2(
6212 spdy_util_.ConstructSpdyBodyFrame( 6110 spdy_util_.ConstructSpdyBodyFrame(
6213 1, content.c_str(), last_frame_size, false)); 6111 1, content.c_str(), last_frame_size, false));
6214 6112
6215 // Data frame to be sent once WINDOW_UPDATE frame is received. 6113 // Data frame to be sent once WINDOW_UPDATE frame is received.
6216 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6114 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(1, true));
6217 6115
6218 // Fill in mock writes. 6116 // Fill in mock writes.
6219 scoped_ptr<MockWrite[]> writes(new MockWrite[num_writes]); 6117 scoped_ptr<MockWrite[]> writes(new MockWrite[num_writes]);
6220 size_t i = 0; 6118 size_t i = 0;
6221 writes[i] = CreateMockWrite(*req); 6119 writes[i] = CreateMockWrite(*req, i);
6222 for (i = 1; i < num_writes - 2; i++) 6120 for (i = 1; i < num_writes - 2; i++)
6223 writes[i] = CreateMockWrite(*body1); 6121 writes[i] = CreateMockWrite(*body1, i);
6224 writes[i++] = CreateMockWrite(*body2); 6122 writes[i] = CreateMockWrite(*body2, i);
6225 writes[i] = CreateMockWrite(*body3); 6123 // The last write must not be attempted until after the WINDOW_UPDATES
6124 // have been received.
6125 writes[i + 1] = CreateMockWrite(*body3, i + 4, SYNCHRONOUS);
6226 6126
6227 // Construct read frame, give enough space to upload the rest of the 6127 // Construct read frame, give enough space to upload the rest of the
6228 // data. 6128 // data.
6229 scoped_ptr<SpdyFrame> session_window_update( 6129 scoped_ptr<SpdyFrame> session_window_update(
6230 spdy_util_.ConstructSpdyWindowUpdate(0, kUploadDataSize)); 6130 spdy_util_.ConstructSpdyWindowUpdate(0, kUploadDataSize));
6231 scoped_ptr<SpdyFrame> window_update( 6131 scoped_ptr<SpdyFrame> window_update(
6232 spdy_util_.ConstructSpdyWindowUpdate(1, kUploadDataSize)); 6132 spdy_util_.ConstructSpdyWindowUpdate(1, kUploadDataSize));
6233 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 6133 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
6234 MockRead reads[] = { 6134 MockRead reads[] = {
6235 CreateMockRead(*session_window_update), 6135 MockRead(ASYNC, ERR_IO_PENDING, i + 1), // Force a pause
6236 CreateMockRead(*session_window_update), 6136 CreateMockRead(*session_window_update, i + 2),
6237 CreateMockRead(*window_update), 6137 CreateMockRead(*window_update, i + 3),
6238 CreateMockRead(*window_update), 6138 // Now the last write will occur.
6239 CreateMockRead(*reply), 6139 CreateMockRead(*reply, i + 5),
6240 CreateMockRead(*body2), 6140 CreateMockRead(*body2, i + 6),
6241 CreateMockRead(*body3), 6141 CreateMockRead(*body3, i + 7),
6242 MockRead(ASYNC, 0, 0) // EOF 6142 MockRead(ASYNC, 0, i + 8) // EOF
6243 }; 6143 };
6244 6144
6245 // Skip the session window updates unless we're using SPDY/3.1 and 6145 SequencedSocketData data(reads, arraysize(reads), writes.get(), num_writes);
6246 // above.
6247 size_t read_offset = (GetParam().protocol >= kProtoSPDY31) ? 0 : 2;
6248 size_t num_reads = arraysize(reads) - read_offset;
6249
6250 // Force all writes to happen before any read, last write will not
6251 // actually queue a frame, due to window size being 0.
6252 DelayedSocketData data(num_writes, reads + read_offset, num_reads,
6253 writes.get(), num_writes);
6254 6146
6255 ScopedVector<UploadElementReader> element_readers; 6147 ScopedVector<UploadElementReader> element_readers;
6256 std::string upload_data_string(initial_window_size, 'a'); 6148 std::string upload_data_string(initial_window_size, 'a');
6257 upload_data_string.append(kUploadData, kUploadDataSize); 6149 upload_data_string.append(kUploadData, kUploadDataSize);
6258 element_readers.push_back(new UploadBytesElementReader( 6150 element_readers.push_back(new UploadBytesElementReader(
6259 upload_data_string.c_str(), upload_data_string.size())); 6151 upload_data_string.c_str(), upload_data_string.size()));
6260 ElementsUploadDataStream upload_data_stream(element_readers.Pass(), 0); 6152 ElementsUploadDataStream upload_data_stream(element_readers.Pass(), 0);
6261 6153
6262 HttpRequestInfo request; 6154 HttpRequestInfo request;
6263 request.method = "POST"; 6155 request.method = "POST";
(...skipping 17 matching lines...) Expand all
6281 ASSERT_TRUE(stream->stream() != NULL); 6173 ASSERT_TRUE(stream->stream() != NULL);
6282 EXPECT_EQ(0, stream->stream()->send_window_size()); 6174 EXPECT_EQ(0, stream->stream()->send_window_size());
6283 // All the body data should have been read. 6175 // All the body data should have been read.
6284 // TODO(satorux): This is because of the weirdness in reading the request 6176 // TODO(satorux): This is because of the weirdness in reading the request
6285 // body in OnSendBodyComplete(). See crbug.com/113107. 6177 // body in OnSendBodyComplete(). See crbug.com/113107.
6286 EXPECT_TRUE(upload_data_stream.IsEOF()); 6178 EXPECT_TRUE(upload_data_stream.IsEOF());
6287 // But the body is not yet fully sent (kUploadData is not yet sent) 6179 // But the body is not yet fully sent (kUploadData is not yet sent)
6288 // since we're send-stalled. 6180 // since we're send-stalled.
6289 EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control()); 6181 EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control());
6290 6182
6291 data.ForceNextRead(); // Read in WINDOW_UPDATE frame. 6183 data.CompleteRead(); // Read in WINDOW_UPDATE frame.
6292 rv = callback.WaitForResult(); 6184 rv = callback.WaitForResult();
6293 helper.VerifyDataConsumed(); 6185 helper.VerifyDataConsumed();
6294 } 6186 }
6295 6187
6296 // Test we correctly handle the case where the SETTINGS frame results in 6188 // Test we correctly handle the case where the SETTINGS frame results in
6297 // unstalling the send window. 6189 // unstalling the send window.
6298 TEST_P(SpdyNetworkTransactionTest, FlowControlStallResumeAfterSettings) { 6190 TEST_P(SpdyNetworkTransactionTest, FlowControlStallResumeAfterSettings) {
6299 const int32 initial_window_size = 6191 const int32 initial_window_size =
6300 SpdySession::GetDefaultInitialWindowSize(GetParam().protocol); 6192 SpdySession::GetDefaultInitialWindowSize(GetParam().protocol);
6301 6193
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
6544 MockRead reads[] = {CreateMockRead(*push, 1)}; 6436 MockRead reads[] = {CreateMockRead(*push, 1)};
6545 6437
6546 scoped_ptr<SpdyFrame> req( 6438 scoped_ptr<SpdyFrame> req(
6547 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6439 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6548 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 6440 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
6549 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id.")); 6441 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id."));
6550 MockWrite writes[] = { 6442 MockWrite writes[] = {
6551 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2), 6443 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2),
6552 }; 6444 };
6553 6445
6554 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 6446 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6555 NormalSpdyTransactionHelper helper( 6447 NormalSpdyTransactionHelper helper(
6556 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6448 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6557 helper.RunToCompletion(&data); 6449 helper.RunToCompletion(&data);
6558 TransactionHelperResult out = helper.output(); 6450 TransactionHelperResult out = helper.output();
6559 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 6451 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
6560 } 6452 }
6561 6453
6562 TEST_P(SpdyNetworkTransactionTest, 6454 TEST_P(SpdyNetworkTransactionTest,
6563 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) { 6455 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) {
6564 if (spdy_util_.spdy_version() < SPDY3) 6456 if (spdy_util_.spdy_version() < SPDY3)
(...skipping 13 matching lines...) Expand all
6578 scoped_ptr<SpdyFrame> req( 6470 scoped_ptr<SpdyFrame> req(
6579 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6471 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6580 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 6472 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
6581 4, 6473 4,
6582 GOAWAY_PROTOCOL_ERROR, 6474 GOAWAY_PROTOCOL_ERROR,
6583 "New push stream id must be greater than the last accepted.")); 6475 "New push stream id must be greater than the last accepted."));
6584 MockWrite writes[] = { 6476 MockWrite writes[] = {
6585 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3), 6477 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3),
6586 }; 6478 };
6587 6479
6588 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 6480 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6589 NormalSpdyTransactionHelper helper( 6481 NormalSpdyTransactionHelper helper(
6590 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6482 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6591 helper.RunToCompletion(&data); 6483 helper.RunToCompletion(&data);
6592 TransactionHelperResult out = helper.output(); 6484 TransactionHelperResult out = helper.output();
6593 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 6485 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
6594 } 6486 }
6595 6487
6596 class SpdyNetworkTransactionNoTLSUsageCheckTest 6488 class SpdyNetworkTransactionNoTLSUsageCheckTest
6597 : public SpdyNetworkTransactionTest { 6489 : public SpdyNetworkTransactionTest {
6598 protected: 6490 protected:
6599 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { 6491 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
6600 // Construct the request. 6492 // Construct the request.
6601 scoped_ptr<SpdyFrame> req( 6493 scoped_ptr<SpdyFrame> req(
6602 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6494 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6603 MockWrite writes[] = {CreateMockWrite(*req)}; 6495 MockWrite writes[] = {CreateMockWrite(*req, 0)};
6604 6496
6605 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 6497 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
6606 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6498 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
6607 MockRead reads[] = { 6499 MockRead reads[] = {
6608 CreateMockRead(*resp), CreateMockRead(*body), 6500 CreateMockRead(*resp, 1),
6609 MockRead(ASYNC, 0, 0) // EOF 6501 CreateMockRead(*body, 2),
6502 MockRead(ASYNC, 0, 3) // EOF
6610 }; 6503 };
6611 6504
6612 DelayedSocketData data( 6505 SequencedSocketData data(reads, arraysize(reads), writes,
6613 1, reads, arraysize(reads), writes, arraysize(writes)); 6506 arraysize(writes));
6614 HttpRequestInfo request; 6507 HttpRequestInfo request;
6615 request.method = "GET"; 6508 request.method = "GET";
6616 request.url = GURL("https://www.example.org/"); 6509 request.url = GURL("https://www.example.org/");
6617 NormalSpdyTransactionHelper helper( 6510 NormalSpdyTransactionHelper helper(
6618 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6511 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6619 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); 6512 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass());
6620 TransactionHelperResult out = helper.output(); 6513 TransactionHelperResult out = helper.output();
6621 EXPECT_EQ(OK, out.rv); 6514 EXPECT_EQ(OK, out.rv);
6622 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 6515 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
6623 EXPECT_EQ("hello!", out.response_data); 6516 EXPECT_EQ("hello!", out.response_data);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6655 } 6548 }
6656 6549
6657 class SpdyNetworkTransactionTLSUsageCheckTest 6550 class SpdyNetworkTransactionTLSUsageCheckTest
6658 : public SpdyNetworkTransactionTest { 6551 : public SpdyNetworkTransactionTest {
6659 protected: 6552 protected:
6660 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { 6553 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
6661 scoped_ptr<SpdyFrame> goaway( 6554 scoped_ptr<SpdyFrame> goaway(
6662 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, "")); 6555 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, ""));
6663 MockWrite writes[] = {CreateMockWrite(*goaway)}; 6556 MockWrite writes[] = {CreateMockWrite(*goaway)};
6664 6557
6665 DelayedSocketData data(1, NULL, 0, writes, arraysize(writes)); 6558 StaticSocketDataProvider data(NULL, 0, writes, arraysize(writes));
6666 HttpRequestInfo request; 6559 HttpRequestInfo request;
6667 request.method = "GET"; 6560 request.method = "GET";
6668 request.url = GURL("https://www.example.org/"); 6561 request.url = GURL("https://www.example.org/");
6669 NormalSpdyTransactionHelper helper( 6562 NormalSpdyTransactionHelper helper(
6670 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6563 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6671 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); 6564 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass());
6672 TransactionHelperResult out = helper.output(); 6565 TransactionHelperResult out = helper.output();
6673 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv); 6566 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv);
6674 } 6567 }
6675 }; 6568 };
(...skipping 17 matching lines...) Expand all
6693 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { 6586 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) {
6694 scoped_ptr<SSLSocketDataProvider> ssl_provider( 6587 scoped_ptr<SSLSocketDataProvider> ssl_provider(
6695 new SSLSocketDataProvider(ASYNC, OK)); 6588 new SSLSocketDataProvider(ASYNC, OK));
6696 // Set to TLS_RSA_WITH_NULL_MD5 6589 // Set to TLS_RSA_WITH_NULL_MD5
6697 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); 6590 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
6698 6591
6699 RunTLSUsageCheckTest(ssl_provider.Pass()); 6592 RunTLSUsageCheckTest(ssl_provider.Pass());
6700 } 6593 }
6701 6594
6702 } // namespace net 6595 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/socket_test_util.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698