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

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

Issue 1114213005: Convert SpdyNetworkTransactionTest 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 | « no previous file | 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, 2),
2334 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause 2289 MockRead(ASYNC, ERR_IO_PENDING, 3), // 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), 4),
2337 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2292 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause
2338 MockRead(ASYNC, 0, 0, 6), // EOF 2293 MockRead(ASYNC, 0, 0, 6), // 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 OrderedSocketData data(reads, arraysize(reads),
2346 writes, arraysize(writes)); 2300 writes, arraysize(writes));
2347 DelayedSocketData data2(1, reads2, arraysize(reads2), 2301 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2348 writes2, arraysize(writes2)); 2302 arraysize(writes2));
2349 2303
2350 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2304 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2351 BoundNetLog(), GetParam(), NULL); 2305 BoundNetLog(), GetParam(), NULL);
2352 helper.RunPreTestSetup(); 2306 helper.RunPreTestSetup();
2353 helper.AddData(&data); 2307 helper.AddData(&data);
2354 helper.AddData(&data2); 2308 helper.AddData(&data2);
2355 HttpNetworkTransaction* trans = helper.trans(); 2309 HttpNetworkTransaction* trans = helper.trans();
2356 2310
2357 // Start the transaction with basic parameters. 2311 // Start the transaction with basic parameters.
2358 TestCompletionCallback callback; 2312 TestCompletionCallback callback;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2451 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2405 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2452 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2406 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true));
2453 MockWrite writes2[] = { 2407 MockWrite writes2[] = {
2454 CreateMockWrite(*req2, 1), 2408 CreateMockWrite(*req2, 1),
2455 }; 2409 };
2456 MockRead reads2[] = { 2410 MockRead reads2[] = {
2457 CreateMockRead(*resp2, 2), 2411 CreateMockRead(*resp2, 2),
2458 CreateMockRead(*body2, 3), 2412 CreateMockRead(*body2, 3),
2459 MockRead(ASYNC, 0, 0, 4) // EOF 2413 MockRead(ASYNC, 0, 0, 4) // EOF
2460 }; 2414 };
2461 OrderedSocketData data(reads, arraysize(reads), 2415 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2462 writes, arraysize(writes)); 2416 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2463 OrderedSocketData data2(reads2, arraysize(reads2), 2417 arraysize(writes2));
2464 writes2, arraysize(writes2));
2465 2418
2466 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN 2419 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN
2467 TestDelegate d; 2420 TestDelegate d;
2468 { 2421 {
2469 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol); 2422 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol);
2470 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest( 2423 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest(
2471 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d)); 2424 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d));
2472 spdy_url_request_context.socket_factory(). 2425 spdy_url_request_context.socket_factory().
2473 AddSocketDataProvider(&data); 2426 AddSocketDataProvider(&data);
2474 spdy_url_request_context.socket_factory(). 2427 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)); 2487 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2535 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2488 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true));
2536 MockWrite writes2[] = { 2489 MockWrite writes2[] = {
2537 CreateMockWrite(*req2, 1), 2490 CreateMockWrite(*req2, 1),
2538 }; 2491 };
2539 MockRead reads2[] = { 2492 MockRead reads2[] = {
2540 CreateMockRead(*resp2, 2), 2493 CreateMockRead(*resp2, 2),
2541 CreateMockRead(*body2, 3), 2494 CreateMockRead(*body2, 3),
2542 MockRead(ASYNC, 0, 0, 5) // EOF 2495 MockRead(ASYNC, 0, 0, 5) // EOF
2543 }; 2496 };
2544 OrderedSocketData data(reads, arraysize(reads), 2497 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2545 writes, arraysize(writes)); 2498 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2546 OrderedSocketData data2(reads2, arraysize(reads2), 2499 arraysize(writes2));
2547 writes2, arraysize(writes2));
2548 2500
2549 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN 2501 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN
2550 TestDelegate d; 2502 TestDelegate d;
2551 TestDelegate d2; 2503 TestDelegate d2;
2552 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol); 2504 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol);
2553 { 2505 {
2554 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest( 2506 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest(
2555 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d)); 2507 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d));
2556 spdy_url_request_context.socket_factory(). 2508 spdy_url_request_context.socket_factory().
2557 AddSocketDataProvider(&data); 2509 AddSocketDataProvider(&data);
(...skipping 16 matching lines...) Expand all
2574 EXPECT_EQ(1, d2.received_redirect_count()); 2526 EXPECT_EQ(1, d2.received_redirect_count());
2575 2527
2576 r2->FollowDeferredRedirect(); 2528 r2->FollowDeferredRedirect();
2577 base::RunLoop().Run(); 2529 base::RunLoop().Run();
2578 EXPECT_EQ(1, d2.response_started_count()); 2530 EXPECT_EQ(1, d2.response_started_count());
2579 EXPECT_FALSE(d2.received_data_before_response()); 2531 EXPECT_FALSE(d2.received_data_before_response());
2580 EXPECT_EQ(URLRequestStatus::SUCCESS, r2->status().status()); 2532 EXPECT_EQ(URLRequestStatus::SUCCESS, r2->status().status());
2581 std::string contents2("hello!"); 2533 std::string contents2("hello!");
2582 EXPECT_EQ(contents2, d2.data_received()); 2534 EXPECT_EQ(contents2, d2.data_received());
2583 } 2535 }
2584 data.CompleteRead(); 2536 EXPECT_TRUE(data.AllReadDataConsumed());
2585 data2.CompleteRead(); 2537 EXPECT_TRUE(data.AllWriteDataConsumed());
2586 EXPECT_TRUE(data.at_read_eof()); 2538 EXPECT_TRUE(data2.AllReadDataConsumed());
2587 EXPECT_TRUE(data.at_write_eof()); 2539 EXPECT_TRUE(data2.AllWriteDataConsumed());
2588 EXPECT_TRUE(data2.at_read_eof());
2589 EXPECT_TRUE(data2.at_write_eof());
2590 } 2540 }
2591 2541
2592 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { 2542 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) {
2593 scoped_ptr<SpdyFrame> stream1_syn( 2543 scoped_ptr<SpdyFrame> stream1_syn(
2594 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2544 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2595 scoped_ptr<SpdyFrame> stream1_body( 2545 scoped_ptr<SpdyFrame> stream1_body(
2596 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2546 spdy_util_.ConstructSpdyBodyFrame(1, true));
2597 MockWrite writes[] = { 2547 MockWrite writes[] = {
2598 CreateMockWrite(*stream1_syn, 1), 2548 CreateMockWrite(*stream1_syn, 0),
2599 }; 2549 };
2600 2550
2601 scoped_ptr<SpdyFrame> 2551 scoped_ptr<SpdyFrame>
2602 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2552 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2603 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2553 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2604 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2554 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2605 const char kPushedData[] = "pushed"; 2555 const char kPushedData[] = "pushed";
2606 scoped_ptr<SpdyFrame> stream2_body( 2556 scoped_ptr<SpdyFrame> stream2_body(
2607 spdy_util_.ConstructSpdyBodyFrame( 2557 spdy_util_.ConstructSpdyBodyFrame(
2608 2, kPushedData, strlen(kPushedData), true)); 2558 2, kPushedData, strlen(kPushedData), true));
2609 MockRead reads[] = { 2559 MockRead reads[] = {
2610 CreateMockRead(*stream1_reply, 2), 2560 CreateMockRead(*stream1_reply, 1),
2611 CreateMockRead(*stream2_syn, 3), 2561 CreateMockRead(*stream2_syn, 2),
2612 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 2562 CreateMockRead(*stream1_body, 3, SYNCHRONOUS),
2613 CreateMockRead(*stream2_body, 5), 2563 CreateMockRead(*stream2_body, 4),
2614 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2564 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2615 }; 2565 };
2616 2566
2617 HttpResponseInfo response; 2567 HttpResponseInfo response;
2618 HttpResponseInfo response2; 2568 HttpResponseInfo response2;
2619 std::string expected_push_result("pushed"); 2569 std::string expected_push_result("pushed");
2620 OrderedSocketData data(reads, arraysize(reads), 2570 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2621 writes, arraysize(writes));
2622 RunServerPushTest(&data, 2571 RunServerPushTest(&data,
2623 &response, 2572 &response,
2624 &response2, 2573 &response2,
2625 expected_push_result); 2574 expected_push_result);
2626 2575
2627 // Verify the SYN_REPLY. 2576 // Verify the SYN_REPLY.
2628 EXPECT_TRUE(response.headers.get() != NULL); 2577 EXPECT_TRUE(response.headers.get() != NULL);
2629 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2578 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2630 2579
2631 // Verify the pushed stream. 2580 // Verify the pushed stream.
2632 EXPECT_TRUE(response2.headers.get() != NULL); 2581 EXPECT_TRUE(response2.headers.get() != NULL);
2633 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2582 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2634 } 2583 }
2635 2584
2636 TEST_P(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) { 2585 TEST_P(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) {
2637 scoped_ptr<SpdyFrame> stream1_syn( 2586 scoped_ptr<SpdyFrame> stream1_syn(
2638 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2587 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2639 scoped_ptr<SpdyFrame> stream1_body( 2588 scoped_ptr<SpdyFrame> stream1_body(
2640 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2589 spdy_util_.ConstructSpdyBodyFrame(1, true));
2641 MockWrite writes[] = { 2590 MockWrite writes[] = {
2642 CreateMockWrite(*stream1_syn, 1), 2591 CreateMockWrite(*stream1_syn, 0),
2643 }; 2592 };
2644 2593
2645 scoped_ptr<SpdyFrame> 2594 scoped_ptr<SpdyFrame>
2646 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2595 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2647 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2596 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2648 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2597 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2649 const char kPushedData[] = "pushed"; 2598 const char kPushedData[] = "pushed";
2650 scoped_ptr<SpdyFrame> stream2_body( 2599 scoped_ptr<SpdyFrame> stream2_body(
2651 spdy_util_.ConstructSpdyBodyFrame( 2600 spdy_util_.ConstructSpdyBodyFrame(
2652 2, kPushedData, strlen(kPushedData), true)); 2601 2, kPushedData, strlen(kPushedData), true));
2653 MockRead reads[] = { 2602 MockRead reads[] = {
2654 CreateMockRead(*stream2_syn, 2), 2603 CreateMockRead(*stream2_syn, 1),
2655 CreateMockRead(*stream1_reply, 3), 2604 CreateMockRead(*stream1_reply, 2),
2656 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 2605 CreateMockRead(*stream1_body, 3, SYNCHRONOUS),
2657 CreateMockRead(*stream2_body, 5), 2606 CreateMockRead(*stream2_body, 4),
2658 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2607 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2659 }; 2608 };
2660 2609
2661 HttpResponseInfo response; 2610 HttpResponseInfo response;
2662 HttpResponseInfo response2; 2611 HttpResponseInfo response2;
2663 std::string expected_push_result("pushed"); 2612 std::string expected_push_result("pushed");
2664 OrderedSocketData data(reads, arraysize(reads), 2613 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2665 writes, arraysize(writes));
2666 RunServerPushTest(&data, 2614 RunServerPushTest(&data,
2667 &response, 2615 &response,
2668 &response2, 2616 &response2,
2669 expected_push_result); 2617 expected_push_result);
2670 2618
2671 // Verify the SYN_REPLY. 2619 // Verify the SYN_REPLY.
2672 EXPECT_TRUE(response.headers.get() != NULL); 2620 EXPECT_TRUE(response.headers.get() != NULL);
2673 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2621 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2674 2622
2675 // Verify the pushed stream. 2623 // Verify the pushed stream.
2676 EXPECT_TRUE(response2.headers.get() != NULL); 2624 EXPECT_TRUE(response2.headers.get() != NULL);
2677 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2625 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2678 } 2626 }
2679 2627
2680 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) { 2628 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) {
2681 scoped_ptr<SpdyFrame> stream1_syn( 2629 scoped_ptr<SpdyFrame> stream1_syn(
2682 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2630 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2683 MockWrite writes[] = { CreateMockWrite(*stream1_syn, 1), }; 2631 MockWrite writes[] = {
2632 CreateMockWrite(*stream1_syn, 0),
2633 };
2684 2634
2685 scoped_ptr<SpdyFrame> 2635 scoped_ptr<SpdyFrame>
2686 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2636 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2687 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2637 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2688 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2638 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2689 const char kPushedData[] = "pushed"; 2639 const char kPushedData[] = "pushed";
2690 scoped_ptr<SpdyFrame> stream2_body( 2640 scoped_ptr<SpdyFrame> stream2_body(
2691 spdy_util_.ConstructSpdyBodyFrame( 2641 spdy_util_.ConstructSpdyBodyFrame(
2692 2, kPushedData, strlen(kPushedData), true)); 2642 2, kPushedData, strlen(kPushedData), true));
2693 scoped_ptr<SpdyFrame> 2643 scoped_ptr<SpdyFrame>
2694 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2644 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2695 MockRead reads[] = { 2645 MockRead reads[] = {
2696 CreateMockRead(*stream1_reply, 2), 2646 CreateMockRead(*stream1_reply, 1),
2697 CreateMockRead(*stream2_syn, 3), 2647 CreateMockRead(*stream2_syn, 2),
2698 CreateMockRead(*stream2_body, 4), 2648 CreateMockRead(*stream2_body, 3),
2699 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 2649 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
2700 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2650 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2701 }; 2651 };
2702 2652
2703 HttpResponseInfo response; 2653 HttpResponseInfo response;
2704 HttpResponseInfo response2; 2654 HttpResponseInfo response2;
2705 std::string expected_push_result("pushed"); 2655 std::string expected_push_result("pushed");
2706 OrderedSocketData data(reads, arraysize(reads), 2656 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2707 writes, arraysize(writes));
2708 RunServerPushTest(&data, 2657 RunServerPushTest(&data,
2709 &response, 2658 &response,
2710 &response2, 2659 &response2,
2711 expected_push_result); 2660 expected_push_result);
2712 2661
2713 // Verify the SYN_REPLY. 2662 // Verify the SYN_REPLY.
2714 EXPECT_TRUE(response.headers.get() != NULL); 2663 EXPECT_TRUE(response.headers.get() != NULL);
2715 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2664 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2716 2665
2717 // Verify the pushed stream. 2666 // Verify the pushed stream.
2718 EXPECT_TRUE(response2.headers.get() != NULL); 2667 EXPECT_TRUE(response2.headers.get() != NULL);
2719 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2668 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2720 } 2669 }
2721 2670
2722 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) { 2671 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) {
2723 scoped_ptr<SpdyFrame> stream1_syn( 2672 scoped_ptr<SpdyFrame> stream1_syn(
2724 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2673 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2725 scoped_ptr<SpdyFrame> stream1_body( 2674 scoped_ptr<SpdyFrame> stream1_body(
2726 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2675 spdy_util_.ConstructSpdyBodyFrame(1, true));
2727 MockWrite writes[] = { 2676 MockWrite writes[] = {
2728 CreateMockWrite(*stream1_syn, 1), 2677 CreateMockWrite(*stream1_syn, 0),
2729 }; 2678 };
2730 2679
2731 scoped_ptr<SpdyFrame> 2680 scoped_ptr<SpdyFrame>
2732 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2681 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2733 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2682 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2734 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2683 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2735 scoped_ptr<SpdyFrame> stream2_rst( 2684 scoped_ptr<SpdyFrame> stream2_rst(
2736 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2685 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2737 MockRead reads[] = { 2686 MockRead reads[] = {
2738 CreateMockRead(*stream1_reply, 2), 2687 CreateMockRead(*stream1_reply, 1),
2739 CreateMockRead(*stream2_syn, 3), 2688 CreateMockRead(*stream2_syn, 2),
2740 CreateMockRead(*stream2_rst, 4), 2689 CreateMockRead(*stream2_rst, 3),
2741 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 2690 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
2742 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2691 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2743 }; 2692 };
2744 2693
2745 OrderedSocketData data(reads, arraysize(reads), 2694 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2746 writes, arraysize(writes));
2747 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2695 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2748 BoundNetLog(), GetParam(), NULL); 2696 BoundNetLog(), GetParam(), NULL);
2749 2697
2750 helper.RunPreTestSetup(); 2698 helper.RunPreTestSetup();
2751 helper.AddData(&data); 2699 helper.AddData(&data);
2752 2700
2753 HttpNetworkTransaction* trans = helper.trans(); 2701 HttpNetworkTransaction* trans = helper.trans();
2754 2702
2755 // Start the transaction with basic parameters. 2703 // Start the transaction with basic parameters.
2756 TestCompletionCallback callback; 2704 TestCompletionCallback callback;
2757 int rv = trans->Start( 2705 int rv = trans->Start(
2758 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2706 &CreateGetRequest(), callback.callback(), BoundNetLog());
2759 EXPECT_EQ(ERR_IO_PENDING, rv); 2707 EXPECT_EQ(ERR_IO_PENDING, rv);
2760 rv = callback.WaitForResult(); 2708 rv = callback.WaitForResult();
2761 EXPECT_EQ(OK, rv); 2709 EXPECT_EQ(OK, rv);
2762 2710
2763 // Verify that we consumed all test data. 2711 // Verify that we consumed all test data.
2764 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 2712 EXPECT_TRUE(data.AllReadDataConsumed());
2765 << data.read_count() 2713 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 2714
2773 // Verify the SYN_REPLY. 2715 // Verify the SYN_REPLY.
2774 HttpResponseInfo response = *trans->GetResponseInfo(); 2716 HttpResponseInfo response = *trans->GetResponseInfo();
2775 EXPECT_TRUE(response.headers.get() != NULL); 2717 EXPECT_TRUE(response.headers.get() != NULL);
2776 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2718 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2777 } 2719 }
2778 2720
2779 // Verify that we don't leak streams and that we properly send a reset 2721 // Verify that we don't leak streams and that we properly send a reset
2780 // if the server pushes the same stream twice. 2722 // if the server pushes the same stream twice.
2781 TEST_P(SpdyNetworkTransactionTest, ServerPushDuplicate) { 2723 TEST_P(SpdyNetworkTransactionTest, ServerPushDuplicate) {
2782 scoped_ptr<SpdyFrame> stream1_syn( 2724 scoped_ptr<SpdyFrame> stream1_syn(
2783 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2725 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2784 scoped_ptr<SpdyFrame> stream1_body( 2726 scoped_ptr<SpdyFrame> stream1_body(
2785 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2727 spdy_util_.ConstructSpdyBodyFrame(1, true));
2786 scoped_ptr<SpdyFrame> stream3_rst( 2728 scoped_ptr<SpdyFrame> stream3_rst(
2787 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR)); 2729 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR));
2788 MockWrite writes[] = { 2730 MockWrite writes[] = {
2789 CreateMockWrite(*stream1_syn, 1), 2731 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream3_rst, 4),
2790 CreateMockWrite(*stream3_rst, 5),
2791 }; 2732 };
2792 2733
2793 scoped_ptr<SpdyFrame> 2734 scoped_ptr<SpdyFrame>
2794 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2735 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2795 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2736 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2796 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2737 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2797 const char kPushedData[] = "pushed"; 2738 const char kPushedData[] = "pushed";
2798 scoped_ptr<SpdyFrame> stream2_body( 2739 scoped_ptr<SpdyFrame> stream2_body(
2799 spdy_util_.ConstructSpdyBodyFrame( 2740 spdy_util_.ConstructSpdyBodyFrame(
2800 2, kPushedData, strlen(kPushedData), true)); 2741 2, kPushedData, strlen(kPushedData), true));
2801 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush( 2742 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush(
2802 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2743 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2803 MockRead reads[] = { 2744 MockRead reads[] = {
2804 CreateMockRead(*stream1_reply, 2), 2745 CreateMockRead(*stream1_reply, 1),
2805 CreateMockRead(*stream2_syn, 3), 2746 CreateMockRead(*stream2_syn, 2),
2806 CreateMockRead(*stream3_syn, 4), 2747 CreateMockRead(*stream3_syn, 3),
2807 CreateMockRead(*stream1_body, 6, SYNCHRONOUS), 2748 CreateMockRead(*stream1_body, 5),
2808 CreateMockRead(*stream2_body, 7), 2749 CreateMockRead(*stream2_body, 6),
2809 MockRead(ASYNC, ERR_IO_PENDING, 8), // Force a pause 2750 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause
2810 }; 2751 };
2811 2752
2812 HttpResponseInfo response; 2753 HttpResponseInfo response;
2813 HttpResponseInfo response2; 2754 HttpResponseInfo response2;
2814 std::string expected_push_result("pushed"); 2755 std::string expected_push_result("pushed");
2815 OrderedSocketData data(reads, arraysize(reads), 2756 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2816 writes, arraysize(writes));
2817 RunServerPushTest(&data, 2757 RunServerPushTest(&data,
2818 &response, 2758 &response,
2819 &response2, 2759 &response2,
2820 expected_push_result); 2760 expected_push_result);
2821 2761
2822 // Verify the SYN_REPLY. 2762 // Verify the SYN_REPLY.
2823 EXPECT_TRUE(response.headers.get() != NULL); 2763 EXPECT_TRUE(response.headers.get() != NULL);
2824 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2764 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2825 2765
2826 // Verify the pushed stream. 2766 // Verify the pushed stream.
2827 EXPECT_TRUE(response2.headers.get() != NULL); 2767 EXPECT_TRUE(response2.headers.get() != NULL);
2828 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2768 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2829 } 2769 }
2830 2770
2831 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { 2771 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) {
2832 scoped_ptr<SpdyFrame> stream1_syn( 2772 scoped_ptr<SpdyFrame> stream1_syn(
2833 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2773 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2834 scoped_ptr<SpdyFrame> stream1_body( 2774 scoped_ptr<SpdyFrame> stream1_body(
2835 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2775 spdy_util_.ConstructSpdyBodyFrame(1, true));
2836 MockWrite writes[] = { 2776 MockWrite writes[] = {
2837 CreateMockWrite(*stream1_syn, 1), 2777 CreateMockWrite(*stream1_syn, 0),
2838 }; 2778 };
2839 2779
2840 scoped_ptr<SpdyFrame> 2780 scoped_ptr<SpdyFrame>
2841 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2781 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2842 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2782 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2843 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2783 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2844 static const char kPushedData[] = "pushed my darling hello my baby"; 2784 static const char kPushedData[] = "pushed my darling hello my baby";
2845 scoped_ptr<SpdyFrame> stream2_body_base( 2785 scoped_ptr<SpdyFrame> stream2_body_base(
2846 spdy_util_.ConstructSpdyBodyFrame( 2786 spdy_util_.ConstructSpdyBodyFrame(
2847 2, kPushedData, strlen(kPushedData), true)); 2787 2, kPushedData, strlen(kPushedData), true));
2848 const size_t kChunkSize = strlen(kPushedData) / 4; 2788 const size_t kChunkSize = strlen(kPushedData) / 4;
2849 scoped_ptr<SpdyFrame> stream2_body1( 2789 scoped_ptr<SpdyFrame> stream2_body1(
2850 new SpdyFrame(stream2_body_base->data(), kChunkSize, false)); 2790 new SpdyFrame(stream2_body_base->data(), kChunkSize, false));
2851 scoped_ptr<SpdyFrame> stream2_body2( 2791 scoped_ptr<SpdyFrame> stream2_body2(
2852 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false)); 2792 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false));
2853 scoped_ptr<SpdyFrame> stream2_body3( 2793 scoped_ptr<SpdyFrame> stream2_body3(
2854 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize, 2794 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize,
2855 kChunkSize, false)); 2795 kChunkSize, false));
2856 scoped_ptr<SpdyFrame> stream2_body4( 2796 scoped_ptr<SpdyFrame> stream2_body4(
2857 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize, 2797 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize,
2858 stream2_body_base->size() - 3 * kChunkSize, false)); 2798 stream2_body_base->size() - 3 * kChunkSize, false));
2859 MockRead reads[] = { 2799 MockRead reads[] = {
2860 CreateMockRead(*stream1_reply, 2), 2800 CreateMockRead(*stream1_reply, 1),
2861 CreateMockRead(*stream2_syn, 3), 2801 CreateMockRead(*stream2_syn, 2),
2862 CreateMockRead(*stream2_body1, 4), 2802 CreateMockRead(*stream2_body1, 3),
2863 CreateMockRead(*stream2_body2, 5), 2803 CreateMockRead(*stream2_body2, 4),
2864 CreateMockRead(*stream2_body3, 6), 2804 CreateMockRead(*stream2_body3, 5),
2865 CreateMockRead(*stream2_body4, 7), 2805 CreateMockRead(*stream2_body4, 6),
2866 CreateMockRead(*stream1_body, 8, SYNCHRONOUS), 2806 CreateMockRead(*stream1_body, 7, SYNCHRONOUS),
2867 MockRead(ASYNC, ERR_IO_PENDING, 9), // Force a pause 2807 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause
2868 }; 2808 };
2869 2809
2870 HttpResponseInfo response; 2810 HttpResponseInfo response;
2871 HttpResponseInfo response2; 2811 HttpResponseInfo response2;
2872 std::string expected_push_result("pushed my darling hello my baby"); 2812 std::string expected_push_result("pushed my darling hello my baby");
2873 OrderedSocketData data(reads, arraysize(reads), 2813 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2874 writes, arraysize(writes));
2875 RunServerPushTest(&data, &response, &response2, kPushedData); 2814 RunServerPushTest(&data, &response, &response2, kPushedData);
2876 2815
2877 // Verify the SYN_REPLY. 2816 // Verify the SYN_REPLY.
2878 EXPECT_TRUE(response.headers.get() != NULL); 2817 EXPECT_TRUE(response.headers.get() != NULL);
2879 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2818 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2880 2819
2881 // Verify the pushed stream. 2820 // Verify the pushed stream.
2882 EXPECT_TRUE(response2.headers.get() != NULL); 2821 EXPECT_TRUE(response2.headers.get() != NULL);
2883 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2822 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2884 } 2823 }
2885 2824
2886 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { 2825 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
2887 scoped_ptr<SpdyFrame> stream1_syn( 2826 scoped_ptr<SpdyFrame> stream1_syn(
2888 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2827 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2889 scoped_ptr<SpdyFrame> stream1_body( 2828 scoped_ptr<SpdyFrame> stream1_body(
2890 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2829 spdy_util_.ConstructSpdyBodyFrame(1, true));
2891 MockWrite writes[] = { 2830 MockWrite writes[] = {
2892 CreateMockWrite(*stream1_syn, 1), 2831 CreateMockWrite(*stream1_syn, 0),
2893 }; 2832 };
2894 2833
2895 scoped_ptr<SpdyFrame> 2834 scoped_ptr<SpdyFrame>
2896 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2835 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2897 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2836 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2898 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2837 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2899 static const char kPushedData[] = "pushed my darling hello my baby"; 2838 static const char kPushedData[] = "pushed my darling hello my baby";
2900 scoped_ptr<SpdyFrame> stream2_body_base( 2839 scoped_ptr<SpdyFrame> stream2_body_base(
2901 spdy_util_.ConstructSpdyBodyFrame( 2840 spdy_util_.ConstructSpdyBodyFrame(
2902 2, kPushedData, strlen(kPushedData), true)); 2841 2, kPushedData, strlen(kPushedData), true));
2903 const size_t kChunkSize = strlen(kPushedData) / 4; 2842 const size_t kChunkSize = strlen(kPushedData) / 4;
2904 scoped_ptr<SpdyFrame> stream2_body1( 2843 scoped_ptr<SpdyFrame> stream2_body1(
2905 new SpdyFrame(stream2_body_base->data(), kChunkSize, false)); 2844 new SpdyFrame(stream2_body_base->data(), kChunkSize, false));
2906 scoped_ptr<SpdyFrame> stream2_body2( 2845 scoped_ptr<SpdyFrame> stream2_body2(
2907 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false)); 2846 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false));
2908 scoped_ptr<SpdyFrame> stream2_body3( 2847 scoped_ptr<SpdyFrame> stream2_body3(
2909 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize, 2848 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize,
2910 kChunkSize, false)); 2849 kChunkSize, false));
2911 scoped_ptr<SpdyFrame> stream2_body4( 2850 scoped_ptr<SpdyFrame> stream2_body4(
2912 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize, 2851 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize,
2913 stream2_body_base->size() - 3 * kChunkSize, false)); 2852 stream2_body_base->size() - 3 * kChunkSize, false));
2914 MockRead reads[] = { 2853 MockRead reads[] = {
2915 CreateMockRead(*stream1_reply, 2), 2854 CreateMockRead(*stream1_reply, 1),
2916 CreateMockRead(*stream2_syn, 3), 2855 CreateMockRead(*stream2_syn, 2),
2917 CreateMockRead(*stream2_body1, 4), 2856 CreateMockRead(*stream2_body1, 3),
2918 CreateMockRead(*stream2_body2, 5), 2857 CreateMockRead(*stream2_body2, 4),
2919 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2858 CreateMockRead(*stream2_body3, 5),
2920 CreateMockRead(*stream2_body3, 7), 2859 CreateMockRead(*stream2_body4, 6),
2921 CreateMockRead(*stream2_body4, 8), 2860 CreateMockRead(*stream1_body.get(), 7, SYNCHRONOUS),
2922 CreateMockRead(*stream1_body.get(), 9, SYNCHRONOUS), 2861 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause.
2923 MockRead(ASYNC, ERR_IO_PENDING, 10) // Force a pause.
2924 }; 2862 };
2925 2863
2926 HttpResponseInfo response; 2864 HttpResponseInfo response;
2927 HttpResponseInfo response2; 2865 HttpResponseInfo response2;
2928 OrderedSocketData data(reads, arraysize(reads), 2866 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2929 writes, arraysize(writes));
2930 RunServerPushTest(&data, &response, &response2, kPushedData); 2867 RunServerPushTest(&data, &response, &response2, kPushedData);
2931 2868
2932 // Verify the SYN_REPLY. 2869 // Verify the SYN_REPLY.
2933 EXPECT_TRUE(response.headers.get() != NULL); 2870 EXPECT_TRUE(response.headers.get() != NULL);
2934 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2871 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2935 2872
2936 // Verify the pushed stream. 2873 // Verify the pushed stream.
2937 EXPECT_TRUE(response2.headers.get() != NULL); 2874 EXPECT_TRUE(response2.headers.get() != NULL);
2938 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2875 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2939 } 2876 }
2940 2877
2941 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { 2878 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
2942 if (spdy_util_.spdy_version() == SPDY4) { 2879 if (spdy_util_.spdy_version() == SPDY4) {
2943 // PUSH_PROMISE with stream id 0 is connection-level error. 2880 // PUSH_PROMISE with stream id 0 is connection-level error.
2944 // TODO(baranovich): Test session going away. 2881 // TODO(baranovich): Test session going away.
2945 return; 2882 return;
2946 } 2883 }
2947 2884
2948 scoped_ptr<SpdyFrame> stream1_syn( 2885 scoped_ptr<SpdyFrame> stream1_syn(
2949 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2886 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2950 scoped_ptr<SpdyFrame> stream1_body( 2887 scoped_ptr<SpdyFrame> stream1_body(
2951 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2888 spdy_util_.ConstructSpdyBodyFrame(1, true));
2952 scoped_ptr<SpdyFrame> stream2_rst( 2889 scoped_ptr<SpdyFrame> stream2_rst(
2953 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 2890 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
2954 MockWrite writes[] = { 2891 MockWrite writes[] = {
2955 CreateMockWrite(*stream1_syn, 1), 2892 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
2956 CreateMockWrite(*stream2_rst, 4),
2957 }; 2893 };
2958 2894
2959 scoped_ptr<SpdyFrame> 2895 scoped_ptr<SpdyFrame>
2960 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2896 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2961 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2897 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2962 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); 2898 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str()));
2963 MockRead reads[] = { 2899 MockRead reads[] = {
2964 CreateMockRead(*stream1_reply, 2), 2900 CreateMockRead(*stream1_reply, 1),
2965 CreateMockRead(*stream2_syn, 3), 2901 CreateMockRead(*stream2_syn, 2),
2966 CreateMockRead(*stream1_body, 4), 2902 CreateMockRead(*stream1_body, 4),
2967 MockRead(ASYNC, ERR_IO_PENDING, 5) // Force a pause 2903 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
2968 }; 2904 };
2969 2905
2970 OrderedSocketData data(reads, arraysize(reads), 2906 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2971 writes, arraysize(writes));
2972 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2907 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2973 BoundNetLog(), GetParam(), NULL); 2908 BoundNetLog(), GetParam(), NULL);
2974 2909
2975 helper.RunPreTestSetup(); 2910 helper.RunPreTestSetup();
2976 helper.AddData(&data); 2911 helper.AddData(&data);
2977 2912
2978 HttpNetworkTransaction* trans = helper.trans(); 2913 HttpNetworkTransaction* trans = helper.trans();
2979 2914
2980 // Start the transaction with basic parameters. 2915 // Start the transaction with basic parameters.
2981 TestCompletionCallback callback; 2916 TestCompletionCallback callback;
2982 int rv = trans->Start( 2917 int rv = trans->Start(
2983 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2918 &CreateGetRequest(), callback.callback(), BoundNetLog());
2984 EXPECT_EQ(ERR_IO_PENDING, rv); 2919 EXPECT_EQ(ERR_IO_PENDING, rv);
2985 rv = callback.WaitForResult(); 2920 rv = callback.WaitForResult();
2986 EXPECT_EQ(OK, rv); 2921 EXPECT_EQ(OK, rv);
2987 2922
2988 // Verify that we consumed all test data. 2923 // Verify that we consumed all test data.
2989 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 2924 EXPECT_TRUE(data.AllReadDataConsumed());
2990 << data.read_count() 2925 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 2926
2998 // Verify the SYN_REPLY. 2927 // Verify the SYN_REPLY.
2999 HttpResponseInfo response = *trans->GetResponseInfo(); 2928 HttpResponseInfo response = *trans->GetResponseInfo();
3000 EXPECT_TRUE(response.headers.get() != NULL); 2929 EXPECT_TRUE(response.headers.get() != NULL);
3001 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2930 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
3002 } 2931 }
3003 2932
3004 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { 2933 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
3005 scoped_ptr<SpdyFrame> stream1_syn( 2934 scoped_ptr<SpdyFrame> stream1_syn(
3006 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2935 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3007 scoped_ptr<SpdyFrame> stream1_body( 2936 scoped_ptr<SpdyFrame> stream1_body(
3008 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2937 spdy_util_.ConstructSpdyBodyFrame(1, true));
3009 scoped_ptr<SpdyFrame> stream2_rst( 2938 scoped_ptr<SpdyFrame> stream2_rst(
3010 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); 2939 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM));
3011 MockWrite writes[] = { 2940 MockWrite writes[] = {
3012 CreateMockWrite(*stream1_syn, 1), 2941 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
3013 CreateMockWrite(*stream2_rst, 4),
3014 }; 2942 };
3015 2943
3016 scoped_ptr<SpdyFrame> 2944 scoped_ptr<SpdyFrame>
3017 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2945 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3018 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2946 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
3019 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); 2947 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str()));
3020 MockRead reads[] = { 2948 MockRead reads[] = {
3021 CreateMockRead(*stream1_reply, 2), 2949 CreateMockRead(*stream1_reply, 1),
3022 CreateMockRead(*stream2_syn, 3), 2950 CreateMockRead(*stream2_syn, 2),
3023 CreateMockRead(*stream1_body, 4), 2951 CreateMockRead(*stream1_body, 4),
3024 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2952 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
3025 }; 2953 };
3026 2954
3027 OrderedSocketData data(reads, arraysize(reads), 2955 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3028 writes, arraysize(writes));
3029 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2956 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3030 BoundNetLog(), GetParam(), NULL); 2957 BoundNetLog(), GetParam(), NULL);
3031 2958
3032 helper.RunPreTestSetup(); 2959 helper.RunPreTestSetup();
3033 helper.AddData(&data); 2960 helper.AddData(&data);
3034 2961
3035 HttpNetworkTransaction* trans = helper.trans(); 2962 HttpNetworkTransaction* trans = helper.trans();
3036 2963
3037 // Start the transaction with basic parameters. 2964 // Start the transaction with basic parameters.
3038 TestCompletionCallback callback; 2965 TestCompletionCallback callback;
3039 int rv = trans->Start( 2966 int rv = trans->Start(
3040 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2967 &CreateGetRequest(), callback.callback(), BoundNetLog());
3041 EXPECT_EQ(ERR_IO_PENDING, rv); 2968 EXPECT_EQ(ERR_IO_PENDING, rv);
3042 rv = callback.WaitForResult(); 2969 rv = callback.WaitForResult();
3043 EXPECT_EQ(OK, rv); 2970 EXPECT_EQ(OK, rv);
3044 2971
3045 // Verify that we consumed all test data. 2972 // Verify that we consumed all test data.
3046 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 2973 EXPECT_TRUE(data.AllReadDataConsumed());
3047 << data.read_count() 2974 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 2975
3055 // Verify the SYN_REPLY. 2976 // Verify the SYN_REPLY.
3056 HttpResponseInfo response = *trans->GetResponseInfo(); 2977 HttpResponseInfo response = *trans->GetResponseInfo();
3057 EXPECT_TRUE(response.headers.get() != NULL); 2978 EXPECT_TRUE(response.headers.get() != NULL);
3058 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2979 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
3059 } 2980 }
3060 2981
3061 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) { 2982 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) {
3062 scoped_ptr<SpdyFrame> stream1_syn( 2983 scoped_ptr<SpdyFrame> stream1_syn(
3063 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2984 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3064 scoped_ptr<SpdyFrame> stream1_body( 2985 scoped_ptr<SpdyFrame> stream1_body(
3065 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2986 spdy_util_.ConstructSpdyBodyFrame(1, true));
3066 scoped_ptr<SpdyFrame> stream2_rst( 2987 scoped_ptr<SpdyFrame> stream2_rst(
3067 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2988 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
3068 MockWrite writes[] = { 2989 MockWrite writes[] = {
3069 CreateMockWrite(*stream1_syn, 1), 2990 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
3070 CreateMockWrite(*stream2_rst, 4),
3071 }; 2991 };
3072 2992
3073 scoped_ptr<SpdyFrame> 2993 scoped_ptr<SpdyFrame>
3074 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2994 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3075 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock()); 2995 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock());
3076 (*incomplete_headers)["hello"] = "bye"; 2996 (*incomplete_headers)["hello"] = "bye";
3077 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK"; 2997 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK";
3078 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 2998 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
3079 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 2999 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
3080 incomplete_headers.Pass(), 2, 1)); 3000 incomplete_headers.Pass(), 2, 1));
3081 MockRead reads[] = { 3001 MockRead reads[] = {
3082 CreateMockRead(*stream1_reply, 2), 3002 CreateMockRead(*stream1_reply, 1),
3083 CreateMockRead(*stream2_syn, 3), 3003 CreateMockRead(*stream2_syn, 2),
3084 CreateMockRead(*stream1_body, 4), 3004 CreateMockRead(*stream1_body, 4),
3085 MockRead(ASYNC, ERR_IO_PENDING, 5) // Force a pause 3005 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
3086 }; 3006 };
3087 3007
3088 OrderedSocketData data(reads, arraysize(reads), 3008 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3089 writes, arraysize(writes));
3090 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3009 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3091 BoundNetLog(), GetParam(), NULL); 3010 BoundNetLog(), GetParam(), NULL);
3092 3011
3093 helper.RunPreTestSetup(); 3012 helper.RunPreTestSetup();
3094 helper.AddData(&data); 3013 helper.AddData(&data);
3095 3014
3096 HttpNetworkTransaction* trans = helper.trans(); 3015 HttpNetworkTransaction* trans = helper.trans();
3097 3016
3098 // Start the transaction with basic parameters. 3017 // Start the transaction with basic parameters.
3099 TestCompletionCallback callback; 3018 TestCompletionCallback callback;
3100 int rv = trans->Start( 3019 int rv = trans->Start(
3101 &CreateGetRequest(), callback.callback(), BoundNetLog()); 3020 &CreateGetRequest(), callback.callback(), BoundNetLog());
3102 EXPECT_EQ(ERR_IO_PENDING, rv); 3021 EXPECT_EQ(ERR_IO_PENDING, rv);
3103 rv = callback.WaitForResult(); 3022 rv = callback.WaitForResult();
3104 EXPECT_EQ(OK, rv); 3023 EXPECT_EQ(OK, rv);
3024
3105 // Verify that we consumed all test data. 3025 // Verify that we consumed all test data.
3106 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 3026 EXPECT_TRUE(data.AllReadDataConsumed());
3107 << data.read_count() 3027 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 3028
3115 // Verify the SYN_REPLY. 3029 // Verify the SYN_REPLY.
3116 HttpResponseInfo response = *trans->GetResponseInfo(); 3030 HttpResponseInfo response = *trans->GetResponseInfo();
3117 EXPECT_TRUE(response.headers.get() != NULL); 3031 EXPECT_TRUE(response.headers.get() != NULL);
3118 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 3032 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
3119 } 3033 }
3120 3034
3121 // Verify that various SynReply headers parse correctly through the 3035 // Verify that various SynReply headers parse correctly through the
3122 // HTTP layer. 3036 // HTTP layer.
3123 TEST_P(SpdyNetworkTransactionTest, SynReplyHeaders) { 3037 TEST_P(SpdyNetworkTransactionTest, SynReplyHeaders) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3161 if (spdy_util_.spdy_version() < SPDY4) { 3075 if (spdy_util_.spdy_version() < SPDY4) {
3162 // SPDY4/HTTP2 eliminates use of the :version header. 3076 // SPDY4/HTTP2 eliminates use of the :version header.
3163 test_cases[0].expected_headers["version"] = "HTTP/1.1"; 3077 test_cases[0].expected_headers["version"] = "HTTP/1.1";
3164 test_cases[1].expected_headers["version"] = "HTTP/1.1"; 3078 test_cases[1].expected_headers["version"] = "HTTP/1.1";
3165 test_cases[2].expected_headers["version"] = "HTTP/1.1"; 3079 test_cases[2].expected_headers["version"] = "HTTP/1.1";
3166 } 3080 }
3167 3081
3168 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3082 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3169 scoped_ptr<SpdyFrame> req( 3083 scoped_ptr<SpdyFrame> req(
3170 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3084 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3171 MockWrite writes[] = { CreateMockWrite(*req) }; 3085 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3172 3086
3173 scoped_ptr<SpdyFrame> resp( 3087 scoped_ptr<SpdyFrame> resp(
3174 spdy_util_.ConstructSpdyGetSynReply(test_cases[i].extra_headers, 3088 spdy_util_.ConstructSpdyGetSynReply(test_cases[i].extra_headers,
3175 test_cases[i].num_headers, 3089 test_cases[i].num_headers,
3176 1)); 3090 1));
3177 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3091 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3178 MockRead reads[] = { 3092 MockRead reads[] = {
3179 CreateMockRead(*resp), 3093 CreateMockRead(*resp, 1),
3180 CreateMockRead(*body), 3094 CreateMockRead(*body, 2),
3181 MockRead(ASYNC, 0, 0) // EOF 3095 MockRead(ASYNC, 0, 3) // EOF
3182 }; 3096 };
3183 3097
3184 DelayedSocketData data(1, reads, arraysize(reads), 3098 SequencedSocketData data(reads, arraysize(reads), writes,
3185 writes, arraysize(writes)); 3099 arraysize(writes));
3186 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3100 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3187 BoundNetLog(), GetParam(), NULL); 3101 BoundNetLog(), GetParam(), NULL);
3188 helper.RunToCompletion(&data); 3102 helper.RunToCompletion(&data);
3189 TransactionHelperResult out = helper.output(); 3103 TransactionHelperResult out = helper.output();
3190 3104
3191 EXPECT_EQ(OK, out.rv); 3105 EXPECT_EQ(OK, out.rv);
3192 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3106 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3193 EXPECT_EQ("hello!", out.response_data); 3107 EXPECT_EQ("hello!", out.response_data);
3194 3108
3195 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers; 3109 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers;
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
3279 }; 3193 };
3280 3194
3281 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3195 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3282 // Construct the request. 3196 // Construct the request.
3283 scoped_ptr<SpdyFrame> frame_req( 3197 scoped_ptr<SpdyFrame> frame_req(
3284 spdy_util_.ConstructSpdyGet(test_cases[i].extra_headers[0], 3198 spdy_util_.ConstructSpdyGet(test_cases[i].extra_headers[0],
3285 test_cases[i].num_headers[0], 3199 test_cases[i].num_headers[0],
3286 false, 1, LOWEST, true)); 3200 false, 1, LOWEST, true));
3287 3201
3288 MockWrite writes[] = { 3202 MockWrite writes[] = {
3289 CreateMockWrite(*frame_req), 3203 CreateMockWrite(*frame_req, 0),
3290 }; 3204 };
3291 3205
3292 // Construct the reply. 3206 // Construct the reply.
3293 SpdyHeaderBlock reply_headers; 3207 SpdyHeaderBlock reply_headers;
3294 AppendToHeaderBlock(test_cases[i].extra_headers[1], 3208 AppendToHeaderBlock(test_cases[i].extra_headers[1],
3295 test_cases[i].num_headers[1], 3209 test_cases[i].num_headers[1],
3296 &reply_headers); 3210 &reply_headers);
3297 scoped_ptr<SpdyFrame> frame_reply( 3211 scoped_ptr<SpdyFrame> frame_reply(
3298 spdy_util_.ConstructSpdyReply(1, reply_headers)); 3212 spdy_util_.ConstructSpdyReply(1, reply_headers));
3299 3213
3300 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3214 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3301 MockRead reads[] = { 3215 MockRead reads[] = {
3302 CreateMockRead(*frame_reply), 3216 CreateMockRead(*frame_reply, 1),
3303 CreateMockRead(*body), 3217 CreateMockRead(*body, 2),
3304 MockRead(ASYNC, 0, 0) // EOF 3218 MockRead(ASYNC, 0, 3) // EOF
3305 }; 3219 };
3306 3220
3307 // Attach the headers to the request. 3221 // Attach the headers to the request.
3308 int header_count = test_cases[i].num_headers[0]; 3222 int header_count = test_cases[i].num_headers[0];
3309 3223
3310 HttpRequestInfo request = CreateGetRequest(); 3224 HttpRequestInfo request = CreateGetRequest();
3311 for (int ct = 0; ct < header_count; ct++) { 3225 for (int ct = 0; ct < header_count; ct++) {
3312 const char* header_key = test_cases[i].extra_headers[0][ct * 2]; 3226 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]; 3227 const char* header_value = test_cases[i].extra_headers[0][ct * 2 + 1];
3314 request.extra_headers.SetHeader(header_key, header_value); 3228 request.extra_headers.SetHeader(header_key, header_value);
3315 } 3229 }
3316 3230
3317 DelayedSocketData data(1, reads, arraysize(reads), 3231 SequencedSocketData data(reads, arraysize(reads), writes,
3318 writes, arraysize(writes)); 3232 arraysize(writes));
3319 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 3233 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
3320 BoundNetLog(), GetParam(), NULL); 3234 BoundNetLog(), GetParam(), NULL);
3321 helper.RunToCompletion(&data); 3235 helper.RunToCompletion(&data);
3322 TransactionHelperResult out = helper.output(); 3236 TransactionHelperResult out = helper.output();
3323 3237
3324 EXPECT_EQ(OK, out.rv) << i; 3238 EXPECT_EQ(OK, out.rv) << i;
3325 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line) << i; 3239 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line) << i;
3326 EXPECT_EQ("hello!", out.response_data) << i; 3240 EXPECT_EQ("hello!", out.response_data) << i;
3327 3241
3328 // Test the response information. 3242 // Test the response information.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
3373 // SYN_REPLY with no headers 3287 // SYN_REPLY with no headers
3374 { 0, { NULL }, }, 3288 { 0, { NULL }, },
3375 }; 3289 };
3376 3290
3377 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3291 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3378 scoped_ptr<SpdyFrame> req( 3292 scoped_ptr<SpdyFrame> req(
3379 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3293 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3380 scoped_ptr<SpdyFrame> rst( 3294 scoped_ptr<SpdyFrame> rst(
3381 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 3295 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
3382 MockWrite writes[] = { 3296 MockWrite writes[] = {
3383 CreateMockWrite(*req), 3297 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
3384 CreateMockWrite(*rst),
3385 }; 3298 };
3386 3299
3387 // Construct the reply. 3300 // Construct the reply.
3388 SpdyHeaderBlock reply_headers; 3301 SpdyHeaderBlock reply_headers;
3389 AppendToHeaderBlock( 3302 AppendToHeaderBlock(
3390 test_cases[i].headers, test_cases[i].num_headers, &reply_headers); 3303 test_cases[i].headers, test_cases[i].num_headers, &reply_headers);
3391 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyReply(1, reply_headers)); 3304 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyReply(1, reply_headers));
3392 MockRead reads[] = { 3305 MockRead reads[] = {
3393 CreateMockRead(*resp), 3306 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3) // EOF
3394 MockRead(ASYNC, 0, 0) // EOF
3395 }; 3307 };
3396 3308
3397 DelayedSocketData data(1, reads, arraysize(reads), 3309 SequencedSocketData data(reads, arraysize(reads), writes,
3398 writes, arraysize(writes)); 3310 arraysize(writes));
3399 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3311 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3400 BoundNetLog(), GetParam(), NULL); 3312 BoundNetLog(), GetParam(), NULL);
3401 helper.RunToCompletion(&data); 3313 helper.RunToCompletion(&data);
3402 TransactionHelperResult out = helper.output(); 3314 TransactionHelperResult out = helper.output();
3403 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3315 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3404 } 3316 }
3405 } 3317 }
3406 3318
3407 // Verify that we don't crash on some corrupt frames. 3319 // Verify that we don't crash on some corrupt frames.
3408 // TODO(jgraettinger): SPDY4 and up treats a header decompression failure as a 3320 // TODO(jgraettinger): SPDY4 and up treats a header decompression failure as a
(...skipping 20 matching lines...) Expand all
3429 } test_cases[] = { 3341 } test_cases[] = {
3430 { syn_reply_wrong_length.get(), }, 3342 { syn_reply_wrong_length.get(), },
3431 }; 3343 };
3432 3344
3433 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3345 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3434 scoped_ptr<SpdyFrame> req( 3346 scoped_ptr<SpdyFrame> req(
3435 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3347 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3436 scoped_ptr<SpdyFrame> rst( 3348 scoped_ptr<SpdyFrame> rst(
3437 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 3349 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
3438 MockWrite writes[] = { 3350 MockWrite writes[] = {
3439 CreateMockWrite(*req), 3351 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3),
3440 CreateMockWrite(*rst),
3441 }; 3352 };
3442 3353
3443 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3354 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3444 MockRead reads[] = { 3355 MockRead reads[] = {
3445 MockRead(ASYNC, test_cases[i].syn_reply->data(), wrong_size), 3356 MockRead(ASYNC, test_cases[i].syn_reply->data(), wrong_size, 1),
3446 CreateMockRead(*body), 3357 CreateMockRead(*body, 2),
3447 MockRead(ASYNC, 0, 0) // EOF 3358 MockRead(ASYNC, 0, 4) // EOF
3448 }; 3359 };
3449 3360
3450 DelayedSocketData data(1, reads, arraysize(reads), 3361 SequencedSocketData data(reads, arraysize(reads), writes,
3451 writes, arraysize(writes)); 3362 arraysize(writes));
3452 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3363 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3453 BoundNetLog(), GetParam(), NULL); 3364 BoundNetLog(), GetParam(), NULL);
3454 helper.RunToCompletion(&data); 3365 helper.RunToCompletion(&data);
3455 TransactionHelperResult out = helper.output(); 3366 TransactionHelperResult out = helper.output();
3456 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3367 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3457 } 3368 }
3458 } 3369 }
3459 3370
3460 // SPDY4 treats a header decompression failure as a connection-level error. 3371 // SPDY4 treats a header decompression failure as a connection-level error.
3461 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionErrorSpdy4) { 3372 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionErrorSpdy4) {
3462 if (spdy_util_.spdy_version() < SPDY4) { 3373 if (spdy_util_.spdy_version() < SPDY4) {
3463 return; 3374 return;
3464 } 3375 }
3465 // This is the length field that's too short. 3376 // This is the length field that's too short.
3466 scoped_ptr<SpdyFrame> syn_reply_wrong_length( 3377 scoped_ptr<SpdyFrame> syn_reply_wrong_length(
3467 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3378 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3468 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3379 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3469 size_t right_size = 3380 size_t right_size =
3470 syn_reply_wrong_length->size() - framer.GetControlFrameHeaderSize(); 3381 syn_reply_wrong_length->size() - framer.GetControlFrameHeaderSize();
3471 size_t wrong_size = right_size - 4; 3382 size_t wrong_size = right_size - 4;
3472 test::SetFrameLength(syn_reply_wrong_length.get(), 3383 test::SetFrameLength(syn_reply_wrong_length.get(),
3473 wrong_size, 3384 wrong_size,
3474 spdy_util_.spdy_version()); 3385 spdy_util_.spdy_version());
3475 3386
3476 scoped_ptr<SpdyFrame> req( 3387 scoped_ptr<SpdyFrame> req(
3477 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3388 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3478 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3389 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3479 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3390 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3480 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3391 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3481 3392
3482 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3393 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3483 MockRead reads[] = { 3394 MockRead reads[] = {
3484 MockRead(ASYNC, syn_reply_wrong_length->data(), 3395 MockRead(ASYNC, syn_reply_wrong_length->data(),
3485 syn_reply_wrong_length->size() - 4), 3396 syn_reply_wrong_length->size() - 4, 1),
3486 }; 3397 };
3487 3398
3488 DelayedSocketData data(1, reads, arraysize(reads), 3399 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3489 writes, arraysize(writes));
3490 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3400 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3491 BoundNetLog(), GetParam(), NULL); 3401 BoundNetLog(), GetParam(), NULL);
3492 helper.RunToCompletion(&data); 3402 helper.RunToCompletion(&data);
3493 TransactionHelperResult out = helper.output(); 3403 TransactionHelperResult out = helper.output();
3494 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3404 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3495 } 3405 }
3496 3406
3497 TEST_P(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) { 3407 TEST_P(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) {
3498 if (GetParam().protocol < kProtoSPDY4MinimumVersion) { 3408 if (GetParam().protocol < kProtoSPDY4MinimumVersion) {
3499 // Decompression failures are a stream error in SPDY3 and above. 3409 // Decompression failures are a stream error in SPDY3 and above.
3500 return; 3410 return;
3501 } 3411 }
3502 scoped_ptr<SpdyFrame> req( 3412 scoped_ptr<SpdyFrame> req(
3503 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3413 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3504 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3414 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3505 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3415 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3506 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3416 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3507 3417
3508 // Read HEADERS with corrupted payload. 3418 // Read HEADERS with corrupted payload.
3509 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3419 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3510 memset(resp->data() + 12, 0xff, resp->size() - 12); 3420 memset(resp->data() + 12, 0xff, resp->size() - 12);
3511 MockRead reads[] = {CreateMockRead(*resp)}; 3421 MockRead reads[] = {CreateMockRead(*resp, 1)};
3512 3422
3513 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 3423 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3514 NormalSpdyTransactionHelper helper( 3424 NormalSpdyTransactionHelper helper(
3515 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 3425 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
3516 helper.RunToCompletion(&data); 3426 helper.RunToCompletion(&data);
3517 TransactionHelperResult out = helper.output(); 3427 TransactionHelperResult out = helper.output();
3518 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3428 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3519 } 3429 }
3520 3430
3521 TEST_P(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) { 3431 TEST_P(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) {
3522 scoped_ptr<SpdyFrame> req( 3432 scoped_ptr<SpdyFrame> req(
3523 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3433 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3524 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3434 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3525 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME).")); 3435 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME)."));
3526 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3436 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3527 3437
3528 // Read WINDOW_UPDATE with incorrectly-sized payload. 3438 // Read WINDOW_UPDATE with incorrectly-sized payload.
3529 // TODO(jgraettinger): SpdyFramer signals this as an INVALID_CONTROL_FRAME, 3439 // TODO(jgraettinger): SpdyFramer signals this as an INVALID_CONTROL_FRAME,
3530 // which is mapped to a protocol error, and not a frame size error. 3440 // which is mapped to a protocol error, and not a frame size error.
3531 scoped_ptr<SpdyFrame> bad_window_update( 3441 scoped_ptr<SpdyFrame> bad_window_update(
3532 spdy_util_.ConstructSpdyWindowUpdate(1, 1)); 3442 spdy_util_.ConstructSpdyWindowUpdate(1, 1));
3533 test::SetFrameLength(bad_window_update.get(), 3443 test::SetFrameLength(bad_window_update.get(),
3534 bad_window_update->size() - 1, 3444 bad_window_update->size() - 1,
3535 spdy_util_.spdy_version()); 3445 spdy_util_.spdy_version());
3536 MockRead reads[] = {CreateMockRead(*bad_window_update)}; 3446 MockRead reads[] = {CreateMockRead(*bad_window_update, 1)};
3537 3447
3538 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 3448 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3539 NormalSpdyTransactionHelper helper( 3449 NormalSpdyTransactionHelper helper(
3540 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 3450 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
3541 helper.RunToCompletion(&data); 3451 helper.RunToCompletion(&data);
3542 TransactionHelperResult out = helper.output(); 3452 TransactionHelperResult out = helper.output();
3543 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3453 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3544 } 3454 }
3545 3455
3546 // Test that we shutdown correctly on write errors. 3456 // Test that we shutdown correctly on write errors.
3547 TEST_P(SpdyNetworkTransactionTest, WriteError) { 3457 TEST_P(SpdyNetworkTransactionTest, WriteError) {
3548 scoped_ptr<SpdyFrame> req( 3458 scoped_ptr<SpdyFrame> req(
(...skipping 28 matching lines...) Expand all
3577 EXPECT_EQ(ERR_FAILED, out.rv); 3487 EXPECT_EQ(ERR_FAILED, out.rv);
3578 } 3488 }
3579 3489
3580 // Test that partial writes work. 3490 // Test that partial writes work.
3581 TEST_P(SpdyNetworkTransactionTest, PartialWrite) { 3491 TEST_P(SpdyNetworkTransactionTest, PartialWrite) {
3582 // Chop the SYN_STREAM frame into 5 chunks. 3492 // Chop the SYN_STREAM frame into 5 chunks.
3583 scoped_ptr<SpdyFrame> req( 3493 scoped_ptr<SpdyFrame> req(
3584 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3494 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3585 const int kChunks = 5; 3495 const int kChunks = 5;
3586 scoped_ptr<MockWrite[]> writes(ChopWriteFrame(*req.get(), kChunks)); 3496 scoped_ptr<MockWrite[]> writes(ChopWriteFrame(*req.get(), kChunks));
3497 for (int i = 0; i < kChunks; ++i) {
3498 writes[i].sequence_number = i;
3499 }
3587 3500
3588 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3501 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3589 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3502 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3590 MockRead reads[] = { 3503 MockRead reads[] = {
3591 CreateMockRead(*resp), 3504 CreateMockRead(*resp, kChunks),
3592 CreateMockRead(*body), 3505 CreateMockRead(*body, kChunks + 1),
3593 MockRead(ASYNC, 0, 0) // EOF 3506 MockRead(ASYNC, 0, kChunks + 2) // EOF
3594 }; 3507 };
3595 3508
3596 DelayedSocketData data(kChunks, reads, arraysize(reads), 3509 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks);
3597 writes.get(), kChunks);
3598 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3510 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3599 BoundNetLog(), GetParam(), NULL); 3511 BoundNetLog(), GetParam(), NULL);
3600 helper.RunToCompletion(&data); 3512 helper.RunToCompletion(&data);
3601 TransactionHelperResult out = helper.output(); 3513 TransactionHelperResult out = helper.output();
3602 EXPECT_EQ(OK, out.rv); 3514 EXPECT_EQ(OK, out.rv);
3603 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3515 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3604 EXPECT_EQ("hello!", out.response_data); 3516 EXPECT_EQ("hello!", out.response_data);
3605 } 3517 }
3606 3518
3607 // In this test, we enable compression, but get a uncompressed SynReply from 3519 // In this test, we enable compression, but get a uncompressed SynReply from
3608 // the server. Verify that teardown is all clean. 3520 // the server. Verify that teardown is all clean.
3609 TEST_P(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) { 3521 TEST_P(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) {
3610 if (spdy_util_.spdy_version() >= SPDY4) { 3522 if (spdy_util_.spdy_version() >= SPDY4) {
3611 // HPACK doesn't use deflate compression. 3523 // HPACK doesn't use deflate compression.
3612 return; 3524 return;
3613 } 3525 }
3614 scoped_ptr<SpdyFrame> compressed( 3526 scoped_ptr<SpdyFrame> compressed(
3615 spdy_util_.ConstructSpdyGet(NULL, 0, true, 1, LOWEST, true)); 3527 spdy_util_.ConstructSpdyGet(NULL, 0, true, 1, LOWEST, true));
3616 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3528 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3617 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3529 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3618 MockWrite writes[] = {CreateMockWrite(*compressed), CreateMockWrite(*goaway)}; 3530 MockWrite writes[] = {CreateMockWrite(*compressed, 0),
3531 CreateMockWrite(*goaway, 2)};
3619 3532
3620 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3533 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3621 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3534 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3622 MockRead reads[] = { 3535 MockRead reads[] = {
3623 CreateMockRead(*resp), 3536 CreateMockRead(*resp, 1),
3624 }; 3537 };
3625 3538
3626 DelayedSocketData data(1, reads, arraysize(reads), 3539 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3627 writes, arraysize(writes));
3628 SpdySessionDependencies* session_deps = 3540 SpdySessionDependencies* session_deps =
3629 CreateSpdySessionDependencies(GetParam()); 3541 CreateSpdySessionDependencies(GetParam());
3630 session_deps->enable_compression = true; 3542 session_deps->enable_compression = true;
3631 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3543 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3632 BoundNetLog(), GetParam(), session_deps); 3544 BoundNetLog(), GetParam(), session_deps);
3633 helper.RunToCompletion(&data); 3545 helper.RunToCompletion(&data);
3634 TransactionHelperResult out = helper.output(); 3546 TransactionHelperResult out = helper.output();
3635 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3547 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3636 data.Reset(); 3548 data.Reset();
3637 } 3549 }
3638 3550
3639 // Test that the NetLog contains good data for a simple GET request. 3551 // Test that the NetLog contains good data for a simple GET request.
3640 TEST_P(SpdyNetworkTransactionTest, NetLog) { 3552 TEST_P(SpdyNetworkTransactionTest, NetLog) {
3641 static const char* const kExtraHeaders[] = { 3553 static const char* const kExtraHeaders[] = {
3642 "user-agent", "Chrome", 3554 "user-agent", "Chrome",
3643 }; 3555 };
3644 scoped_ptr<SpdyFrame> req( 3556 scoped_ptr<SpdyFrame> req(
3645 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, false, 1, LOWEST, true)); 3557 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, false, 1, LOWEST, true));
3646 MockWrite writes[] = { CreateMockWrite(*req) }; 3558 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3647 3559
3648 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3560 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3649 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3561 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3650 MockRead reads[] = { 3562 MockRead reads[] = {
3651 CreateMockRead(*resp), 3563 CreateMockRead(*resp, 1),
3652 CreateMockRead(*body), 3564 CreateMockRead(*body, 2),
3653 MockRead(ASYNC, 0, 0) // EOF 3565 MockRead(ASYNC, 0, 3) // EOF
3654 }; 3566 };
3655 3567
3656 BoundTestNetLog log; 3568 BoundTestNetLog log;
3657 3569
3658 DelayedSocketData data(1, reads, arraysize(reads), 3570 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3659 writes, arraysize(writes));
3660 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(), 3571 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(),
3661 DEFAULT_PRIORITY, 3572 DEFAULT_PRIORITY,
3662 log.bound(), GetParam(), NULL); 3573 log.bound(), GetParam(), NULL);
3663 helper.RunToCompletion(&data); 3574 helper.RunToCompletion(&data);
3664 TransactionHelperResult out = helper.output(); 3575 TransactionHelperResult out = helper.output();
3665 EXPECT_EQ(OK, out.rv); 3576 EXPECT_EQ(OK, out.rv);
3666 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3577 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3667 EXPECT_EQ("hello!", out.response_data); 3578 EXPECT_EQ("hello!", out.response_data);
3668 3579
3669 // Check that the NetLog was filled reasonably. 3580 // Check that the NetLog was filled reasonably.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
3728 3639
3729 // Since we buffer the IO from the stream to the renderer, this test verifies 3640 // 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 3641 // 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 3642 // on the network, but issued a Read for only 5 of those bytes) that the data
3732 // flow still works correctly. 3643 // flow still works correctly.
3733 TEST_P(SpdyNetworkTransactionTest, BufferFull) { 3644 TEST_P(SpdyNetworkTransactionTest, BufferFull) {
3734 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3645 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3735 3646
3736 scoped_ptr<SpdyFrame> req( 3647 scoped_ptr<SpdyFrame> req(
3737 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3648 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3738 MockWrite writes[] = { CreateMockWrite(*req) }; 3649 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3739 3650
3740 // 2 data frames in a single read. 3651 // 2 data frames in a single read.
3741 scoped_ptr<SpdyFrame> data_frame_1( 3652 scoped_ptr<SpdyFrame> data_frame_1(
3742 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE)); 3653 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE));
3743 scoped_ptr<SpdyFrame> data_frame_2( 3654 scoped_ptr<SpdyFrame> data_frame_2(
3744 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE)); 3655 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE));
3745 const SpdyFrame* data_frames[2] = { 3656 const SpdyFrame* data_frames[2] = {
3746 data_frame_1.get(), 3657 data_frame_1.get(),
3747 data_frame_2.get(), 3658 data_frame_2.get(),
3748 }; 3659 };
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
3917 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3828 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3918 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 3829 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
3919 } 3830 }
3920 3831
3921 // Verify the case where we buffer data but read it after it has been buffered. 3832 // Verify the case where we buffer data but read it after it has been buffered.
3922 TEST_P(SpdyNetworkTransactionTest, BufferedAll) { 3833 TEST_P(SpdyNetworkTransactionTest, BufferedAll) {
3923 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3834 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3924 3835
3925 scoped_ptr<SpdyFrame> req( 3836 scoped_ptr<SpdyFrame> req(
3926 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3837 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3927 MockWrite writes[] = { CreateMockWrite(*req) }; 3838 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3928 3839
3929 // 5 data frames in a single read. 3840 // 5 data frames in a single read.
3930 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3841 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3931 scoped_ptr<SpdyFrame> data_frame( 3842 scoped_ptr<SpdyFrame> data_frame(
3932 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 3843 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
3933 scoped_ptr<SpdyFrame> data_frame_fin( 3844 scoped_ptr<SpdyFrame> data_frame_fin(
3934 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN)); 3845 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN));
3935 const SpdyFrame* frames[5] = {reply.get(), data_frame.get(), data_frame.get(), 3846 const SpdyFrame* frames[5] = {reply.get(), data_frame.get(), data_frame.get(),
3936 data_frame.get(), data_frame_fin.get()}; 3847 data_frame.get(), data_frame_fin.get()};
3937 char combined_frames[200]; 3848 char combined_frames[200];
3938 int combined_frames_len = 3849 int combined_frames_len =
3939 CombineFrames(frames, arraysize(frames), 3850 CombineFrames(frames, arraysize(frames),
3940 combined_frames, arraysize(combined_frames)); 3851 combined_frames, arraysize(combined_frames));
3941 3852
3942 MockRead reads[] = { 3853 MockRead reads[] = {
3943 MockRead(ASYNC, combined_frames, combined_frames_len), 3854 MockRead(ASYNC, combined_frames, combined_frames_len, 1),
3944 MockRead(ASYNC, 0, 0) // EOF 3855 MockRead(ASYNC, 0, 2) // EOF
3945 }; 3856 };
3946 3857
3947 DelayedSocketData data(1, reads, arraysize(reads), 3858 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3948 writes, arraysize(writes));
3949 3859
3950 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3860 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3951 BoundNetLog(), GetParam(), NULL); 3861 BoundNetLog(), GetParam(), NULL);
3952 helper.RunPreTestSetup(); 3862 helper.RunPreTestSetup();
3953 helper.AddData(&data); 3863 helper.AddData(&data);
3954 HttpNetworkTransaction* trans = helper.trans(); 3864 HttpNetworkTransaction* trans = helper.trans();
3955 3865
3956 TestCompletionCallback callback; 3866 TestCompletionCallback callback;
3957 int rv = trans->Start( 3867 int rv = trans->Start(
3958 &CreateGetRequest(), callback.callback(), BoundNetLog()); 3868 &CreateGetRequest(), callback.callback(), BoundNetLog());
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
4191 4101
4192 // Verify that no settings exist initially. 4102 // Verify that no settings exist initially.
4193 HostPortPair host_port_pair("www.example.org", helper.port()); 4103 HostPortPair host_port_pair("www.example.org", helper.port());
4194 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4104 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4195 EXPECT_TRUE(spdy_session_pool->http_server_properties()->GetSpdySettings( 4105 EXPECT_TRUE(spdy_session_pool->http_server_properties()->GetSpdySettings(
4196 host_port_pair).empty()); 4106 host_port_pair).empty());
4197 4107
4198 // Construct the request. 4108 // Construct the request.
4199 scoped_ptr<SpdyFrame> req( 4109 scoped_ptr<SpdyFrame> req(
4200 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4110 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4201 MockWrite writes[] = { CreateMockWrite(*req) }; 4111 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4202 4112
4203 // Construct the reply. 4113 // Construct the reply.
4204 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); 4114 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock());
4205 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; 4115 (*reply_headers)[spdy_util_.GetStatusKey()] = "200";
4206 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 4116 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
4207 scoped_ptr<SpdyFrame> reply( 4117 scoped_ptr<SpdyFrame> reply(
4208 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass())); 4118 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass()));
4209 4119
4210 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH; 4120 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH;
4211 unsigned int kSampleValue1 = 0x0a0a0a0a; 4121 unsigned int kSampleValue1 = 0x0a0a0a0a;
(...skipping 12 matching lines...) Expand all
4224 settings[kSampleId2] = 4134 settings[kSampleId2] =
4225 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kSampleValue2); 4135 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kSampleValue2);
4226 // Next add another persisted setting. 4136 // Next add another persisted setting.
4227 settings[kSampleId3] = 4137 settings[kSampleId3] =
4228 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue3); 4138 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue3);
4229 settings_frame.reset(spdy_util_.ConstructSpdySettings(settings)); 4139 settings_frame.reset(spdy_util_.ConstructSpdySettings(settings));
4230 } 4140 }
4231 4141
4232 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4142 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4233 MockRead reads[] = { 4143 MockRead reads[] = {
4234 CreateMockRead(*reply), 4144 CreateMockRead(*reply, 1),
4235 CreateMockRead(*body), 4145 CreateMockRead(*body, 2),
4236 CreateMockRead(*settings_frame), 4146 CreateMockRead(*settings_frame, 3),
4237 MockRead(ASYNC, 0, 0) // EOF 4147 MockRead(ASYNC, 0, 4) // EOF
4238 }; 4148 };
4239 4149
4240 DelayedSocketData data(1, reads, arraysize(reads), 4150 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4241 writes, arraysize(writes));
4242 helper.AddData(&data); 4151 helper.AddData(&data);
4243 helper.RunDefaultTest(); 4152 helper.RunDefaultTest();
4244 helper.VerifyDataConsumed(); 4153 helper.VerifyDataConsumed();
4245 TransactionHelperResult out = helper.output(); 4154 TransactionHelperResult out = helper.output();
4246 EXPECT_EQ(OK, out.rv); 4155 EXPECT_EQ(OK, out.rv);
4247 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 4156 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
4248 EXPECT_EQ("hello!", out.response_data); 4157 EXPECT_EQ("hello!", out.response_data);
4249 4158
4250 { 4159 {
4251 // Verify we had two persisted settings. 4160 // Verify we had two persisted settings.
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
4402 EXPECT_TRUE(it2 != settings_map.end()); 4311 EXPECT_TRUE(it2 != settings_map.end());
4403 SettingsFlagsAndValue flags_and_value2 = it2->second; 4312 SettingsFlagsAndValue flags_and_value2 = it2->second;
4404 EXPECT_EQ(SETTINGS_FLAG_PERSISTED, flags_and_value2.first); 4313 EXPECT_EQ(SETTINGS_FLAG_PERSISTED, flags_and_value2.first);
4405 EXPECT_EQ(kSampleValue2, flags_and_value2.second); 4314 EXPECT_EQ(kSampleValue2, flags_and_value2.second);
4406 } 4315 }
4407 } 4316 }
4408 4317
4409 TEST_P(SpdyNetworkTransactionTest, GoAwayWithActiveStream) { 4318 TEST_P(SpdyNetworkTransactionTest, GoAwayWithActiveStream) {
4410 scoped_ptr<SpdyFrame> req( 4319 scoped_ptr<SpdyFrame> req(
4411 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4320 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4412 MockWrite writes[] = { CreateMockWrite(*req) }; 4321 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4413 4322
4414 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway()); 4323 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway());
4415 MockRead reads[] = { 4324 MockRead reads[] = {
4416 CreateMockRead(*go_away), 4325 CreateMockRead(*go_away, 1),
4417 }; 4326 };
4418 4327
4419 DelayedSocketData data(1, reads, arraysize(reads), 4328 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4420 writes, arraysize(writes));
4421 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4329 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4422 BoundNetLog(), GetParam(), NULL); 4330 BoundNetLog(), GetParam(), NULL);
4423 helper.AddData(&data); 4331 helper.AddData(&data);
4424 helper.RunToCompletion(&data); 4332 helper.RunToCompletion(&data);
4425 TransactionHelperResult out = helper.output(); 4333 TransactionHelperResult out = helper.output();
4426 EXPECT_EQ(ERR_ABORTED, out.rv); 4334 EXPECT_EQ(ERR_ABORTED, out.rv);
4427 } 4335 }
4428 4336
4429 TEST_P(SpdyNetworkTransactionTest, CloseWithActiveStream) { 4337 TEST_P(SpdyNetworkTransactionTest, CloseWithActiveStream) {
4430 scoped_ptr<SpdyFrame> req( 4338 scoped_ptr<SpdyFrame> req(
4431 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4339 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4432 MockWrite writes[] = { CreateMockWrite(*req) }; 4340 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4433 4341
4434 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4342 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4435 MockRead reads[] = { 4343 MockRead reads[] = {
4436 CreateMockRead(*resp), 4344 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
4437 MockRead(SYNCHRONOUS, 0, 0) // EOF
4438 }; 4345 };
4439 4346
4440 DelayedSocketData data(1, reads, arraysize(reads), 4347 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4441 writes, arraysize(writes));
4442 BoundNetLog log; 4348 BoundNetLog log;
4443 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4349 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4444 log, GetParam(), NULL); 4350 log, GetParam(), NULL);
4445 helper.RunPreTestSetup(); 4351 helper.RunPreTestSetup();
4446 helper.AddData(&data); 4352 helper.AddData(&data);
4447 HttpNetworkTransaction* trans = helper.trans(); 4353 HttpNetworkTransaction* trans = helper.trans();
4448 4354
4449 TestCompletionCallback callback; 4355 TestCompletionCallback callback;
4450 TransactionHelperResult out; 4356 TransactionHelperResult out;
4451 out.rv = trans->Start(&CreateGetRequest(), callback.callback(), log); 4357 out.rv = trans->Start(&CreateGetRequest(), callback.callback(), log);
(...skipping 17 matching lines...) Expand all
4469 // HTTP_1_1_REQUIRED is only supported by SPDY4. 4375 // HTTP_1_1_REQUIRED is only supported by SPDY4.
4470 if (spdy_util_.spdy_version() < SPDY4) 4376 if (spdy_util_.spdy_version() < SPDY4)
4471 return; 4377 return;
4472 4378
4473 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4379 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4474 BoundNetLog(), GetParam(), nullptr); 4380 BoundNetLog(), GetParam(), nullptr);
4475 4381
4476 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4382 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4477 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4383 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4478 MockRead reads[] = { 4384 MockRead reads[] = {
4479 CreateMockRead(*go_away), 4385 CreateMockRead(*go_away, 0),
4480 }; 4386 };
4481 DelayedSocketData data(0, reads, arraysize(reads), nullptr, 0); 4387 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
4482 4388
4483 helper.RunToCompletion(&data); 4389 helper.RunToCompletion(&data);
4484 TransactionHelperResult out = helper.output(); 4390 TransactionHelperResult out = helper.output();
4485 EXPECT_EQ(ERR_HTTP_1_1_REQUIRED, out.rv); 4391 EXPECT_EQ(ERR_HTTP_1_1_REQUIRED, out.rv);
4486 } 4392 }
4487 4393
4488 // Retry with HTTP/1.1 when receiving HTTP_1_1_REQUIRED. Note that no actual 4394 // 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 4395 // protocol negotiation happens, instead this test forces protocols for both
4490 // sockets. 4396 // sockets.
4491 TEST_P(SpdyNetworkTransactionTest, HTTP11RequiredRetry) { 4397 TEST_P(SpdyNetworkTransactionTest, HTTP11RequiredRetry) {
(...skipping 13 matching lines...) Expand all
4505 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 4411 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
4506 session_deps->next_protos = SpdyNextProtos(); 4412 session_deps->next_protos = SpdyNextProtos();
4507 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 4413 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
4508 GetParam(), session_deps.release()); 4414 GetParam(), session_deps.release());
4509 4415
4510 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. 4416 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED.
4511 const char* url = request.url.spec().c_str(); 4417 const char* url = request.url.spec().c_str();
4512 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url)); 4418 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url));
4513 scoped_ptr<SpdyFrame> req( 4419 scoped_ptr<SpdyFrame> req(
4514 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, false, true)); 4420 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, false, true));
4515 MockWrite writes0[] = {CreateMockWrite(*req)}; 4421 MockWrite writes0[] = {CreateMockWrite(*req, 0)};
4516 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4422 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4517 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4423 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4518 MockRead reads0[] = {CreateMockRead(*go_away)}; 4424 MockRead reads0[] = {CreateMockRead(*go_away, 1)};
4519 DelayedSocketData data0(1, reads0, arraysize(reads0), writes0, 4425 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4520 arraysize(writes0)); 4426 arraysize(writes0));
4521 4427
4522 scoped_ptr<SSLSocketDataProvider> ssl_provider0( 4428 scoped_ptr<SSLSocketDataProvider> ssl_provider0(
4523 new SSLSocketDataProvider(ASYNC, OK)); 4429 new SSLSocketDataProvider(ASYNC, OK));
4524 // Expect HTTP/2 protocols too in SSLConfig. 4430 // Expect HTTP/2 protocols too in SSLConfig.
4525 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4431 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4526 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); 4432 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31);
4527 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14); 4433 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14);
4528 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4); 4434 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4);
4529 // Force SPDY. 4435 // Force SPDY.
4530 ssl_provider0->SetNextProto(GetParam().protocol); 4436 ssl_provider0->SetNextProto(GetParam().protocol);
4531 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass()); 4437 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass());
4532 4438
4533 // Second socket: falling back to HTTP/1.1. 4439 // Second socket: falling back to HTTP/1.1.
4534 MockWrite writes1[] = {MockWrite( 4440 MockWrite writes1[] = {MockWrite(ASYNC, 0,
4535 "GET / HTTP/1.1\r\n" 4441 "GET / HTTP/1.1\r\n"
4536 "Host: www.example.org\r\n" 4442 "Host: www.example.org\r\n"
4537 "Connection: keep-alive\r\n\r\n")}; 4443 "Connection: keep-alive\r\n\r\n")};
4538 MockRead reads1[] = {MockRead( 4444 MockRead reads1[] = {MockRead(ASYNC, 1,
4539 "HTTP/1.1 200 OK\r\n" 4445 "HTTP/1.1 200 OK\r\n"
4540 "Content-Length: 5\r\n\r\n" 4446 "Content-Length: 5\r\n\r\n"
4541 "hello")}; 4447 "hello")};
4542 DelayedSocketData data1(1, reads1, arraysize(reads1), writes1, 4448 SequencedSocketData data1(reads1, arraysize(reads1), writes1,
4543 arraysize(writes1)); 4449 arraysize(writes1));
4544 4450
4545 scoped_ptr<SSLSocketDataProvider> ssl_provider1( 4451 scoped_ptr<SSLSocketDataProvider> ssl_provider1(
4546 new SSLSocketDataProvider(ASYNC, OK)); 4452 new SSLSocketDataProvider(ASYNC, OK));
4547 // Expect only HTTP/1.1 protocol in SSLConfig. 4453 // Expect only HTTP/1.1 protocol in SSLConfig.
4548 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4454 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4549 // Force HTTP/1.1. 4455 // Force HTTP/1.1.
4550 ssl_provider1->SetNextProto(kProtoHTTP11); 4456 ssl_provider1->SetNextProto(kProtoHTTP11);
4551 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass()); 4457 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass());
4552 4458
4553 base::WeakPtr<HttpServerProperties> http_server_properties = 4459 base::WeakPtr<HttpServerProperties> http_server_properties =
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4596 GetParam(), 4502 GetParam(),
4597 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70"))); 4503 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70")));
4598 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 4504 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
4599 session_deps->next_protos = SpdyNextProtos(); 4505 session_deps->next_protos = SpdyNextProtos();
4600 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 4506 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
4601 GetParam(), session_deps.release()); 4507 GetParam(), session_deps.release());
4602 4508
4603 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED. 4509 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED.
4604 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect( 4510 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect(
4605 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443))); 4511 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
4606 MockWrite writes0[] = {CreateMockWrite(*req)}; 4512 MockWrite writes0[] = {CreateMockWrite(*req, 0)};
4607 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4513 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4608 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4514 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4609 MockRead reads0[] = {CreateMockRead(*go_away)}; 4515 MockRead reads0[] = {CreateMockRead(*go_away, 1)};
4610 DelayedSocketData data0(1, reads0, arraysize(reads0), writes0, 4516 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4611 arraysize(writes0)); 4517 arraysize(writes0));
4612 4518
4613 scoped_ptr<SSLSocketDataProvider> ssl_provider0( 4519 scoped_ptr<SSLSocketDataProvider> ssl_provider0(
4614 new SSLSocketDataProvider(ASYNC, OK)); 4520 new SSLSocketDataProvider(ASYNC, OK));
4615 // Expect HTTP/2 protocols too in SSLConfig. 4521 // Expect HTTP/2 protocols too in SSLConfig.
4616 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4522 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4617 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); 4523 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31);
4618 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14); 4524 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14);
4619 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4); 4525 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4);
4620 // Force SPDY. 4526 // Force SPDY.
4621 ssl_provider0->SetNextProto(GetParam().protocol); 4527 ssl_provider0->SetNextProto(GetParam().protocol);
4622 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass()); 4528 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass());
4623 4529
4624 // Second socket: retry using HTTP/1.1. 4530 // Second socket: retry using HTTP/1.1.
4625 MockWrite writes1[] = { 4531 MockWrite writes1[] = {
4626 MockWrite(ASYNC, 1, 4532 MockWrite(ASYNC, 0,
4627 "CONNECT www.example.org:443 HTTP/1.1\r\n" 4533 "CONNECT www.example.org:443 HTTP/1.1\r\n"
4628 "Host: www.example.org\r\n" 4534 "Host: www.example.org\r\n"
4629 "Proxy-Connection: keep-alive\r\n\r\n"), 4535 "Proxy-Connection: keep-alive\r\n\r\n"),
4630 MockWrite(ASYNC, 3, 4536 MockWrite(ASYNC, 2,
4631 "GET / HTTP/1.1\r\n" 4537 "GET / HTTP/1.1\r\n"
4632 "Host: www.example.org\r\n" 4538 "Host: www.example.org\r\n"
4633 "Connection: keep-alive\r\n\r\n"), 4539 "Connection: keep-alive\r\n\r\n"),
4634 }; 4540 };
4635 4541
4636 MockRead reads1[] = { 4542 MockRead reads1[] = {
4637 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n\r\n"), 4543 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n\r\n"),
4638 MockRead(ASYNC, 4, 4544 MockRead(ASYNC, 3,
4639 "HTTP/1.1 200 OK\r\n" 4545 "HTTP/1.1 200 OK\r\n"
4640 "Content-Length: 5\r\n\r\n" 4546 "Content-Length: 5\r\n\r\n"
4641 "hello"), 4547 "hello"),
4642 }; 4548 };
4643 DelayedSocketData data1(1, reads1, arraysize(reads1), writes1, 4549 SequencedSocketData data1(reads1, arraysize(reads1), writes1,
4644 arraysize(writes1)); 4550 arraysize(writes1));
4645 4551
4646 scoped_ptr<SSLSocketDataProvider> ssl_provider1( 4552 scoped_ptr<SSLSocketDataProvider> ssl_provider1(
4647 new SSLSocketDataProvider(ASYNC, OK)); 4553 new SSLSocketDataProvider(ASYNC, OK));
4648 // Expect only HTTP/1.1 protocol in SSLConfig. 4554 // Expect only HTTP/1.1 protocol in SSLConfig.
4649 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4555 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4650 // Force HTTP/1.1. 4556 // Force HTTP/1.1.
4651 ssl_provider1->SetNextProto(kProtoHTTP11); 4557 ssl_provider1->SetNextProto(kProtoHTTP11);
4652 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass()); 4558 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass());
4653 4559
4654 // A third socket is needed for the tunnelled connection. 4560 // A third socket is needed for the tunnelled connection.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
4708 MockWrite writes[] = { 4614 MockWrite writes[] = {
4709 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4615 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4710 CreateMockWrite(*req, 2), 4616 CreateMockWrite(*req, 2),
4711 }; 4617 };
4712 MockRead reads[] = { 4618 MockRead reads[] = {
4713 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4619 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4714 CreateMockRead(*resp, 3), 4620 CreateMockRead(*resp, 3),
4715 CreateMockRead(*body.get(), 4), 4621 CreateMockRead(*body.get(), 4),
4716 MockRead(ASYNC, 0, 0, 5), 4622 MockRead(ASYNC, 0, 0, 5),
4717 }; 4623 };
4718 scoped_ptr<OrderedSocketData> data(new OrderedSocketData( 4624 scoped_ptr<SequencedSocketData> data(new SequencedSocketData(
4719 reads, arraysize(reads), writes, arraysize(writes))); 4625 reads, arraysize(reads), writes, arraysize(writes)));
4720 4626
4721 helper.AddData(data.get()); 4627 helper.AddData(data.get());
4722 TestCompletionCallback callback; 4628 TestCompletionCallback callback;
4723 4629
4724 int rv = trans->Start( 4630 int rv = trans->Start(
4725 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4631 &CreateGetRequest(), callback.callback(), BoundNetLog());
4726 EXPECT_EQ(ERR_IO_PENDING, rv); 4632 EXPECT_EQ(ERR_IO_PENDING, rv);
4727 4633
4728 rv = callback.WaitForResult(); 4634 rv = callback.WaitForResult();
(...skipping 29 matching lines...) Expand all
4758 helper.SetSession(make_scoped_refptr( 4664 helper.SetSession(make_scoped_refptr(
4759 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get()))); 4665 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get())));
4760 4666
4761 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4667 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4762 helper.RunPreTestSetup(); 4668 helper.RunPreTestSetup();
4763 4669
4764 // Construct and send a simple GET request. 4670 // Construct and send a simple GET request.
4765 scoped_ptr<SpdyFrame> req( 4671 scoped_ptr<SpdyFrame> req(
4766 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4672 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4767 MockWrite writes[] = { 4673 MockWrite writes[] = {
4768 CreateMockWrite(*req, 1), 4674 CreateMockWrite(*req, 0),
4769 }; 4675 };
4770 4676
4771 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4677 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4772 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4678 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4773 MockRead reads[] = { 4679 MockRead reads[] = {
4774 CreateMockRead(*resp, 2), 4680 CreateMockRead(*resp, 1),
4775 CreateMockRead(*body, 3), 4681 CreateMockRead(*body, 2),
4776 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 4682 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause
4777 MockRead(ASYNC, 0, 5) // EOF
4778 }; 4683 };
4779 OrderedSocketData data(reads, arraysize(reads), 4684 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4780 writes, arraysize(writes));
4781 helper.AddData(&data); 4685 helper.AddData(&data);
4782 HttpNetworkTransaction* trans = helper.trans(); 4686 HttpNetworkTransaction* trans = helper.trans();
4783 4687
4784 TestCompletionCallback callback; 4688 TestCompletionCallback callback;
4785 TransactionHelperResult out; 4689 TransactionHelperResult out;
4786 out.rv = trans->Start( 4690 out.rv = trans->Start(
4787 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4691 &CreateGetRequest(), callback.callback(), BoundNetLog());
4788 4692
4789 EXPECT_EQ(out.rv, ERR_IO_PENDING); 4693 EXPECT_EQ(out.rv, ERR_IO_PENDING);
4790 out.rv = callback.WaitForResult(); 4694 out.rv = callback.WaitForResult();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4825 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4729 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4826 CreateMockWrite(*req2, 2), 4730 CreateMockWrite(*req2, 2),
4827 }; 4731 };
4828 MockRead reads2[] = { 4732 MockRead reads2[] = {
4829 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4733 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4830 CreateMockRead(*resp2, 3), 4734 CreateMockRead(*resp2, 3),
4831 CreateMockRead(*body2, 4), 4735 CreateMockRead(*body2, 4),
4832 MockRead(ASYNC, 0, 5) // EOF 4736 MockRead(ASYNC, 0, 5) // EOF
4833 }; 4737 };
4834 4738
4835 scoped_ptr<OrderedSocketData> data_proxy(new OrderedSocketData( 4739 scoped_ptr<SequencedSocketData> data_proxy(new SequencedSocketData(
4836 reads2, arraysize(reads2), writes2, arraysize(writes2))); 4740 reads2, arraysize(reads2), writes2, arraysize(writes2)));
4837 4741
4838 // Create another request to www.example.org, but this time through a proxy. 4742 // Create another request to www.example.org, but this time through a proxy.
4839 HttpRequestInfo request_proxy; 4743 HttpRequestInfo request_proxy;
4840 request_proxy.method = "GET"; 4744 request_proxy.method = "GET";
4841 request_proxy.url = GURL(GetDefaultUrlWithPath("/foo.dat")); 4745 request_proxy.url = GURL(GetDefaultUrlWithPath("/foo.dat"));
4842 request_proxy.load_flags = 0; 4746 request_proxy.load_flags = 0;
4843 scoped_ptr<SpdySessionDependencies> ssd_proxy( 4747 scoped_ptr<SpdySessionDependencies> ssd_proxy(
4844 CreateSpdySessionDependencies(GetParam())); 4748 CreateSpdySessionDependencies(GetParam()));
4845 // Ensure that this transaction uses the same SpdySessionPool. 4749 // Ensure that this transaction uses the same SpdySessionPool.
(...skipping 19 matching lines...) Expand all
4865 EXPECT_EQ(0, rv); 4769 EXPECT_EQ(0, rv);
4866 4770
4867 HttpResponseInfo response_proxy = *trans_proxy->GetResponseInfo(); 4771 HttpResponseInfo response_proxy = *trans_proxy->GetResponseInfo();
4868 EXPECT_TRUE(response_proxy.headers.get() != NULL); 4772 EXPECT_TRUE(response_proxy.headers.get() != NULL);
4869 EXPECT_EQ("HTTP/1.1 200 OK", response_proxy.headers->GetStatusLine()); 4773 EXPECT_EQ("HTTP/1.1 200 OK", response_proxy.headers->GetStatusLine());
4870 4774
4871 std::string response_data; 4775 std::string response_data;
4872 ASSERT_EQ(OK, ReadTransaction(trans_proxy, &response_data)); 4776 ASSERT_EQ(OK, ReadTransaction(trans_proxy, &response_data));
4873 EXPECT_EQ("hello!", response_data); 4777 EXPECT_EQ("hello!", response_data);
4874 4778
4875 data.CompleteRead();
4876 helper_proxy.VerifyDataConsumed(); 4779 helper_proxy.VerifyDataConsumed();
4877 } 4780 }
4878 4781
4879 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction 4782 // 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. 4783 // 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 4784 // This can happen when a server reboots without saying goodbye, or when
4882 // we're behind a NAT that masked the RST. 4785 // we're behind a NAT that masked the RST.
4883 TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) { 4786 TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) {
4884 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4787 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4885 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4788 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4886 MockRead reads[] = { 4789 MockRead reads[] = {
4887 CreateMockRead(*resp), 4790 CreateMockRead(*resp, 0),
4888 CreateMockRead(*body), 4791 CreateMockRead(*body, 1),
4889 MockRead(ASYNC, ERR_IO_PENDING), 4792 MockRead(ASYNC, ERR_IO_PENDING, 2),
4890 MockRead(ASYNC, ERR_CONNECTION_RESET), 4793 MockRead(ASYNC, ERR_CONNECTION_RESET, 3),
4891 }; 4794 };
4892 4795
4893 MockRead reads2[] = { 4796 MockRead reads2[] = {
4894 CreateMockRead(*resp), 4797 CreateMockRead(*resp, 0),
4895 CreateMockRead(*body), 4798 CreateMockRead(*body, 1),
4896 MockRead(ASYNC, 0, 0) // EOF 4799 MockRead(ASYNC, 0, 2) // EOF
4897 }; 4800 };
4898 4801
4899 // This test has a couple of variants. 4802 // This test has a couple of variants.
4900 enum { 4803 enum {
4901 // Induce the RST while waiting for our transaction to send. 4804 // Induce the RST while waiting for our transaction to send.
4902 VARIANT_RST_DURING_SEND_COMPLETION, 4805 VARIANT_RST_DURING_SEND_COMPLETION,
4903 // Induce the RST while waiting for our transaction to read. 4806 // Induce the RST while waiting for our transaction to read.
4904 // In this case, the send completed - everything copied into the SNDBUF. 4807 // In this case, the send completed - everything copied into the SNDBUF.
4905 VARIANT_RST_DURING_READ_COMPLETION 4808 VARIANT_RST_DURING_READ_COMPLETION
4906 }; 4809 };
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4955 4858
4956 helper.VerifyDataConsumed(); 4859 helper.VerifyDataConsumed();
4957 } 4860 }
4958 } 4861 }
4959 4862
4960 // Test that turning SPDY on and off works properly. 4863 // Test that turning SPDY on and off works properly.
4961 TEST_P(SpdyNetworkTransactionTest, SpdyOnOffToggle) { 4864 TEST_P(SpdyNetworkTransactionTest, SpdyOnOffToggle) {
4962 HttpStreamFactory::set_spdy_enabled(true); 4865 HttpStreamFactory::set_spdy_enabled(true);
4963 scoped_ptr<SpdyFrame> req( 4866 scoped_ptr<SpdyFrame> req(
4964 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4867 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4965 MockWrite spdy_writes[] = { CreateMockWrite(*req) }; 4868 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)};
4966 4869
4967 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4870 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4968 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4871 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4969 MockRead spdy_reads[] = { 4872 MockRead spdy_reads[] = {
4970 CreateMockRead(*resp), 4873 CreateMockRead(*resp, 1),
4971 CreateMockRead(*body), 4874 CreateMockRead(*body, 2),
4972 MockRead(ASYNC, 0, 0) // EOF 4875 MockRead(ASYNC, 0, 3) // EOF
4973 }; 4876 };
4974 4877
4975 DelayedSocketData data(1, spdy_reads, arraysize(spdy_reads), 4878 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
4976 spdy_writes, arraysize(spdy_writes)); 4879 arraysize(spdy_writes));
4977 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4880 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4978 BoundNetLog(), GetParam(), NULL); 4881 BoundNetLog(), GetParam(), NULL);
4979 helper.RunToCompletion(&data); 4882 helper.RunToCompletion(&data);
4980 TransactionHelperResult out = helper.output(); 4883 TransactionHelperResult out = helper.output();
4981 EXPECT_EQ(OK, out.rv); 4884 EXPECT_EQ(OK, out.rv);
4982 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 4885 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
4983 EXPECT_EQ("hello!", out.response_data); 4886 EXPECT_EQ("hello!", out.response_data);
4984 4887
4985 HttpStreamFactory::set_spdy_enabled(false); 4888 HttpStreamFactory::set_spdy_enabled(false);
4889 MockWrite http_writes[] = {
4890 MockWrite(SYNCHRONOUS, 0,
4891 "GET / HTTP/1.1\r\n"
4892 "Host: www.example.org\r\n"
4893 "Connection: keep-alive\r\n\r\n"),
4894 };
4895
4986 MockRead http_reads[] = { 4896 MockRead http_reads[] = {
4987 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 4897 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"),
4988 MockRead("hello from http"), 4898 MockRead(SYNCHRONOUS, 2, "hello from http"),
4989 MockRead(SYNCHRONOUS, OK), 4899 MockRead(SYNCHRONOUS, OK, 3),
4990 }; 4900 };
4991 DelayedSocketData data2(1, http_reads, arraysize(http_reads), NULL, 0); 4901 SequencedSocketData data2(http_reads, arraysize(http_reads), http_writes,
4902 arraysize(http_writes));
4992 NormalSpdyTransactionHelper helper2(CreateGetRequest(), DEFAULT_PRIORITY, 4903 NormalSpdyTransactionHelper helper2(CreateGetRequest(), DEFAULT_PRIORITY,
4993 BoundNetLog(), GetParam(), NULL); 4904 BoundNetLog(), GetParam(), NULL);
4994 helper2.SetSpdyDisabled(); 4905 helper2.SetSpdyDisabled();
4995 helper2.RunToCompletion(&data2); 4906 helper2.RunToCompletion(&data2);
4996 TransactionHelperResult out2 = helper2.output(); 4907 TransactionHelperResult out2 = helper2.output();
4997 EXPECT_EQ(OK, out2.rv); 4908 EXPECT_EQ(OK, out2.rv);
4998 EXPECT_EQ("HTTP/1.1 200 OK", out2.status_line); 4909 EXPECT_EQ("HTTP/1.1 200 OK", out2.status_line);
4999 EXPECT_EQ("hello from http", out2.response_data); 4910 EXPECT_EQ("hello from http", out2.response_data);
5000 4911
5001 HttpStreamFactory::set_spdy_enabled(true); 4912 HttpStreamFactory::set_spdy_enabled(true);
5002 } 4913 }
5003 4914
5004 // Tests that Basic authentication works over SPDY 4915 // Tests that Basic authentication works over SPDY
5005 TEST_P(SpdyNetworkTransactionTest, SpdyBasicAuth) { 4916 TEST_P(SpdyNetworkTransactionTest, SpdyBasicAuth) {
5006 HttpStreamFactory::set_spdy_enabled(true); 4917 HttpStreamFactory::set_spdy_enabled(true);
5007 4918
5008 // The first request will be a bare GET, the second request will be a 4919 // The first request will be a bare GET, the second request will be a
5009 // GET with an Authorization header. 4920 // GET with an Authorization header.
5010 scoped_ptr<SpdyFrame> req_get( 4921 scoped_ptr<SpdyFrame> req_get(
5011 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4922 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5012 const char* const kExtraAuthorizationHeaders[] = { 4923 const char* const kExtraAuthorizationHeaders[] = {
5013 "authorization", "Basic Zm9vOmJhcg==" 4924 "authorization", "Basic Zm9vOmJhcg=="
5014 }; 4925 };
5015 scoped_ptr<SpdyFrame> req_get_authorization( 4926 scoped_ptr<SpdyFrame> req_get_authorization(
5016 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders, 4927 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders,
5017 arraysize(kExtraAuthorizationHeaders) / 2, 4928 arraysize(kExtraAuthorizationHeaders) / 2,
5018 false, 3, LOWEST, true)); 4929 false, 3, LOWEST, true));
5019 MockWrite spdy_writes[] = { 4930 MockWrite spdy_writes[] = {
5020 CreateMockWrite(*req_get, 1), 4931 CreateMockWrite(*req_get, 0), CreateMockWrite(*req_get_authorization, 3),
5021 CreateMockWrite(*req_get_authorization, 4),
5022 }; 4932 };
5023 4933
5024 // The first response is a 401 authentication challenge, and the second 4934 // 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 4935 // response will be a 200 response since the second request includes a valid
5026 // Authorization header. 4936 // Authorization header.
5027 const char* const kExtraAuthenticationHeaders[] = { 4937 const char* const kExtraAuthenticationHeaders[] = {
5028 "www-authenticate", 4938 "www-authenticate",
5029 "Basic realm=\"MyRealm\"" 4939 "Basic realm=\"MyRealm\""
5030 }; 4940 };
5031 scoped_ptr<SpdyFrame> resp_authentication( 4941 scoped_ptr<SpdyFrame> resp_authentication(
5032 spdy_util_.ConstructSpdySynReplyError( 4942 spdy_util_.ConstructSpdySynReplyError(
5033 "401 Authentication Required", 4943 "401 Authentication Required",
5034 kExtraAuthenticationHeaders, 4944 kExtraAuthenticationHeaders,
5035 arraysize(kExtraAuthenticationHeaders) / 2, 4945 arraysize(kExtraAuthenticationHeaders) / 2,
5036 1)); 4946 1));
5037 scoped_ptr<SpdyFrame> body_authentication( 4947 scoped_ptr<SpdyFrame> body_authentication(
5038 spdy_util_.ConstructSpdyBodyFrame(1, true)); 4948 spdy_util_.ConstructSpdyBodyFrame(1, true));
5039 scoped_ptr<SpdyFrame> resp_data( 4949 scoped_ptr<SpdyFrame> resp_data(
5040 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 4950 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
5041 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true)); 4951 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true));
5042 MockRead spdy_reads[] = { 4952 MockRead spdy_reads[] = {
5043 CreateMockRead(*resp_authentication, 2), 4953 CreateMockRead(*resp_authentication, 1),
5044 CreateMockRead(*body_authentication, 3), 4954 CreateMockRead(*body_authentication, 2),
5045 CreateMockRead(*resp_data, 5), 4955 CreateMockRead(*resp_data, 4),
5046 CreateMockRead(*body_data, 6), 4956 CreateMockRead(*body_data, 5),
5047 MockRead(ASYNC, 0, 7), 4957 MockRead(ASYNC, 0, 6),
5048 }; 4958 };
5049 4959
5050 OrderedSocketData data(spdy_reads, arraysize(spdy_reads), 4960 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
5051 spdy_writes, arraysize(spdy_writes)); 4961 arraysize(spdy_writes));
5052 HttpRequestInfo request(CreateGetRequest()); 4962 HttpRequestInfo request(CreateGetRequest());
5053 BoundNetLog net_log; 4963 BoundNetLog net_log;
5054 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 4964 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
5055 net_log, GetParam(), NULL); 4965 net_log, GetParam(), NULL);
5056 4966
5057 helper.RunPreTestSetup(); 4967 helper.RunPreTestSetup();
5058 helper.AddData(&data); 4968 helper.AddData(&data);
5059 HttpNetworkTransaction* trans = helper.trans(); 4969 HttpNetworkTransaction* trans = helper.trans();
5060 TestCompletionCallback callback; 4970 TestCompletionCallback callback;
5061 const int rv_start = trans->Start(&request, callback.callback(), net_log); 4971 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()); 5002 EXPECT_EQ(200, response_restart->headers->response_code());
5093 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL); 5003 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL);
5094 } 5004 }
5095 5005
5096 TEST_P(SpdyNetworkTransactionTest, ServerPushWithHeaders) { 5006 TEST_P(SpdyNetworkTransactionTest, ServerPushWithHeaders) {
5097 scoped_ptr<SpdyFrame> stream1_syn( 5007 scoped_ptr<SpdyFrame> stream1_syn(
5098 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5008 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5099 scoped_ptr<SpdyFrame> stream1_body( 5009 scoped_ptr<SpdyFrame> stream1_body(
5100 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5010 spdy_util_.ConstructSpdyBodyFrame(1, true));
5101 MockWrite writes[] = { 5011 MockWrite writes[] = {
5102 CreateMockWrite(*stream1_syn, 1), 5012 CreateMockWrite(*stream1_syn, 0),
5103 }; 5013 };
5104 5014
5105 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); 5015 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock());
5106 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 5016 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
5107 initial_headers.get()); 5017 initial_headers.get());
5108 scoped_ptr<SpdyFrame> stream2_syn( 5018 scoped_ptr<SpdyFrame> stream2_syn(
5109 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1)); 5019 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1));
5110 5020
5111 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5021 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5112 (*late_headers)["hello"] = "bye"; 5022 (*late_headers)["hello"] = "bye";
5113 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; 5023 (*late_headers)[spdy_util_.GetStatusKey()] = "200";
5114 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 5024 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
5115 scoped_ptr<SpdyFrame> stream2_headers( 5025 scoped_ptr<SpdyFrame> stream2_headers(
5116 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5026 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5117 false, 5027 false,
5118 2, 5028 2,
5119 LOWEST, 5029 LOWEST,
5120 HEADERS, 5030 HEADERS,
5121 CONTROL_FLAG_NONE, 5031 CONTROL_FLAG_NONE,
5122 0)); 5032 0));
5123 5033
5124 scoped_ptr<SpdyFrame> 5034 scoped_ptr<SpdyFrame>
5125 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5035 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5126 const char kPushedData[] = "pushed"; 5036 const char kPushedData[] = "pushed";
5127 scoped_ptr<SpdyFrame> stream2_body( 5037 scoped_ptr<SpdyFrame> stream2_body(
5128 spdy_util_.ConstructSpdyBodyFrame( 5038 spdy_util_.ConstructSpdyBodyFrame(
5129 2, kPushedData, strlen(kPushedData), true)); 5039 2, kPushedData, strlen(kPushedData), true));
5130 MockRead reads[] = { 5040 MockRead reads[] = {
5131 CreateMockRead(*stream1_reply, 2), 5041 CreateMockRead(*stream1_reply, 1),
5132 CreateMockRead(*stream2_syn, 3), 5042 CreateMockRead(*stream2_syn, 2),
5133 CreateMockRead(*stream2_headers, 4), 5043 CreateMockRead(*stream2_headers, 3),
5134 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 5044 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
5135 CreateMockRead(*stream2_body, 5), 5045 CreateMockRead(*stream2_body, 5),
5136 MockRead(ASYNC, ERR_IO_PENDING, 7), // Force a pause 5046 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
5137 }; 5047 };
5138 5048
5139 HttpResponseInfo response; 5049 HttpResponseInfo response;
5140 HttpResponseInfo response2; 5050 HttpResponseInfo response2;
5141 std::string expected_push_result("pushed"); 5051 std::string expected_push_result("pushed");
5142 OrderedSocketData data(reads, arraysize(reads), 5052 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5143 writes, arraysize(writes));
5144 RunServerPushTest(&data, 5053 RunServerPushTest(&data,
5145 &response, 5054 &response,
5146 &response2, 5055 &response2,
5147 expected_push_result); 5056 expected_push_result);
5148 5057
5149 // Verify the SYN_REPLY. 5058 // Verify the SYN_REPLY.
5150 EXPECT_TRUE(response.headers.get() != NULL); 5059 EXPECT_TRUE(response.headers.get() != NULL);
5151 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 5060 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
5152 5061
5153 // Verify the pushed stream. 5062 // Verify the pushed stream.
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
5519 EXPECT_TRUE(data.at_read_eof()); 5428 EXPECT_TRUE(data.at_read_eof());
5520 EXPECT_TRUE(data.at_write_eof()); 5429 EXPECT_TRUE(data.at_write_eof());
5521 } 5430 }
5522 5431
5523 TEST_P(SpdyNetworkTransactionTest, SynReplyWithHeaders) { 5432 TEST_P(SpdyNetworkTransactionTest, SynReplyWithHeaders) {
5524 scoped_ptr<SpdyFrame> req( 5433 scoped_ptr<SpdyFrame> req(
5525 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5434 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5526 scoped_ptr<SpdyFrame> rst( 5435 scoped_ptr<SpdyFrame> rst(
5527 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 5436 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
5528 MockWrite writes[] = { 5437 MockWrite writes[] = {
5529 CreateMockWrite(*req), CreateMockWrite(*rst), 5438 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
5530 }; 5439 };
5531 5440
5532 scoped_ptr<SpdyFrame> stream1_reply( 5441 scoped_ptr<SpdyFrame> stream1_reply(
5533 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5442 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5534 5443
5535 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5444 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5536 (*late_headers)["hello"] = "bye"; 5445 (*late_headers)["hello"] = "bye";
5537 scoped_ptr<SpdyFrame> stream1_headers( 5446 scoped_ptr<SpdyFrame> stream1_headers(
5538 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5447 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5539 false, 5448 false,
5540 1, 5449 1,
5541 LOWEST, 5450 LOWEST,
5542 HEADERS, 5451 HEADERS,
5543 CONTROL_FLAG_NONE, 5452 CONTROL_FLAG_NONE,
5544 0)); 5453 0));
5545 scoped_ptr<SpdyFrame> stream1_body( 5454 scoped_ptr<SpdyFrame> stream1_body(
5546 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5455 spdy_util_.ConstructSpdyBodyFrame(1, true));
5547 MockRead reads[] = { 5456 MockRead reads[] = {
5548 CreateMockRead(*stream1_reply), 5457 CreateMockRead(*stream1_reply, 1),
5549 CreateMockRead(*stream1_headers), 5458 CreateMockRead(*stream1_headers, 2),
5550 CreateMockRead(*stream1_body), 5459 CreateMockRead(*stream1_body, 3),
5551 MockRead(ASYNC, 0, 0) // EOF 5460 MockRead(ASYNC, 0, 5) // EOF
5552 }; 5461 };
5553 5462
5554 DelayedSocketData data(1, reads, arraysize(reads), 5463 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5555 writes, arraysize(writes));
5556 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5464 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5557 BoundNetLog(), GetParam(), NULL); 5465 BoundNetLog(), GetParam(), NULL);
5558 helper.RunToCompletion(&data); 5466 helper.RunToCompletion(&data);
5559 TransactionHelperResult out = helper.output(); 5467 TransactionHelperResult out = helper.output();
5560 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 5468 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
5561 } 5469 }
5562 5470
5563 TEST_P(SpdyNetworkTransactionTest, SynReplyWithLateHeaders) { 5471 TEST_P(SpdyNetworkTransactionTest, SynReplyWithLateHeaders) {
5564 scoped_ptr<SpdyFrame> req( 5472 scoped_ptr<SpdyFrame> req(
5565 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5473 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5566 scoped_ptr<SpdyFrame> rst( 5474 scoped_ptr<SpdyFrame> rst(
5567 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 5475 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
5568 MockWrite writes[] = { 5476 MockWrite writes[] = {
5569 CreateMockWrite(*req), 5477 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
5570 CreateMockWrite(*rst),
5571 }; 5478 };
5572 5479
5573 scoped_ptr<SpdyFrame> stream1_reply( 5480 scoped_ptr<SpdyFrame> stream1_reply(
5574 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5481 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5575 5482
5576 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5483 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5577 (*late_headers)["hello"] = "bye"; 5484 (*late_headers)["hello"] = "bye";
5578 scoped_ptr<SpdyFrame> stream1_headers( 5485 scoped_ptr<SpdyFrame> stream1_headers(
5579 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5486 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5580 false, 5487 false,
5581 1, 5488 1,
5582 LOWEST, 5489 LOWEST,
5583 HEADERS, 5490 HEADERS,
5584 CONTROL_FLAG_NONE, 5491 CONTROL_FLAG_NONE,
5585 0)); 5492 0));
5586 scoped_ptr<SpdyFrame> stream1_body( 5493 scoped_ptr<SpdyFrame> stream1_body(
5587 spdy_util_.ConstructSpdyBodyFrame(1, false)); 5494 spdy_util_.ConstructSpdyBodyFrame(1, false));
5588 scoped_ptr<SpdyFrame> stream1_body2( 5495 scoped_ptr<SpdyFrame> stream1_body2(
5589 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5496 spdy_util_.ConstructSpdyBodyFrame(1, true));
5590 MockRead reads[] = { 5497 MockRead reads[] = {
5591 CreateMockRead(*stream1_reply), 5498 CreateMockRead(*stream1_reply, 1),
5592 CreateMockRead(*stream1_body), 5499 CreateMockRead(*stream1_body, 2),
5593 CreateMockRead(*stream1_headers), 5500 CreateMockRead(*stream1_headers, 3),
5594 CreateMockRead(*stream1_body2), 5501 CreateMockRead(*stream1_body2, 5),
5595 MockRead(ASYNC, 0, 0) // EOF 5502 MockRead(ASYNC, 0, 6) // EOF
5596 }; 5503 };
5597 5504
5598 DelayedSocketData data(1, reads, arraysize(reads), 5505 DelayedSocketData data(1, reads, arraysize(reads),
5599 writes, arraysize(writes)); 5506 writes, arraysize(writes));
5600 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5507 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5601 BoundNetLog(), GetParam(), NULL); 5508 BoundNetLog(), GetParam(), NULL);
5602 helper.RunToCompletion(&data); 5509 helper.RunToCompletion(&data);
5603 TransactionHelperResult out = helper.output(); 5510 TransactionHelperResult out = helper.output();
5604 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 5511 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
5605 } 5512 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5637 const char* url_to_fetch = kTestCases[index]; 5544 const char* url_to_fetch = kTestCases[index];
5638 const char* url_to_push = kTestCases[index + 1]; 5545 const char* url_to_push = kTestCases[index + 1];
5639 5546
5640 scoped_ptr<SpdyFrame> stream1_syn( 5547 scoped_ptr<SpdyFrame> stream1_syn(
5641 spdy_util_.ConstructSpdyGet(url_to_fetch, false, 1, LOWEST)); 5548 spdy_util_.ConstructSpdyGet(url_to_fetch, false, 1, LOWEST));
5642 scoped_ptr<SpdyFrame> stream1_body( 5549 scoped_ptr<SpdyFrame> stream1_body(
5643 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5550 spdy_util_.ConstructSpdyBodyFrame(1, true));
5644 scoped_ptr<SpdyFrame> push_rst( 5551 scoped_ptr<SpdyFrame> push_rst(
5645 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 5552 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
5646 MockWrite writes[] = { 5553 MockWrite writes[] = {
5647 CreateMockWrite(*stream1_syn, 1), 5554 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*push_rst, 3),
5648 CreateMockWrite(*push_rst, 4),
5649 }; 5555 };
5650 5556
5651 scoped_ptr<SpdyFrame> 5557 scoped_ptr<SpdyFrame>
5652 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5558 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5653 scoped_ptr<SpdyFrame> 5559 scoped_ptr<SpdyFrame>
5654 stream2_syn(spdy_util_.ConstructSpdyPush(NULL, 5560 stream2_syn(spdy_util_.ConstructSpdyPush(NULL,
5655 0, 5561 0,
5656 2, 5562 2,
5657 1, 5563 1,
5658 url_to_push)); 5564 url_to_push));
5659 const char kPushedData[] = "pushed"; 5565 const char kPushedData[] = "pushed";
5660 scoped_ptr<SpdyFrame> stream2_body( 5566 scoped_ptr<SpdyFrame> stream2_body(
5661 spdy_util_.ConstructSpdyBodyFrame( 5567 spdy_util_.ConstructSpdyBodyFrame(
5662 2, kPushedData, strlen(kPushedData), true)); 5568 2, kPushedData, strlen(kPushedData), true));
5663 scoped_ptr<SpdyFrame> rst( 5569 scoped_ptr<SpdyFrame> rst(
5664 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); 5570 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL));
5665 5571
5666 MockRead reads[] = { 5572 MockRead reads[] = {
5667 CreateMockRead(*stream1_reply, 2), 5573 CreateMockRead(*stream1_reply, 1),
5668 CreateMockRead(*stream2_syn, 3), 5574 CreateMockRead(*stream2_syn, 2),
5669 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 5575 CreateMockRead(*stream1_body, 4),
5670 CreateMockRead(*stream2_body, 6), 5576 CreateMockRead(*stream2_body, 5),
5671 MockRead(ASYNC, ERR_IO_PENDING, 7), // Force a pause 5577 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
5672 }; 5578 };
5673 5579
5674 HttpResponseInfo response; 5580 HttpResponseInfo response;
5675 OrderedSocketData data(reads, arraysize(reads), 5581 SequencedSocketData data(reads, arraysize(reads), writes,
5676 writes, arraysize(writes)); 5582 arraysize(writes));
5677 5583
5678 HttpRequestInfo request; 5584 HttpRequestInfo request;
5679 request.method = "GET"; 5585 request.method = "GET";
5680 request.url = GURL(url_to_fetch); 5586 request.url = GURL(url_to_fetch);
5681 request.load_flags = 0; 5587 request.load_flags = 0;
5682 5588
5683 // Enable cross-origin push. Since we are not using a proxy, this should 5589 // Enable cross-origin push. Since we are not using a proxy, this should
5684 // not actually enable cross-origin SPDY push. 5590 // not actually enable cross-origin SPDY push.
5685 scoped_ptr<SpdySessionDependencies> session_deps( 5591 scoped_ptr<SpdySessionDependencies> session_deps(
5686 CreateSpdySessionDependencies(GetParam())); 5592 CreateSpdySessionDependencies(GetParam()));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5720 } 5626 }
5721 } 5627 }
5722 5628
5723 TEST_P(SpdyNetworkTransactionTest, RetryAfterRefused) { 5629 TEST_P(SpdyNetworkTransactionTest, RetryAfterRefused) {
5724 // Construct the request. 5630 // Construct the request.
5725 scoped_ptr<SpdyFrame> req( 5631 scoped_ptr<SpdyFrame> req(
5726 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5632 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5727 scoped_ptr<SpdyFrame> req2( 5633 scoped_ptr<SpdyFrame> req2(
5728 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 5634 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
5729 MockWrite writes[] = { 5635 MockWrite writes[] = {
5730 CreateMockWrite(*req, 1), 5636 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 2),
5731 CreateMockWrite(*req2, 3),
5732 }; 5637 };
5733 5638
5734 scoped_ptr<SpdyFrame> refused( 5639 scoped_ptr<SpdyFrame> refused(
5735 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); 5640 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM));
5736 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 5641 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
5737 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(3, true)); 5642 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(3, true));
5738 MockRead reads[] = { 5643 MockRead reads[] = {
5739 CreateMockRead(*refused, 2), 5644 CreateMockRead(*refused, 1),
5740 CreateMockRead(*resp, 4), 5645 CreateMockRead(*resp, 3),
5741 CreateMockRead(*body, 5), 5646 CreateMockRead(*body, 4),
5742 MockRead(ASYNC, 0, 6) // EOF 5647 MockRead(ASYNC, 0, 5) // EOF
5743 }; 5648 };
5744 5649
5745 OrderedSocketData data(reads, arraysize(reads), 5650 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5746 writes, arraysize(writes));
5747 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5651 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5748 BoundNetLog(), GetParam(), NULL); 5652 BoundNetLog(), GetParam(), NULL);
5749 5653
5750 helper.RunPreTestSetup(); 5654 helper.RunPreTestSetup();
5751 helper.AddData(&data); 5655 helper.AddData(&data);
5752 5656
5753 HttpNetworkTransaction* trans = helper.trans(); 5657 HttpNetworkTransaction* trans = helper.trans();
5754 5658
5755 // Start the transaction with basic parameters. 5659 // Start the transaction with basic parameters.
5756 TestCompletionCallback callback; 5660 TestCompletionCallback callback;
5757 int rv = trans->Start( 5661 int rv = trans->Start(
5758 &CreateGetRequest(), callback.callback(), BoundNetLog()); 5662 &CreateGetRequest(), callback.callback(), BoundNetLog());
5759 EXPECT_EQ(ERR_IO_PENDING, rv); 5663 EXPECT_EQ(ERR_IO_PENDING, rv);
5760 rv = callback.WaitForResult(); 5664 rv = callback.WaitForResult();
5761 EXPECT_EQ(OK, rv); 5665 EXPECT_EQ(OK, rv);
5762 5666
5763 // Verify that we consumed all test data. 5667 // Verify that we consumed all test data.
5764 EXPECT_TRUE(data.at_read_eof()) << "Read count: " 5668 EXPECT_TRUE(data.AllReadDataConsumed());
5765 << data.read_count() 5669 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 5670
5773 // Verify the SYN_REPLY. 5671 // Verify the SYN_REPLY.
5774 HttpResponseInfo response = *trans->GetResponseInfo(); 5672 HttpResponseInfo response = *trans->GetResponseInfo();
5775 EXPECT_TRUE(response.headers.get() != NULL); 5673 EXPECT_TRUE(response.headers.get() != NULL);
5776 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 5674 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
5777 } 5675 }
5778 5676
5779 TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) { 5677 TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) {
5780 // This first request will start to establish the SpdySession. 5678 // This first request will start to establish the SpdySession.
5781 // Then we will start the second (MEDIUM priority) and then third 5679 // Then we will start the second (MEDIUM priority) and then third
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after
6544 MockRead reads[] = {CreateMockRead(*push, 1)}; 6442 MockRead reads[] = {CreateMockRead(*push, 1)};
6545 6443
6546 scoped_ptr<SpdyFrame> req( 6444 scoped_ptr<SpdyFrame> req(
6547 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6445 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6548 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 6446 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
6549 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id.")); 6447 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id."));
6550 MockWrite writes[] = { 6448 MockWrite writes[] = {
6551 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2), 6449 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2),
6552 }; 6450 };
6553 6451
6554 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 6452 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6555 NormalSpdyTransactionHelper helper( 6453 NormalSpdyTransactionHelper helper(
6556 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6454 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6557 helper.RunToCompletion(&data); 6455 helper.RunToCompletion(&data);
6558 TransactionHelperResult out = helper.output(); 6456 TransactionHelperResult out = helper.output();
6559 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 6457 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
6560 } 6458 }
6561 6459
6562 TEST_P(SpdyNetworkTransactionTest, 6460 TEST_P(SpdyNetworkTransactionTest,
6563 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) { 6461 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) {
6564 if (spdy_util_.spdy_version() < SPDY3) 6462 if (spdy_util_.spdy_version() < SPDY3)
(...skipping 13 matching lines...) Expand all
6578 scoped_ptr<SpdyFrame> req( 6476 scoped_ptr<SpdyFrame> req(
6579 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6477 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6580 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 6478 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
6581 4, 6479 4,
6582 GOAWAY_PROTOCOL_ERROR, 6480 GOAWAY_PROTOCOL_ERROR,
6583 "New push stream id must be greater than the last accepted.")); 6481 "New push stream id must be greater than the last accepted."));
6584 MockWrite writes[] = { 6482 MockWrite writes[] = {
6585 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3), 6483 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3),
6586 }; 6484 };
6587 6485
6588 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 6486 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6589 NormalSpdyTransactionHelper helper( 6487 NormalSpdyTransactionHelper helper(
6590 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6488 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6591 helper.RunToCompletion(&data); 6489 helper.RunToCompletion(&data);
6592 TransactionHelperResult out = helper.output(); 6490 TransactionHelperResult out = helper.output();
6593 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 6491 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
6594 } 6492 }
6595 6493
6596 class SpdyNetworkTransactionNoTLSUsageCheckTest 6494 class SpdyNetworkTransactionNoTLSUsageCheckTest
6597 : public SpdyNetworkTransactionTest { 6495 : public SpdyNetworkTransactionTest {
6598 protected: 6496 protected:
6599 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { 6497 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
6600 // Construct the request. 6498 // Construct the request.
6601 scoped_ptr<SpdyFrame> req( 6499 scoped_ptr<SpdyFrame> req(
6602 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6500 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6603 MockWrite writes[] = {CreateMockWrite(*req)}; 6501 MockWrite writes[] = {CreateMockWrite(*req, 0)};
6604 6502
6605 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 6503 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
6606 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6504 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
6607 MockRead reads[] = { 6505 MockRead reads[] = {
6608 CreateMockRead(*resp), CreateMockRead(*body), 6506 CreateMockRead(*resp, 1),
6609 MockRead(ASYNC, 0, 0) // EOF 6507 CreateMockRead(*body, 2),
6508 MockRead(ASYNC, 0, 3) // EOF
6610 }; 6509 };
6611 6510
6612 DelayedSocketData data( 6511 SequencedSocketData data(reads, arraysize(reads), writes,
6613 1, reads, arraysize(reads), writes, arraysize(writes)); 6512 arraysize(writes));
6614 HttpRequestInfo request; 6513 HttpRequestInfo request;
6615 request.method = "GET"; 6514 request.method = "GET";
6616 request.url = GURL("https://www.example.org/"); 6515 request.url = GURL("https://www.example.org/");
6617 NormalSpdyTransactionHelper helper( 6516 NormalSpdyTransactionHelper helper(
6618 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6517 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6619 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); 6518 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass());
6620 TransactionHelperResult out = helper.output(); 6519 TransactionHelperResult out = helper.output();
6621 EXPECT_EQ(OK, out.rv); 6520 EXPECT_EQ(OK, out.rv);
6622 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 6521 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
6623 EXPECT_EQ("hello!", out.response_data); 6522 EXPECT_EQ("hello!", out.response_data);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6655 } 6554 }
6656 6555
6657 class SpdyNetworkTransactionTLSUsageCheckTest 6556 class SpdyNetworkTransactionTLSUsageCheckTest
6658 : public SpdyNetworkTransactionTest { 6557 : public SpdyNetworkTransactionTest {
6659 protected: 6558 protected:
6660 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { 6559 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
6661 scoped_ptr<SpdyFrame> goaway( 6560 scoped_ptr<SpdyFrame> goaway(
6662 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, "")); 6561 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, ""));
6663 MockWrite writes[] = {CreateMockWrite(*goaway)}; 6562 MockWrite writes[] = {CreateMockWrite(*goaway)};
6664 6563
6665 DelayedSocketData data(1, NULL, 0, writes, arraysize(writes)); 6564 StaticSocketDataProvider data(NULL, 0, writes, arraysize(writes));
6666 HttpRequestInfo request; 6565 HttpRequestInfo request;
6667 request.method = "GET"; 6566 request.method = "GET";
6668 request.url = GURL("https://www.example.org/"); 6567 request.url = GURL("https://www.example.org/");
6669 NormalSpdyTransactionHelper helper( 6568 NormalSpdyTransactionHelper helper(
6670 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6569 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6671 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); 6570 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass());
6672 TransactionHelperResult out = helper.output(); 6571 TransactionHelperResult out = helper.output();
6673 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv); 6572 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv);
6674 } 6573 }
6675 }; 6574 };
(...skipping 17 matching lines...) Expand all
6693 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { 6592 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) {
6694 scoped_ptr<SSLSocketDataProvider> ssl_provider( 6593 scoped_ptr<SSLSocketDataProvider> ssl_provider(
6695 new SSLSocketDataProvider(ASYNC, OK)); 6594 new SSLSocketDataProvider(ASYNC, OK));
6696 // Set to TLS_RSA_WITH_NULL_MD5 6595 // Set to TLS_RSA_WITH_NULL_MD5
6697 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); 6596 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
6698 6597
6699 RunTLSUsageCheckTest(ssl_provider.Pass()); 6598 RunTLSUsageCheckTest(ssl_provider.Pass());
6700 } 6599 }
6701 6600
6702 } // namespace net 6601 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698