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

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: Format 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)->AllReadDataConsumed()) 273 EXPECT_TRUE(provider->AllWriteDataConsumed());
274 << "Read count: " << (*it)->read_count()
275 << " Read index: " << (*it)->read_index();
276 EXPECT_TRUE((*it)->AllWriteDataConsumed())
277 << "Write count: " << (*it)->write_count()
278 << " Write index: " << (*it)->write_index();
279 } 274 }
280 } 275 }
281 276
282 // 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
283 // 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
284 // not processed. 279 // not processed.
285 void VerifyDataNotConsumed() { 280 void VerifyDataNotConsumed() {
286 for (DataVector::iterator it = data_vector_.begin(); 281 for (const SocketDataProvider* provider : data_vector_) {
287 it != data_vector_.end(); ++it) { 282 EXPECT_FALSE(provider->AllReadDataConsumed());
288 EXPECT_TRUE(!(*it)->AllReadDataConsumed()) 283 EXPECT_FALSE(provider->AllWriteDataConsumed());
289 << "Read count: " << (*it)->read_count()
290 << " Read index: " << (*it)->read_index();
291 EXPECT_TRUE(!(*it)->AllWriteDataConsumed())
292 << "Write count: " << (*it)->write_count()
293 << " Write index: " << (*it)->write_index();
294 } 284 }
295 } 285 }
296 286
297 void RunToCompletion(StaticSocketDataProvider* data) { 287 void RunToCompletion(SocketDataProvider* data) {
298 RunPreTestSetup(); 288 RunPreTestSetup();
299 AddData(data); 289 AddData(data);
300 RunDefaultTest(); 290 RunDefaultTest();
301 VerifyDataConsumed(); 291 VerifyDataConsumed();
302 } 292 }
303 293
304 void RunToCompletionWithSSLData( 294 void RunToCompletionWithSSLData(
305 StaticSocketDataProvider* data, 295 SocketDataProvider* data,
306 scoped_ptr<SSLSocketDataProvider> ssl_provider) { 296 scoped_ptr<SSLSocketDataProvider> ssl_provider) {
307 RunPreTestSetup(); 297 RunPreTestSetup();
308 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass()); 298 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass());
309 RunDefaultTest(); 299 RunDefaultTest();
310 VerifyDataConsumed(); 300 VerifyDataConsumed();
311 } 301 }
312 302
313 void AddData(StaticSocketDataProvider* data) { 303 void AddData(SocketDataProvider* data) {
314 scoped_ptr<SSLSocketDataProvider> ssl_provider( 304 scoped_ptr<SSLSocketDataProvider> ssl_provider(
315 new SSLSocketDataProvider(ASYNC, OK)); 305 new SSLSocketDataProvider(ASYNC, OK));
316 ssl_provider->cert = 306 ssl_provider->cert =
317 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 307 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
318 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass()); 308 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass());
319 } 309 }
320 310
321 void AddDataWithSSLSocketDataProvider( 311 void AddDataWithSSLSocketDataProvider(
322 StaticSocketDataProvider* data, 312 SocketDataProvider* data,
323 scoped_ptr<SSLSocketDataProvider> ssl_provider) { 313 scoped_ptr<SSLSocketDataProvider> ssl_provider) {
324 DCHECK(!deterministic_); 314 DCHECK(!deterministic_);
325 data_vector_.push_back(data); 315 data_vector_.push_back(data);
326 if (ssl_provider->next_proto_status == 316 if (ssl_provider->next_proto_status ==
327 SSLClientSocket::kNextProtoUnsupported) { 317 SSLClientSocket::kNextProtoUnsupported) {
328 ssl_provider->SetNextProto(test_params_.protocol); 318 ssl_provider->SetNextProto(test_params_.protocol);
329 } 319 }
330 320
331 session_deps_->socket_factory->AddSSLSocketDataProvider( 321 session_deps_->socket_factory->AddSSLSocketDataProvider(
332 ssl_provider.get()); 322 ssl_provider.get());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 } 370 }
381 scoped_ptr<SpdySessionDependencies>& session_deps() { 371 scoped_ptr<SpdySessionDependencies>& session_deps() {
382 return session_deps_; 372 return session_deps_;
383 } 373 }
384 int port() const { return port_; } 374 int port() const { return port_; }
385 SpdyNetworkTransactionTestParams test_params() const { 375 SpdyNetworkTransactionTestParams test_params() const {
386 return test_params_; 376 return test_params_;
387 } 377 }
388 378
389 private: 379 private:
390 typedef std::vector<StaticSocketDataProvider*> DataVector; 380 typedef std::vector<SocketDataProvider*> DataVector;
391 typedef ScopedVector<SSLSocketDataProvider> SSLVector; 381 typedef ScopedVector<SSLSocketDataProvider> SSLVector;
392 typedef ScopedVector<StaticSocketDataProvider> AlternateVector; 382 typedef ScopedVector<SocketDataProvider> AlternateVector;
393 typedef ScopedVector<DeterministicSocketData> AlternateDeterministicVector; 383 typedef ScopedVector<DeterministicSocketData> AlternateDeterministicVector;
394 HttpRequestInfo request_; 384 HttpRequestInfo request_;
395 RequestPriority priority_; 385 RequestPriority priority_;
396 scoped_ptr<SpdySessionDependencies> session_deps_; 386 scoped_ptr<SpdySessionDependencies> session_deps_;
397 scoped_refptr<HttpNetworkSession> session_; 387 scoped_refptr<HttpNetworkSession> session_;
398 TransactionHelperResult output_; 388 TransactionHelperResult output_;
399 scoped_ptr<StaticSocketDataProvider> first_transaction_; 389 scoped_ptr<SocketDataProvider> first_transaction_;
400 SSLVector ssl_vector_; 390 SSLVector ssl_vector_;
401 TestCompletionCallback callback_; 391 TestCompletionCallback callback_;
402 scoped_ptr<HttpNetworkTransaction> trans_; 392 scoped_ptr<HttpNetworkTransaction> trans_;
403 scoped_ptr<HttpNetworkTransaction> trans_http_; 393 scoped_ptr<HttpNetworkTransaction> trans_http_;
404 DataVector data_vector_; 394 DataVector data_vector_;
405 AlternateVector alternate_vector_; 395 AlternateVector alternate_vector_;
406 AlternateDeterministicVector alternate_deterministic_vector_; 396 AlternateDeterministicVector alternate_deterministic_vector_;
407 const BoundNetLog log_; 397 const BoundNetLog log_;
408 SpdyNetworkTransactionTestParams test_params_; 398 SpdyNetworkTransactionTestParams test_params_;
409 int port_; 399 int port_;
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 chunked_post_request_initialized_ = true; 546 chunked_post_request_initialized_ = true;
557 } 547 }
558 return chunked_post_request_; 548 return chunked_post_request_;
559 } 549 }
560 550
561 // 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
562 // 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
563 // to skip over data destined for other transactions while we consume 553 // to skip over data destined for other transactions while we consume
564 // the data for |trans|. 554 // the data for |trans|.
565 int ReadResult(HttpNetworkTransaction* trans, 555 int ReadResult(HttpNetworkTransaction* trans,
566 StaticSocketDataProvider* data, 556 SocketDataProvider* data,
567 std::string* result) { 557 std::string* result) {
568 const int kSize = 3000; 558 const int kSize = 3000;
569 559
570 int bytes_read = 0; 560 int bytes_read = 0;
571 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kSize)); 561 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kSize));
572 TestCompletionCallback callback; 562 TestCompletionCallback callback;
573 while (true) { 563 while (true) {
574 int rv = trans->Read(buf.get(), kSize, callback.callback()); 564 int rv = trans->Read(buf.get(), kSize, callback.callback());
575 if (rv == ERR_IO_PENDING) { 565 if (rv == ERR_IO_PENDING) {
576 // Multiple transactions may be in the data set. Keep pulling off
577 // reads until we complete our callback.
578 while (!callback.have_result()) {
579 data->CompleteRead();
580 base::RunLoop().RunUntilIdle();
581 }
582 rv = callback.WaitForResult(); 566 rv = callback.WaitForResult();
583 } else if (rv <= 0) { 567 } else if (rv <= 0) {
584 break; 568 break;
585 } 569 }
586 result->append(buf->data(), rv); 570 result->append(buf->data(), rv);
587 bytes_read += rv; 571 bytes_read += rv;
588 } 572 }
589 return bytes_read; 573 return bytes_read;
590 } 574 }
591 575
592 void VerifyStreamsClosed(const NormalSpdyTransactionHelper& helper) { 576 void VerifyStreamsClosed(const NormalSpdyTransactionHelper& helper) {
593 // 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
594 // 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
595 // all closed and not leaked at this point. 579 // all closed and not leaked at this point.
596 const GURL& url = helper.request().url; 580 const GURL& url = helper.request().url;
597 HostPortPair host_port_pair(url.host(), 443); 581 HostPortPair host_port_pair(url.host(), 443);
598 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 582 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
599 PRIVACY_MODE_DISABLED); 583 PRIVACY_MODE_DISABLED);
600 BoundNetLog log; 584 BoundNetLog log;
601 const scoped_refptr<HttpNetworkSession>& session = helper.session(); 585 const scoped_refptr<HttpNetworkSession>& session = helper.session();
602 base::WeakPtr<SpdySession> spdy_session = 586 base::WeakPtr<SpdySession> spdy_session =
603 session->spdy_session_pool()->FindAvailableSession(key, log); 587 session->spdy_session_pool()->FindAvailableSession(key, log);
604 ASSERT_TRUE(spdy_session != NULL); 588 ASSERT_TRUE(spdy_session != NULL);
605 EXPECT_EQ(0u, spdy_session->num_active_streams()); 589 EXPECT_EQ(0u, spdy_session->num_active_streams());
606 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams()); 590 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams());
607 } 591 }
608 592
609 void RunServerPushTest(OrderedSocketData* data, 593 void RunServerPushTest(SequencedSocketData* data,
610 HttpResponseInfo* response, 594 HttpResponseInfo* response,
611 HttpResponseInfo* push_response, 595 HttpResponseInfo* push_response,
612 const std::string& expected) { 596 const std::string& expected) {
613 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 597 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
614 BoundNetLog(), GetParam(), NULL); 598 BoundNetLog(), GetParam(), NULL);
615 helper.RunPreTestSetup(); 599 helper.RunPreTestSetup();
616 helper.AddData(data); 600 helper.AddData(data);
617 601
618 HttpNetworkTransaction* trans = helper.trans(); 602 HttpNetworkTransaction* trans = helper.trans();
619 603
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 scoped_refptr<HttpNetworkSession> session( 724 scoped_refptr<HttpNetworkSession> session(
741 SpdySessionDependencies::SpdyCreateSession(session_deps.get())); 725 SpdySessionDependencies::SpdyCreateSession(session_deps.get()));
742 scoped_ptr<HttpTransaction> trans( 726 scoped_ptr<HttpTransaction> trans(
743 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 727 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
744 } 728 }
745 729
746 TEST_P(SpdyNetworkTransactionTest, Get) { 730 TEST_P(SpdyNetworkTransactionTest, Get) {
747 // Construct the request. 731 // Construct the request.
748 scoped_ptr<SpdyFrame> req( 732 scoped_ptr<SpdyFrame> req(
749 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 733 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
750 MockWrite writes[] = { CreateMockWrite(*req) }; 734 MockWrite writes[] = {CreateMockWrite(*req, 0)};
751 735
752 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 736 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
753 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 737 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
754 MockRead reads[] = { 738 MockRead reads[] = {
755 CreateMockRead(*resp), 739 CreateMockRead(*resp, 1),
756 CreateMockRead(*body), 740 CreateMockRead(*body, 2),
757 MockRead(ASYNC, 0, 0) // EOF 741 MockRead(ASYNC, 0, 3) // EOF
758 }; 742 };
759 743
760 DelayedSocketData data(1, reads, arraysize(reads), 744 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
761 writes, arraysize(writes));
762 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 745 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
763 BoundNetLog(), GetParam(), NULL); 746 BoundNetLog(), GetParam(), NULL);
764 helper.RunToCompletion(&data); 747 helper.RunToCompletion(&data);
765 TransactionHelperResult out = helper.output(); 748 TransactionHelperResult out = helper.output();
766 EXPECT_EQ(OK, out.rv); 749 EXPECT_EQ(OK, out.rv);
767 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 750 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
768 EXPECT_EQ("hello!", out.response_data); 751 EXPECT_EQ("hello!", out.response_data);
769 } 752 }
770 753
771 TEST_P(SpdyNetworkTransactionTest, GetAtEachPriority) { 754 TEST_P(SpdyNetworkTransactionTest, GetAtEachPriority) {
772 for (RequestPriority p = MINIMUM_PRIORITY; p <= MAXIMUM_PRIORITY; 755 for (RequestPriority p = MINIMUM_PRIORITY; p <= MAXIMUM_PRIORITY;
773 p = RequestPriority(p + 1)) { 756 p = RequestPriority(p + 1)) {
774 // Construct the request. 757 // Construct the request.
775 scoped_ptr<SpdyFrame> req( 758 scoped_ptr<SpdyFrame> req(
776 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, p, true)); 759 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, p, true));
777 MockWrite writes[] = { CreateMockWrite(*req) }; 760 MockWrite writes[] = {CreateMockWrite(*req, 0)};
778 761
779 SpdyPriority spdy_prio = 0; 762 SpdyPriority spdy_prio = 0;
780 EXPECT_TRUE(GetSpdyPriority(spdy_util_.spdy_version(), *req, &spdy_prio)); 763 EXPECT_TRUE(GetSpdyPriority(spdy_util_.spdy_version(), *req, &spdy_prio));
781 // this repeats the RequestPriority-->SpdyPriority mapping from 764 // this repeats the RequestPriority-->SpdyPriority mapping from
782 // SpdyFramer::ConvertRequestPriorityToSpdyPriority to make 765 // SpdyFramer::ConvertRequestPriorityToSpdyPriority to make
783 // sure it's being done right. 766 // sure it's being done right.
784 if (spdy_util_.spdy_version() < SPDY3) { 767 if (spdy_util_.spdy_version() < SPDY3) {
785 switch (p) { 768 switch (p) {
786 case HIGHEST: 769 case HIGHEST:
787 EXPECT_EQ(0, spdy_prio); 770 EXPECT_EQ(0, spdy_prio);
(...skipping 29 matching lines...) Expand all
817 EXPECT_EQ(4, spdy_prio); 800 EXPECT_EQ(4, spdy_prio);
818 break; 801 break;
819 default: 802 default:
820 FAIL(); 803 FAIL();
821 } 804 }
822 } 805 }
823 806
824 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 807 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
825 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 808 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
826 MockRead reads[] = { 809 MockRead reads[] = {
827 CreateMockRead(*resp), 810 CreateMockRead(*resp, 1),
828 CreateMockRead(*body), 811 CreateMockRead(*body, 2),
829 MockRead(ASYNC, 0, 0) // EOF 812 MockRead(ASYNC, 0, 3) // EOF
830 }; 813 };
831 814
832 DelayedSocketData data(1, reads, arraysize(reads), 815 SequencedSocketData data(reads, arraysize(reads), writes,
833 writes, arraysize(writes)); 816 arraysize(writes));
834 HttpRequestInfo http_req = CreateGetRequest(); 817 HttpRequestInfo http_req = CreateGetRequest();
835 818
836 NormalSpdyTransactionHelper helper(http_req, p, BoundNetLog(), 819 NormalSpdyTransactionHelper helper(http_req, p, BoundNetLog(),
837 GetParam(), NULL); 820 GetParam(), NULL);
838 helper.RunToCompletion(&data); 821 helper.RunToCompletion(&data);
839 TransactionHelperResult out = helper.output(); 822 TransactionHelperResult out = helper.output();
840 EXPECT_EQ(OK, out.rv); 823 EXPECT_EQ(OK, out.rv);
841 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 824 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
842 EXPECT_EQ("hello!", out.response_data); 825 EXPECT_EQ("hello!", out.response_data);
843 } 826 }
(...skipping 22 matching lines...) Expand all
866 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 849 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false));
867 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 850 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true));
868 851
869 scoped_ptr<SpdyFrame> req3( 852 scoped_ptr<SpdyFrame> req3(
870 spdy_util_.ConstructSpdyGet(NULL, 0, false, 5, LOWEST, true)); 853 spdy_util_.ConstructSpdyGet(NULL, 0, false, 5, LOWEST, true));
871 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 854 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5));
872 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, false)); 855 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, false));
873 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(5, true)); 856 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(5, true));
874 857
875 MockWrite writes[] = { 858 MockWrite writes[] = {
876 CreateMockWrite(*req), 859 CreateMockWrite(*req, 0),
877 CreateMockWrite(*req2), 860 CreateMockWrite(*req2, 3),
878 CreateMockWrite(*req3), 861 CreateMockWrite(*req3, 6),
879 }; 862 };
880 MockRead reads[] = { 863 MockRead reads[] = {
881 CreateMockRead(*resp, 1), 864 CreateMockRead(*resp, 1),
882 CreateMockRead(*body), 865 CreateMockRead(*body, 2),
883 CreateMockRead(*resp2, 4), 866 CreateMockRead(*resp2, 4),
884 CreateMockRead(*body2), 867 CreateMockRead(*body2, 5),
885 CreateMockRead(*resp3, 7), 868 CreateMockRead(*resp3, 7),
886 CreateMockRead(*body3), 869 CreateMockRead(*body3, 8),
887 870
888 CreateMockRead(*fbody), 871 CreateMockRead(*fbody, 9),
889 CreateMockRead(*fbody2), 872 CreateMockRead(*fbody2, 10),
890 CreateMockRead(*fbody3), 873 CreateMockRead(*fbody3, 11),
891 874
892 MockRead(ASYNC, 0, 0), // EOF 875 MockRead(ASYNC, 0, 12), // EOF
893 }; 876 };
894 OrderedSocketData data(reads, arraysize(reads), 877 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
895 writes, arraysize(writes)); 878 SequencedSocketData data_placeholder(NULL, 0, NULL, 0);
896 OrderedSocketData data_placeholder(NULL, 0, NULL, 0);
897 879
898 BoundNetLog log; 880 BoundNetLog log;
899 TransactionHelperResult out; 881 TransactionHelperResult out;
900 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 882 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
901 BoundNetLog(), GetParam(), NULL); 883 BoundNetLog(), GetParam(), NULL);
902 helper.RunPreTestSetup(); 884 helper.RunPreTestSetup();
903 helper.AddData(&data); 885 helper.AddData(&data);
904 // 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
905 // 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
906 // 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
957 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 939 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false));
958 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 940 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true));
959 941
960 scoped_ptr<SpdyFrame> req2( 942 scoped_ptr<SpdyFrame> req2(
961 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 943 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
962 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 944 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
963 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 945 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false));
964 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 946 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true));
965 947
966 MockWrite writes[] = { 948 MockWrite writes[] = {
967 CreateMockWrite(*req), 949 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 3),
968 CreateMockWrite(*req2),
969 }; 950 };
970 MockRead reads[] = { 951 MockRead reads[] = {
971 CreateMockRead(*resp, 1), 952 CreateMockRead(*resp, 1),
972 CreateMockRead(*body), 953 CreateMockRead(*body, 2),
973 CreateMockRead(*resp2, 4), 954 CreateMockRead(*resp2, 4),
974 CreateMockRead(*body2), 955 CreateMockRead(*body2, 5),
975 CreateMockRead(*fbody), 956 CreateMockRead(*fbody, 6),
976 CreateMockRead(*fbody2), 957 CreateMockRead(*fbody2, 7),
977 MockRead(ASYNC, 0, 0), // EOF 958 MockRead(ASYNC, 0, 8), // EOF
978 }; 959 };
979 OrderedSocketData data(reads, arraysize(reads), 960 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
980 writes, arraysize(writes));
981 961
982 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); 962 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING);
983 OrderedSocketData data_placeholder(NULL, 0, NULL, 0); 963 SequencedSocketData data_placeholder(NULL, 0, NULL, 0);
984 data_placeholder.set_connect_data(never_finishing_connect); 964 data_placeholder.set_connect_data(never_finishing_connect);
985 965
986 BoundNetLog log; 966 BoundNetLog log;
987 TransactionHelperResult out; 967 TransactionHelperResult out;
988 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 968 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
989 BoundNetLog(), GetParam(), NULL); 969 BoundNetLog(), GetParam(), NULL);
990 helper.RunPreTestSetup(); 970 helper.RunPreTestSetup();
991 helper.AddData(&data); 971 helper.AddData(&data);
992 // We require placeholder data because two requests are sent out at 972 // We require placeholder data because two requests are sent out at
993 // 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
1044 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1024 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false));
1045 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1025 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true));
1046 1026
1047 scoped_ptr<SpdyFrame> req2( 1027 scoped_ptr<SpdyFrame> req2(
1048 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 1028 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
1049 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1029 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1050 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 1030 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false));
1051 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 1031 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true));
1052 1032
1053 MockWrite writes[] = { 1033 MockWrite writes[] = {
1054 CreateMockWrite(*req), 1034 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 3),
1055 CreateMockWrite(*req2),
1056 }; 1035 };
1057 MockRead reads[] = { 1036 MockRead reads[] = {
1058 CreateMockRead(*resp, 1), 1037 CreateMockRead(*resp, 1),
1059 CreateMockRead(*body), 1038 CreateMockRead(*body, 2),
1060 CreateMockRead(*resp2, 4), 1039 CreateMockRead(*resp2, 4),
1061 CreateMockRead(*body2), 1040 CreateMockRead(*body2, 5),
1062 CreateMockRead(*fbody), 1041 CreateMockRead(*fbody, 6),
1063 CreateMockRead(*fbody2), 1042 CreateMockRead(*fbody2, 7),
1064 MockRead(ASYNC, 0, 0), // EOF 1043 MockRead(ASYNC, 0, 8), // EOF
1065 }; 1044 };
1066 OrderedSocketData preconnect_data(reads, arraysize(reads), 1045 SequencedSocketData preconnect_data(reads, arraysize(reads), writes,
1067 writes, arraysize(writes)); 1046 arraysize(writes));
1068 1047
1069 MockConnect never_finishing_connect(ASYNC, ERR_IO_PENDING); 1048 MockConnect never_finishing_connect(ASYNC, ERR_IO_PENDING);
1070 1049
1071 OrderedSocketData data_placeholder(NULL, 0, NULL, 0); 1050 SequencedSocketData data_placeholder(NULL, 0, NULL, 0);
1072 data_placeholder.set_connect_data(never_finishing_connect); 1051 data_placeholder.set_connect_data(never_finishing_connect);
1073 1052
1074 BoundNetLog log; 1053 BoundNetLog log;
1075 TransactionHelperResult out; 1054 TransactionHelperResult out;
1076 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1055 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1077 BoundNetLog(), GetParam(), NULL); 1056 BoundNetLog(), GetParam(), NULL);
1078 helper.RunPreTestSetup(); 1057 helper.RunPreTestSetup();
1079 helper.AddData(&preconnect_data); 1058 helper.AddData(&preconnect_data);
1080 // We require placeholder data because 3 connections are attempted (first is 1059 // We require placeholder data because 3 connections are attempted (first is
1081 // 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
1163 1142
1164 SettingsMap settings; 1143 SettingsMap settings;
1165 const uint32 max_concurrent_streams = 1; 1144 const uint32 max_concurrent_streams = 1;
1166 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1145 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1167 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1146 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1168 scoped_ptr<SpdyFrame> settings_frame( 1147 scoped_ptr<SpdyFrame> settings_frame(
1169 spdy_util_.ConstructSpdySettings(settings)); 1148 spdy_util_.ConstructSpdySettings(settings));
1170 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1149 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck());
1171 1150
1172 MockWrite writes[] = { 1151 MockWrite writes[] = {
1173 CreateMockWrite(*req), 1152 CreateMockWrite(*req, 0),
1174 CreateMockWrite(*settings_ack, 2), 1153 CreateMockWrite(*settings_ack, 5),
1175 CreateMockWrite(*req2), 1154 CreateMockWrite(*req2, 6),
1176 CreateMockWrite(*req3), 1155 CreateMockWrite(*req3, 10),
1177 }; 1156 };
1178 1157
1179 MockRead reads[] = { 1158 MockRead reads[] = {
1180 CreateMockRead(*settings_frame, 1), 1159 CreateMockRead(*settings_frame, 1),
1181 CreateMockRead(*resp), 1160 CreateMockRead(*resp, 2),
1182 CreateMockRead(*body), 1161 CreateMockRead(*body, 3),
1183 CreateMockRead(*fbody), 1162 CreateMockRead(*fbody, 4),
1184 CreateMockRead(*resp2, 8), 1163 CreateMockRead(*resp2, 7),
1185 CreateMockRead(*body2), 1164 CreateMockRead(*body2, 8),
1186 CreateMockRead(*fbody2), 1165 CreateMockRead(*fbody2, 9),
1187 CreateMockRead(*resp3, 13), 1166 CreateMockRead(*resp3, 11),
1188 CreateMockRead(*body3), 1167 CreateMockRead(*body3, 12),
1189 CreateMockRead(*fbody3), 1168 CreateMockRead(*fbody3, 13),
1190 1169
1191 MockRead(ASYNC, 0, 0), // EOF 1170 MockRead(ASYNC, 0, 14), // EOF
1192 }; 1171 };
1193 1172
1194 OrderedSocketData data(reads, arraysize(reads), 1173 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1195 writes, arraysize(writes));
1196 1174
1197 BoundNetLog log; 1175 BoundNetLog log;
1198 TransactionHelperResult out; 1176 TransactionHelperResult out;
1199 { 1177 {
1200 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1178 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1201 BoundNetLog(), GetParam(), NULL); 1179 BoundNetLog(), GetParam(), NULL);
1202 helper.RunPreTestSetup(); 1180 helper.RunPreTestSetup();
1203 helper.AddData(&data); 1181 helper.AddData(&data);
1204 scoped_ptr<HttpNetworkTransaction> trans1( 1182 scoped_ptr<HttpNetworkTransaction> trans1(
1205 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1183 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
(...skipping 16 matching lines...) Expand all
1222 // frame. 1200 // frame.
1223 out.rv = callback1.WaitForResult(); 1201 out.rv = callback1.WaitForResult();
1224 ASSERT_EQ(OK, out.rv); 1202 ASSERT_EQ(OK, out.rv);
1225 1203
1226 out.rv = trans2->Start(&httpreq2, callback2.callback(), log); 1204 out.rv = trans2->Start(&httpreq2, callback2.callback(), log);
1227 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1205 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1228 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); 1206 out.rv = trans3->Start(&httpreq3, callback3.callback(), log);
1229 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1207 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1230 out.rv = callback2.WaitForResult(); 1208 out.rv = callback2.WaitForResult();
1231 ASSERT_EQ(OK, out.rv); 1209 ASSERT_EQ(OK, out.rv);
1232 EXPECT_EQ(7U, data.read_index()); // i.e. the third trans was queued
1233 1210
1234 out.rv = callback3.WaitForResult(); 1211 out.rv = callback3.WaitForResult();
1235 ASSERT_EQ(OK, out.rv); 1212 ASSERT_EQ(OK, out.rv);
1236 1213
1237 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); 1214 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
1238 ASSERT_TRUE(response1 != NULL); 1215 ASSERT_TRUE(response1 != NULL);
1239 EXPECT_TRUE(response1->headers.get() != NULL); 1216 EXPECT_TRUE(response1->headers.get() != NULL);
1240 EXPECT_TRUE(response1->was_fetched_via_spdy); 1217 EXPECT_TRUE(response1->was_fetched_via_spdy);
1241 out.status_line = response1->headers->GetStatusLine(); 1218 out.status_line = response1->headers->GetStatusLine();
1242 out.response_info = *response1; 1219 out.response_info = *response1;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(7, false)); 1273 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(7, false));
1297 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(7, true)); 1274 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(7, true));
1298 1275
1299 SettingsMap settings; 1276 SettingsMap settings;
1300 const uint32 max_concurrent_streams = 1; 1277 const uint32 max_concurrent_streams = 1;
1301 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1278 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1302 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1279 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1303 scoped_ptr<SpdyFrame> settings_frame( 1280 scoped_ptr<SpdyFrame> settings_frame(
1304 spdy_util_.ConstructSpdySettings(settings)); 1281 spdy_util_.ConstructSpdySettings(settings));
1305 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1282 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck());
1306 1283 MockWrite writes[] = {
1307 MockWrite writes[] = { CreateMockWrite(*req), 1284 CreateMockWrite(*req, 0),
1308 CreateMockWrite(*settings_ack, 2), 1285 CreateMockWrite(*settings_ack, 5),
1309 CreateMockWrite(*req2), 1286 // By making these synchronous, it guarantees that they are not *started*
1310 CreateMockWrite(*req4), 1287 // before their sequence number, which in turn verifies that only a single
1311 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),
1312 }; 1292 };
1313 MockRead reads[] = { 1293 MockRead reads[] = {
1314 CreateMockRead(*settings_frame, 1), 1294 CreateMockRead(*settings_frame, 1),
1315 CreateMockRead(*resp), 1295 CreateMockRead(*resp, 2),
1316 CreateMockRead(*body), 1296 CreateMockRead(*body, 3),
1317 CreateMockRead(*fbody), 1297 CreateMockRead(*fbody, 4),
1318 CreateMockRead(*resp2, 8), 1298 CreateMockRead(*resp2, 7),
1319 CreateMockRead(*body2), 1299 CreateMockRead(*body2, 8),
1320 CreateMockRead(*fbody2), 1300 CreateMockRead(*fbody2, 9),
1321 CreateMockRead(*resp4, 14), 1301 CreateMockRead(*resp4, 11),
1322 CreateMockRead(*fbody4), 1302 CreateMockRead(*fbody4, 12),
1323 CreateMockRead(*resp3, 17), 1303 CreateMockRead(*resp3, 14),
1324 CreateMockRead(*body3), 1304 CreateMockRead(*body3, 15),
1325 CreateMockRead(*fbody3), 1305 CreateMockRead(*fbody3, 16),
1326 1306
1327 MockRead(ASYNC, 0, 0), // EOF 1307 MockRead(ASYNC, 0, 17), // EOF
1328 }; 1308 };
1329 1309 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1330 OrderedSocketData data(reads, arraysize(reads),
1331 writes, arraysize(writes));
1332
1333 BoundNetLog log; 1310 BoundNetLog log;
1334 TransactionHelperResult out; 1311 TransactionHelperResult out;
1335 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1312 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1336 BoundNetLog(), GetParam(), NULL); 1313 BoundNetLog(), GetParam(), NULL);
1337 helper.RunPreTestSetup(); 1314 helper.RunPreTestSetup();
1338 helper.AddData(&data); 1315 helper.AddData(&data);
1316
1339 scoped_ptr<HttpNetworkTransaction> trans1( 1317 scoped_ptr<HttpNetworkTransaction> trans1(
1340 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1318 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
1341 scoped_ptr<HttpNetworkTransaction> trans2( 1319 scoped_ptr<HttpNetworkTransaction> trans2(
1342 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1320 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
1343 scoped_ptr<HttpNetworkTransaction> trans3( 1321 scoped_ptr<HttpNetworkTransaction> trans3(
1344 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1322 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
1345 scoped_ptr<HttpNetworkTransaction> trans4( 1323 scoped_ptr<HttpNetworkTransaction> trans4(
1346 new HttpNetworkTransaction(HIGHEST, helper.session().get())); 1324 new HttpNetworkTransaction(HIGHEST, helper.session().get()));
1347 1325
1348 TestCompletionCallback callback1; 1326 TestCompletionCallback callback1;
(...skipping 14 matching lines...) Expand all
1363 1341
1364 out.rv = trans2->Start(&httpreq2, callback2.callback(), log); 1342 out.rv = trans2->Start(&httpreq2, callback2.callback(), log);
1365 ASSERT_EQ(ERR_IO_PENDING, out.rv); 1343 ASSERT_EQ(ERR_IO_PENDING, out.rv);
1366 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); 1344 out.rv = trans3->Start(&httpreq3, callback3.callback(), log);
1367 ASSERT_EQ(ERR_IO_PENDING, out.rv); 1345 ASSERT_EQ(ERR_IO_PENDING, out.rv);
1368 out.rv = trans4->Start(&httpreq4, callback4.callback(), log); 1346 out.rv = trans4->Start(&httpreq4, callback4.callback(), log);
1369 ASSERT_EQ(ERR_IO_PENDING, out.rv); 1347 ASSERT_EQ(ERR_IO_PENDING, out.rv);
1370 1348
1371 out.rv = callback2.WaitForResult(); 1349 out.rv = callback2.WaitForResult();
1372 ASSERT_EQ(OK, out.rv); 1350 ASSERT_EQ(OK, out.rv);
1373 EXPECT_EQ(data.read_index(), 7U); // i.e. the third & fourth trans queued
1374 1351
1375 out.rv = callback3.WaitForResult(); 1352 out.rv = callback3.WaitForResult();
1376 ASSERT_EQ(OK, out.rv); 1353 ASSERT_EQ(OK, out.rv);
1377 1354
1378 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); 1355 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
1379 EXPECT_TRUE(response1->headers.get() != NULL); 1356 EXPECT_TRUE(response1->headers.get() != NULL);
1380 EXPECT_TRUE(response1->was_fetched_via_spdy); 1357 EXPECT_TRUE(response1->was_fetched_via_spdy);
1381 out.status_line = response1->headers->GetStatusLine(); 1358 out.status_line = response1->headers->GetStatusLine();
1382 out.response_info = *response1; 1359 out.response_info = *response1;
1383 out.rv = ReadTransaction(trans1.get(), &out.response_data); 1360 out.rv = ReadTransaction(trans1.get(), &out.response_data);
(...skipping 26 matching lines...) Expand all
1410 out.response_info = *response4; 1387 out.response_info = *response4;
1411 out.rv = ReadTransaction(trans4.get(), &out.response_data); 1388 out.rv = ReadTransaction(trans4.get(), &out.response_data);
1412 EXPECT_EQ(OK, out.rv); 1389 EXPECT_EQ(OK, out.rv);
1413 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1390 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1414 EXPECT_EQ("hello!", out.response_data); 1391 EXPECT_EQ("hello!", out.response_data);
1415 helper.VerifyDataConsumed(); 1392 helper.VerifyDataConsumed();
1416 EXPECT_EQ(OK, out.rv); 1393 EXPECT_EQ(OK, out.rv);
1417 } 1394 }
1418 1395
1419 // Similar to ThreeGetsMaxConcurrrent above, however, this test 1396 // Similar to ThreeGetsMaxConcurrrent above, however, this test
1420 // deletes a session in the middle of the transaction to insure 1397 // deletes a session in the middle of the transaction to ensure
1421 // that we properly remove pendingcreatestream objects from 1398 // that we properly remove pendingcreatestream objects from
1422 // the spdy_session 1399 // the spdy_session
1423 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) { 1400 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) {
1424 // Construct the request. 1401 // Construct the request.
1425 scoped_ptr<SpdyFrame> req( 1402 scoped_ptr<SpdyFrame> req(
1426 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 1403 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
1427 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1404 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1428 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1405 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false));
1429 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1406 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true));
1430 1407
1431 scoped_ptr<SpdyFrame> req2( 1408 scoped_ptr<SpdyFrame> req2(
1432 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 1409 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
1433 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1410 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1434 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 1411 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false));
1435 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 1412 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true));
1436 1413
1437 SettingsMap settings; 1414 SettingsMap settings;
1438 const uint32 max_concurrent_streams = 1; 1415 const uint32 max_concurrent_streams = 1;
1439 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1416 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1440 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1417 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1441 scoped_ptr<SpdyFrame> settings_frame( 1418 scoped_ptr<SpdyFrame> settings_frame(
1442 spdy_util_.ConstructSpdySettings(settings)); 1419 spdy_util_.ConstructSpdySettings(settings));
1443 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1420 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck());
1444 1421
1445 MockWrite writes[] = { 1422 MockWrite writes[] = {
1446 CreateMockWrite(*req), 1423 CreateMockWrite(*req, 0),
1447 CreateMockWrite(*settings_ack, 2), 1424 CreateMockWrite(*settings_ack, 5),
1448 CreateMockWrite(*req2), 1425 CreateMockWrite(*req2, 6),
1449 }; 1426 };
1450 MockRead reads[] = { 1427 MockRead reads[] = {
1451 CreateMockRead(*settings_frame, 1), 1428 CreateMockRead(*settings_frame, 1),
1452 CreateMockRead(*resp), 1429 CreateMockRead(*resp, 2),
1453 CreateMockRead(*body), 1430 CreateMockRead(*body, 3),
1454 CreateMockRead(*fbody), 1431 CreateMockRead(*fbody, 4),
1455 CreateMockRead(*resp2, 8), 1432 CreateMockRead(*resp2, 7),
1456 CreateMockRead(*body2), 1433 CreateMockRead(*body2, 8),
1457 CreateMockRead(*fbody2), 1434 CreateMockRead(*fbody2, 9),
1458 MockRead(ASYNC, 0, 0), // EOF 1435 MockRead(ASYNC, 0, 10), // EOF
1459 }; 1436 };
1460 1437
1461 OrderedSocketData data(reads, arraysize(reads), 1438 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1462 writes, arraysize(writes));
1463 1439
1464 BoundNetLog log; 1440 BoundNetLog log;
1465 TransactionHelperResult out; 1441 TransactionHelperResult out;
1466 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1442 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1467 BoundNetLog(), GetParam(), NULL); 1443 BoundNetLog(), GetParam(), NULL);
1468 helper.RunPreTestSetup(); 1444 helper.RunPreTestSetup();
1469 helper.AddData(&data); 1445 helper.AddData(&data);
1470 scoped_ptr<HttpNetworkTransaction> trans1( 1446 scoped_ptr<HttpNetworkTransaction> trans1(
1471 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get())); 1447 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session().get()));
1472 scoped_ptr<HttpNetworkTransaction> trans2( 1448 scoped_ptr<HttpNetworkTransaction> trans2(
(...skipping 16 matching lines...) Expand all
1489 ASSERT_EQ(OK, out.rv); 1465 ASSERT_EQ(OK, out.rv);
1490 1466
1491 out.rv = trans2->Start(&httpreq2, callback2.callback(), log); 1467 out.rv = trans2->Start(&httpreq2, callback2.callback(), log);
1492 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1468 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1493 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); 1469 out.rv = trans3->Start(&httpreq3, callback3.callback(), log);
1494 delete trans3.release(); 1470 delete trans3.release();
1495 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1471 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1496 out.rv = callback2.WaitForResult(); 1472 out.rv = callback2.WaitForResult();
1497 ASSERT_EQ(OK, out.rv); 1473 ASSERT_EQ(OK, out.rv);
1498 1474
1499 EXPECT_EQ(8U, data.read_index());
1500
1501 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); 1475 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
1502 ASSERT_TRUE(response1 != NULL); 1476 ASSERT_TRUE(response1 != NULL);
1503 EXPECT_TRUE(response1->headers.get() != NULL); 1477 EXPECT_TRUE(response1->headers.get() != NULL);
1504 EXPECT_TRUE(response1->was_fetched_via_spdy); 1478 EXPECT_TRUE(response1->was_fetched_via_spdy);
1505 out.status_line = response1->headers->GetStatusLine(); 1479 out.status_line = response1->headers->GetStatusLine();
1506 out.response_info = *response1; 1480 out.response_info = *response1;
1507 out.rv = ReadTransaction(trans1.get(), &out.response_data); 1481 out.rv = ReadTransaction(trans1.get(), &out.response_data);
1508 EXPECT_EQ(OK, out.rv); 1482 EXPECT_EQ(OK, out.rv);
1509 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1483 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1510 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
1568 1542
1569 SettingsMap settings; 1543 SettingsMap settings;
1570 const uint32 max_concurrent_streams = 1; 1544 const uint32 max_concurrent_streams = 1;
1571 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1545 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1572 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1546 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1573 scoped_ptr<SpdyFrame> settings_frame( 1547 scoped_ptr<SpdyFrame> settings_frame(
1574 spdy_util_.ConstructSpdySettings(settings)); 1548 spdy_util_.ConstructSpdySettings(settings));
1575 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1549 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck());
1576 1550
1577 MockWrite writes[] = { 1551 MockWrite writes[] = {
1578 CreateMockWrite(*req), 1552 CreateMockWrite(*req, 0),
1579 CreateMockWrite(*settings_ack, 2), 1553 CreateMockWrite(*settings_ack, 5),
1580 CreateMockWrite(*req2), 1554 CreateMockWrite(*req2, 6),
1581 }; 1555 };
1582 MockRead reads[] = { 1556 MockRead reads[] = {
1583 CreateMockRead(*settings_frame, 1), 1557 CreateMockRead(*settings_frame, 1),
1584 CreateMockRead(*resp), 1558 CreateMockRead(*resp, 2),
1585 CreateMockRead(*body), 1559 CreateMockRead(*body, 3),
1586 CreateMockRead(*fin_body), 1560 CreateMockRead(*fin_body, 4),
1587 CreateMockRead(*resp2, 8), 1561 CreateMockRead(*resp2, 7),
1588 MockRead(ASYNC, ERR_CONNECTION_RESET, 0), // Abort! 1562 MockRead(ASYNC, ERR_CONNECTION_RESET, 8), // Abort!
1589 }; 1563 };
1590 1564
1591 OrderedSocketData data(reads, arraysize(reads), 1565 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1592 writes, arraysize(writes)); 1566 SequencedSocketData data_placeholder(NULL, 0, NULL, 0);
1593 OrderedSocketData data_placeholder(NULL, 0, NULL, 0);
1594 1567
1595 BoundNetLog log; 1568 BoundNetLog log;
1596 TransactionHelperResult out; 1569 TransactionHelperResult out;
1597 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1570 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1598 BoundNetLog(), GetParam(), NULL); 1571 BoundNetLog(), GetParam(), NULL);
1599 helper.RunPreTestSetup(); 1572 helper.RunPreTestSetup();
1600 helper.AddData(&data); 1573 helper.AddData(&data);
1601 // 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
1602 // there needs to be three sets of SSL connection data. 1575 // there needs to be three sets of SSL connection data.
1603 helper.AddData(&data_placeholder); 1576 helper.AddData(&data_placeholder);
(...skipping 17 matching lines...) Expand all
1621 out.rv = callback1.WaitForResult(); 1594 out.rv = callback1.WaitForResult();
1622 ASSERT_EQ(OK, out.rv); 1595 ASSERT_EQ(OK, out.rv);
1623 1596
1624 out.rv = trans2.Start(&httpreq2, callback2.callback(), log); 1597 out.rv = trans2.Start(&httpreq2, callback2.callback(), log);
1625 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1598 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1626 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); 1599 out.rv = trans3->Start(&httpreq3, callback3.callback(), log);
1627 ASSERT_EQ(out.rv, ERR_IO_PENDING); 1600 ASSERT_EQ(out.rv, ERR_IO_PENDING);
1628 out.rv = callback3.WaitForResult(); 1601 out.rv = callback3.WaitForResult();
1629 ASSERT_EQ(ERR_ABORTED, out.rv); 1602 ASSERT_EQ(ERR_ABORTED, out.rv);
1630 1603
1631 EXPECT_EQ(6U, data.read_index());
1632
1633 const HttpResponseInfo* response1 = trans1.GetResponseInfo(); 1604 const HttpResponseInfo* response1 = trans1.GetResponseInfo();
1634 ASSERT_TRUE(response1 != NULL); 1605 ASSERT_TRUE(response1 != NULL);
1635 EXPECT_TRUE(response1->headers.get() != NULL); 1606 EXPECT_TRUE(response1->headers.get() != NULL);
1636 EXPECT_TRUE(response1->was_fetched_via_spdy); 1607 EXPECT_TRUE(response1->was_fetched_via_spdy);
1637 out.status_line = response1->headers->GetStatusLine(); 1608 out.status_line = response1->headers->GetStatusLine();
1638 out.response_info = *response1; 1609 out.response_info = *response1;
1639 out.rv = ReadTransaction(&trans1, &out.response_data); 1610 out.rv = ReadTransaction(&trans1, &out.response_data);
1640 EXPECT_EQ(OK, out.rv); 1611 EXPECT_EQ(OK, out.rv);
1641 1612
1642 const HttpResponseInfo* response2 = trans2.GetResponseInfo(); 1613 const HttpResponseInfo* response2 = trans2.GetResponseInfo();
(...skipping 11 matching lines...) Expand all
1654 // Setup the request 1625 // Setup the request
1655 HttpRequestInfo request; 1626 HttpRequestInfo request;
1656 request.method = "PUT"; 1627 request.method = "PUT";
1657 request.url = GURL(GetDefaultUrl()); 1628 request.url = GURL(GetDefaultUrl());
1658 1629
1659 scoped_ptr<SpdyHeaderBlock> put_headers( 1630 scoped_ptr<SpdyHeaderBlock> put_headers(
1660 spdy_util_.ConstructPutHeaderBlock(GetDefaultUrl(), 0)); 1631 spdy_util_.ConstructPutHeaderBlock(GetDefaultUrl(), 0));
1661 scoped_ptr<SpdyFrame> req( 1632 scoped_ptr<SpdyFrame> req(
1662 spdy_util_.ConstructSpdySyn(1, *put_headers, LOWEST, false, true)); 1633 spdy_util_.ConstructSpdySyn(1, *put_headers, LOWEST, false, true));
1663 MockWrite writes[] = { 1634 MockWrite writes[] = {
1664 CreateMockWrite(*req), 1635 CreateMockWrite(*req, 0),
1665 }; 1636 };
1666 1637
1667 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1638 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1668 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1639 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1669 MockRead reads[] = { 1640 MockRead reads[] = {
1670 CreateMockRead(*resp), 1641 CreateMockRead(*resp, 1),
1671 CreateMockRead(*body), 1642 CreateMockRead(*body, 2),
1672 MockRead(ASYNC, 0, 0) // EOF 1643 MockRead(ASYNC, 0, 3) // EOF
1673 }; 1644 };
1674 1645
1675 DelayedSocketData data(1, reads, arraysize(reads), 1646 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1676 writes, arraysize(writes));
1677 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1647 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1678 BoundNetLog(), GetParam(), NULL); 1648 BoundNetLog(), GetParam(), NULL);
1679 helper.RunToCompletion(&data); 1649 helper.RunToCompletion(&data);
1680 TransactionHelperResult out = helper.output(); 1650 TransactionHelperResult out = helper.output();
1681 1651
1682 EXPECT_EQ(OK, out.rv); 1652 EXPECT_EQ(OK, out.rv);
1683 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1653 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1684 } 1654 }
1685 1655
1686 // Test that a simple HEAD request works. 1656 // Test that a simple HEAD request works.
1687 TEST_P(SpdyNetworkTransactionTest, Head) { 1657 TEST_P(SpdyNetworkTransactionTest, Head) {
1688 // Setup the request 1658 // Setup the request
1689 HttpRequestInfo request; 1659 HttpRequestInfo request;
1690 request.method = "HEAD"; 1660 request.method = "HEAD";
1691 request.url = GURL(GetDefaultUrl()); 1661 request.url = GURL(GetDefaultUrl());
1692 1662
1693 scoped_ptr<SpdyHeaderBlock> head_headers( 1663 scoped_ptr<SpdyHeaderBlock> head_headers(
1694 spdy_util_.ConstructHeadHeaderBlock(GetDefaultUrl(), 0)); 1664 spdy_util_.ConstructHeadHeaderBlock(GetDefaultUrl(), 0));
1695 scoped_ptr<SpdyFrame> req( 1665 scoped_ptr<SpdyFrame> req(
1696 spdy_util_.ConstructSpdySyn(1, *head_headers, LOWEST, false, true)); 1666 spdy_util_.ConstructSpdySyn(1, *head_headers, LOWEST, false, true));
1697 MockWrite writes[] = { 1667 MockWrite writes[] = {
1698 CreateMockWrite(*req), 1668 CreateMockWrite(*req, 0),
1699 }; 1669 };
1700 1670
1701 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1671 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1702 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1672 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1703 MockRead reads[] = { 1673 MockRead reads[] = {
1704 CreateMockRead(*resp), 1674 CreateMockRead(*resp, 1),
1705 CreateMockRead(*body), 1675 CreateMockRead(*body, 2),
1706 MockRead(ASYNC, 0, 0) // EOF 1676 MockRead(ASYNC, 0, 3) // EOF
1707 }; 1677 };
1708 1678
1709 DelayedSocketData data(1, reads, arraysize(reads), 1679 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1710 writes, arraysize(writes));
1711 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1680 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1712 BoundNetLog(), GetParam(), NULL); 1681 BoundNetLog(), GetParam(), NULL);
1713 helper.RunToCompletion(&data); 1682 helper.RunToCompletion(&data);
1714 TransactionHelperResult out = helper.output(); 1683 TransactionHelperResult out = helper.output();
1715 1684
1716 EXPECT_EQ(OK, out.rv); 1685 EXPECT_EQ(OK, out.rv);
1717 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1686 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1718 } 1687 }
1719 1688
1720 // Test that a simple POST works. 1689 // Test that a simple POST works.
1721 TEST_P(SpdyNetworkTransactionTest, Post) { 1690 TEST_P(SpdyNetworkTransactionTest, Post) {
1722 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1691 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
1723 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1692 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1724 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1693 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1725 MockWrite writes[] = { 1694 MockWrite writes[] = {
1726 CreateMockWrite(*req), 1695 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1727 CreateMockWrite(*body), // POST upload frame
1728 }; 1696 };
1729 1697
1730 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1698 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1731 MockRead reads[] = { 1699 MockRead reads[] = {
1732 CreateMockRead(*resp), 1700 CreateMockRead(*resp, 2),
1733 CreateMockRead(*body), 1701 CreateMockRead(*body, 3),
1734 MockRead(ASYNC, 0, 0) // EOF 1702 MockRead(ASYNC, 0, 4) // EOF
1735 }; 1703 };
1736 1704
1737 DelayedSocketData data(2, reads, arraysize(reads), 1705 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1738 writes, arraysize(writes));
1739 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY, 1706 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY,
1740 BoundNetLog(), GetParam(), NULL); 1707 BoundNetLog(), GetParam(), NULL);
1741 helper.RunToCompletion(&data); 1708 helper.RunToCompletion(&data);
1742 TransactionHelperResult out = helper.output(); 1709 TransactionHelperResult out = helper.output();
1743 EXPECT_EQ(OK, out.rv); 1710 EXPECT_EQ(OK, out.rv);
1744 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1711 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1745 EXPECT_EQ("hello!", out.response_data); 1712 EXPECT_EQ("hello!", out.response_data);
1746 } 1713 }
1747 1714
1748 // Test that a POST with a file works. 1715 // Test that a POST with a file works.
1749 TEST_P(SpdyNetworkTransactionTest, FilePost) { 1716 TEST_P(SpdyNetworkTransactionTest, FilePost) {
1750 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1717 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
1751 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1718 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1752 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1719 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1753 MockWrite writes[] = { 1720 MockWrite writes[] = {
1754 CreateMockWrite(*req), 1721 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1755 CreateMockWrite(*body), // POST upload frame
1756 }; 1722 };
1757 1723
1758 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1724 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1759 MockRead reads[] = { 1725 MockRead reads[] = {
1760 CreateMockRead(*resp), 1726 CreateMockRead(*resp, 2),
1761 CreateMockRead(*body), 1727 CreateMockRead(*body, 3),
1762 MockRead(ASYNC, 0, 0) // EOF 1728 MockRead(ASYNC, 0, 4) // EOF
1763 }; 1729 };
1764 1730
1765 DelayedSocketData data(2, reads, arraysize(reads), 1731 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1766 writes, arraysize(writes));
1767 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY, 1732 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY,
1768 BoundNetLog(), GetParam(), NULL); 1733 BoundNetLog(), GetParam(), NULL);
1769 helper.RunToCompletion(&data); 1734 helper.RunToCompletion(&data);
1770 TransactionHelperResult out = helper.output(); 1735 TransactionHelperResult out = helper.output();
1771 EXPECT_EQ(OK, out.rv); 1736 EXPECT_EQ(OK, out.rv);
1772 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1737 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1773 EXPECT_EQ("hello!", out.response_data); 1738 EXPECT_EQ("hello!", out.response_data);
1774 } 1739 }
1775 1740
1776 // Test that a POST with a unreadable file fails. 1741 // Test that a POST with a unreadable file fails.
1777 TEST_P(SpdyNetworkTransactionTest, UnreadableFilePost) { 1742 TEST_P(SpdyNetworkTransactionTest, UnreadableFilePost) {
1778 MockWrite writes[] = { 1743 MockWrite writes[] = {
1779 MockWrite(ASYNC, 0, 0) // EOF 1744 MockWrite(ASYNC, 0, 0) // EOF
ramant (doing other things) 2015/05/01 22:03:13 overly nit: consider making the indentation to be
Ryan Hamilton 2015/05/03 14:13:39 Done.
1780 }; 1745 };
1781 MockRead reads[] = { 1746 MockRead reads[] = {
1782 MockRead(ASYNC, 0, 0) // EOF 1747 MockRead(ASYNC, 0, 1) // EOF
1783 }; 1748 };
1784 1749
1785 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 1750 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1786 NormalSpdyTransactionHelper helper(CreateUnreadableFilePostRequest(), 1751 NormalSpdyTransactionHelper helper(CreateUnreadableFilePostRequest(),
1787 DEFAULT_PRIORITY, 1752 DEFAULT_PRIORITY,
1788 BoundNetLog(), GetParam(), NULL); 1753 BoundNetLog(), GetParam(), NULL);
1789 helper.RunPreTestSetup(); 1754 helper.RunPreTestSetup();
1790 helper.AddData(&data); 1755 helper.AddData(&data);
1791 helper.RunDefaultTest(); 1756 helper.RunDefaultTest();
1792 1757
1793 base::RunLoop().RunUntilIdle(); 1758 base::RunLoop().RunUntilIdle();
1794 helper.VerifyDataNotConsumed(); 1759 helper.VerifyDataNotConsumed();
1795 EXPECT_EQ(ERR_ACCESS_DENIED, helper.output().rv); 1760 EXPECT_EQ(ERR_ACCESS_DENIED, helper.output().rv);
1796 } 1761 }
1797 1762
1798 // Test that a complex POST works. 1763 // Test that a complex POST works.
1799 TEST_P(SpdyNetworkTransactionTest, ComplexPost) { 1764 TEST_P(SpdyNetworkTransactionTest, ComplexPost) {
1800 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1765 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
1801 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1766 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1802 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1767 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1803 MockWrite writes[] = { 1768 MockWrite writes[] = {
1804 CreateMockWrite(*req), 1769 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1805 CreateMockWrite(*body), // POST upload frame
1806 }; 1770 };
1807 1771
1808 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1772 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1809 MockRead reads[] = { 1773 MockRead reads[] = {
1810 CreateMockRead(*resp), 1774 CreateMockRead(*resp, 2),
1811 CreateMockRead(*body), 1775 CreateMockRead(*body, 3),
1812 MockRead(ASYNC, 0, 0) // EOF 1776 MockRead(ASYNC, 0, 4) // EOF
1813 }; 1777 };
1814 1778
1815 DelayedSocketData data(2, reads, arraysize(reads), 1779 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1816 writes, arraysize(writes));
1817 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(), 1780 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(),
1818 DEFAULT_PRIORITY, 1781 DEFAULT_PRIORITY,
1819 BoundNetLog(), GetParam(), NULL); 1782 BoundNetLog(), GetParam(), NULL);
1820 helper.RunToCompletion(&data); 1783 helper.RunToCompletion(&data);
1821 TransactionHelperResult out = helper.output(); 1784 TransactionHelperResult out = helper.output();
1822 EXPECT_EQ(OK, out.rv); 1785 EXPECT_EQ(OK, out.rv);
1823 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1786 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1824 EXPECT_EQ("hello!", out.response_data); 1787 EXPECT_EQ("hello!", out.response_data);
1825 } 1788 }
1826 1789
1827 // Test that a chunked POST works. 1790 // Test that a chunked POST works.
1828 TEST_P(SpdyNetworkTransactionTest, ChunkedPost) { 1791 TEST_P(SpdyNetworkTransactionTest, ChunkedPost) {
1829 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1792 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1830 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1793 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1831 MockWrite writes[] = { 1794 MockWrite writes[] = {
1832 CreateMockWrite(*req), 1795 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1),
1833 CreateMockWrite(*body),
1834 }; 1796 };
1835 1797
1836 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1798 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1837 MockRead reads[] = { 1799 MockRead reads[] = {
1838 CreateMockRead(*resp), 1800 CreateMockRead(*resp, 2),
1839 CreateMockRead(*body), 1801 CreateMockRead(*body, 3),
1840 MockRead(ASYNC, 0, 0) // EOF 1802 MockRead(ASYNC, 0, 4) // EOF
1841 }; 1803 };
1842 1804
1843 DelayedSocketData data(2, reads, arraysize(reads), 1805 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1844 writes, arraysize(writes));
1845 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1806 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1846 DEFAULT_PRIORITY, 1807 DEFAULT_PRIORITY,
1847 BoundNetLog(), GetParam(), NULL); 1808 BoundNetLog(), GetParam(), NULL);
1848 1809
1849 // These chunks get merged into a single frame when being sent. 1810 // These chunks get merged into a single frame when being sent.
1850 const int kFirstChunkSize = kUploadDataSize/2; 1811 const int kFirstChunkSize = kUploadDataSize/2;
1851 upload_chunked_data_stream()->AppendData(kUploadData, kFirstChunkSize, false); 1812 upload_chunked_data_stream()->AppendData(kUploadData, kFirstChunkSize, false);
1852 upload_chunked_data_stream()->AppendData( 1813 upload_chunked_data_stream()->AppendData(
1853 kUploadData + kFirstChunkSize, kUploadDataSize - kFirstChunkSize, true); 1814 kUploadData + kFirstChunkSize, kUploadDataSize - kFirstChunkSize, true);
1854 1815
1855 helper.RunToCompletion(&data); 1816 helper.RunToCompletion(&data);
1856 TransactionHelperResult out = helper.output(); 1817 TransactionHelperResult out = helper.output();
1857 EXPECT_EQ(OK, out.rv); 1818 EXPECT_EQ(OK, out.rv);
1858 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1819 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1859 EXPECT_EQ(kUploadData, out.response_data); 1820 EXPECT_EQ(kUploadData, out.response_data);
1860 } 1821 }
1861 1822
1862 // 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.
1863 TEST_P(SpdyNetworkTransactionTest, DelayedChunkedPost) { 1824 TEST_P(SpdyNetworkTransactionTest, DelayedChunkedPost) {
1864 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1825 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1865 scoped_ptr<SpdyFrame> chunk1(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1826 scoped_ptr<SpdyFrame> chunk1(spdy_util_.ConstructSpdyBodyFrame(1, false));
1866 scoped_ptr<SpdyFrame> chunk2(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1827 scoped_ptr<SpdyFrame> chunk2(spdy_util_.ConstructSpdyBodyFrame(1, false));
1867 scoped_ptr<SpdyFrame> chunk3(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1828 scoped_ptr<SpdyFrame> chunk3(spdy_util_.ConstructSpdyBodyFrame(1, true));
1868 MockWrite writes[] = { 1829 MockWrite writes[] = {
1869 CreateMockWrite(*req), 1830 CreateMockWrite(*req, 0),
1870 CreateMockWrite(*chunk1), 1831 CreateMockWrite(*chunk1, 1),
1871 CreateMockWrite(*chunk2), 1832 CreateMockWrite(*chunk2, 2),
1872 CreateMockWrite(*chunk3), 1833 CreateMockWrite(*chunk3, 3),
1873 }; 1834 };
1874 1835
1875 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1836 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1876 MockRead reads[] = { 1837 MockRead reads[] = {
1877 CreateMockRead(*resp), 1838 CreateMockRead(*resp, 4),
1878 CreateMockRead(*chunk1), 1839 CreateMockRead(*chunk1, 5),
1879 CreateMockRead(*chunk2), 1840 CreateMockRead(*chunk2, 6),
1880 CreateMockRead(*chunk3), 1841 CreateMockRead(*chunk3, 7),
1881 MockRead(ASYNC, 0, 0) // EOF 1842 MockRead(ASYNC, 0, 8) // EOF
1882 }; 1843 };
1883 1844
1884 DelayedSocketData data(4, reads, arraysize(reads), 1845 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1885 writes, arraysize(writes));
1886 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1846 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1887 DEFAULT_PRIORITY, 1847 DEFAULT_PRIORITY,
1888 BoundNetLog(), GetParam(), NULL); 1848 BoundNetLog(), GetParam(), NULL);
1889 1849
1890 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false); 1850 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false);
1891 1851
1892 helper.RunPreTestSetup(); 1852 helper.RunPreTestSetup();
1893 helper.AddData(&data); 1853 helper.AddData(&data);
1894 ASSERT_TRUE(helper.StartDefaultTest()); 1854 ASSERT_TRUE(helper.StartDefaultTest());
1895 1855
(...skipping 27 matching lines...) Expand all
1923 request.upload_data_stream = NULL; 1883 request.upload_data_stream = NULL;
1924 1884
1925 // 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
1926 // expected to be 0. 1886 // expected to be 0.
1927 scoped_ptr<SpdyHeaderBlock> req_block( 1887 scoped_ptr<SpdyHeaderBlock> req_block(
1928 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), 0)); 1888 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), 0));
1929 scoped_ptr<SpdyFrame> req( 1889 scoped_ptr<SpdyFrame> req(
1930 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, false, true)); 1890 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, false, true));
1931 1891
1932 MockWrite writes[] = { 1892 MockWrite writes[] = {
1933 CreateMockWrite(*req), 1893 CreateMockWrite(*req, 0),
1934 }; 1894 };
1935 1895
1936 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1896 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1937 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1897 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1938 MockRead reads[] = { 1898 MockRead reads[] = {
1939 CreateMockRead(*resp), 1899 CreateMockRead(*resp, 1),
1940 CreateMockRead(*body), 1900 CreateMockRead(*body, 2),
1941 MockRead(ASYNC, 0, 0) // EOF 1901 MockRead(ASYNC, 0, 3) // EOF
1942 }; 1902 };
1943 1903
1944 DelayedSocketData data(1, reads, arraysize(reads), 1904 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1945 writes, arraysize(writes));
1946 1905
1947 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1906 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1948 BoundNetLog(), GetParam(), NULL); 1907 BoundNetLog(), GetParam(), NULL);
1949 helper.RunToCompletion(&data); 1908 helper.RunToCompletion(&data);
1950 TransactionHelperResult out = helper.output(); 1909 TransactionHelperResult out = helper.output();
1951 EXPECT_EQ(OK, out.rv); 1910 EXPECT_EQ(OK, out.rv);
1952 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1911 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1953 EXPECT_EQ("hello!", out.response_data); 1912 EXPECT_EQ("hello!", out.response_data);
1954 } 1913 }
1955 1914
(...skipping 11 matching lines...) Expand all
1967 request.upload_data_stream = &stream; 1926 request.upload_data_stream = &stream;
1968 1927
1969 const uint64 kContentLength = 0; 1928 const uint64 kContentLength = 0;
1970 1929
1971 scoped_ptr<SpdyHeaderBlock> req_block( 1930 scoped_ptr<SpdyHeaderBlock> req_block(
1972 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), kContentLength)); 1931 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), kContentLength));
1973 scoped_ptr<SpdyFrame> req( 1932 scoped_ptr<SpdyFrame> req(
1974 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, false, true)); 1933 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, false, true));
1975 1934
1976 MockWrite writes[] = { 1935 MockWrite writes[] = {
1977 CreateMockWrite(*req), 1936 CreateMockWrite(*req, 0),
1978 }; 1937 };
1979 1938
1980 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1939 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1981 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1940 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
1982 MockRead reads[] = { 1941 MockRead reads[] = {
1983 CreateMockRead(*resp), 1942 CreateMockRead(*resp, 1),
1984 CreateMockRead(*body), 1943 CreateMockRead(*body, 2),
1985 MockRead(ASYNC, 0, 0) // EOF 1944 MockRead(ASYNC, 0, 3) // EOF
1986 }; 1945 };
1987 1946
1988 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 1947 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1989 1948
1990 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1949 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1991 BoundNetLog(), GetParam(), NULL); 1950 BoundNetLog(), GetParam(), NULL);
1992 helper.RunToCompletion(&data); 1951 helper.RunToCompletion(&data);
1993 TransactionHelperResult out = helper.output(); 1952 TransactionHelperResult out = helper.output();
1994 EXPECT_EQ(OK, out.rv); 1953 EXPECT_EQ(OK, out.rv);
1995 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1954 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1996 EXPECT_EQ("hello!", out.response_data); 1955 EXPECT_EQ("hello!", out.response_data);
1997 } 1956 }
1998 1957
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2081 data.SetStop(20); 2040 data.SetStop(20);
2082 data.Run(); 2041 data.Run();
2083 2042
2084 helper.VerifyDataConsumed(); 2043 helper.VerifyDataConsumed();
2085 } 2044 }
2086 2045
2087 // 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.
2088 TEST_P(SpdyNetworkTransactionTest, ResponseWithoutSynReply) { 2047 TEST_P(SpdyNetworkTransactionTest, ResponseWithoutSynReply) {
2089 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2048 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2090 MockRead reads[] = { 2049 MockRead reads[] = {
2091 CreateMockRead(*body), 2050 CreateMockRead(*body, 1), MockRead(ASYNC, 0, 3) // EOF
2092 MockRead(ASYNC, 0, 0) // EOF
2093 }; 2051 };
2094 2052
2095 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));
2096 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2061 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2097 BoundNetLog(), GetParam(), NULL); 2062 BoundNetLog(), GetParam(), NULL);
2098 helper.RunToCompletion(&data); 2063 helper.RunToCompletion(&data);
2099 TransactionHelperResult out = helper.output(); 2064 TransactionHelperResult out = helper.output();
2100 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 2065 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
2101 } 2066 }
2102 2067
2103 // 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
2104 // stream ID. See http://crbug.com/45639. 2069 // stream ID. See http://crbug.com/45639.
2105 TEST_P(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { 2070 TEST_P(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) {
2106 scoped_ptr<SpdyFrame> req( 2071 scoped_ptr<SpdyFrame> req(
2107 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2072 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2108 scoped_ptr<SpdyFrame> rst( 2073 scoped_ptr<SpdyFrame> rst(
2109 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 2074 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
2110 MockWrite writes[] = { 2075 MockWrite writes[] = {
2111 CreateMockWrite(*req), 2076 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
2112 CreateMockWrite(*rst),
2113 }; 2077 };
2114 2078
2115 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2079 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2116 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2080 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2117 MockRead reads[] = { 2081 MockRead reads[] = {
2118 CreateMockRead(*resp), 2082 CreateMockRead(*resp, 1),
2119 CreateMockRead(*resp), 2083 CreateMockRead(*resp, 2),
2120 CreateMockRead(*body), 2084 CreateMockRead(*body, 3),
2121 MockRead(ASYNC, 0, 0) // EOF 2085 MockRead(ASYNC, 0, 5) // EOF
2122 }; 2086 };
2123 2087
2124 DelayedSocketData data(1, reads, arraysize(reads), 2088 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2125 writes, arraysize(writes));
2126 2089
2127 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2090 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2128 BoundNetLog(), GetParam(), NULL); 2091 BoundNetLog(), GetParam(), NULL);
2129 helper.RunPreTestSetup(); 2092 helper.RunPreTestSetup();
2130 helper.AddData(&data); 2093 helper.AddData(&data);
2131 2094
2132 HttpNetworkTransaction* trans = helper.trans(); 2095 HttpNetworkTransaction* trans = helper.trans();
2133 2096
2134 TestCompletionCallback callback; 2097 TestCompletionCallback callback;
2135 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
2148 helper.VerifyDataConsumed(); 2111 helper.VerifyDataConsumed();
2149 } 2112 }
2150 2113
2151 TEST_P(SpdyNetworkTransactionTest, ResetReplyWithTransferEncoding) { 2114 TEST_P(SpdyNetworkTransactionTest, ResetReplyWithTransferEncoding) {
2152 // Construct the request. 2115 // Construct the request.
2153 scoped_ptr<SpdyFrame> req( 2116 scoped_ptr<SpdyFrame> req(
2154 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2117 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2155 scoped_ptr<SpdyFrame> rst( 2118 scoped_ptr<SpdyFrame> rst(
2156 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 2119 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
2157 MockWrite writes[] = { 2120 MockWrite writes[] = {
2158 CreateMockWrite(*req), 2121 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
2159 CreateMockWrite(*rst),
2160 }; 2122 };
2161 2123
2162 const char* const headers[] = { 2124 const char* const headers[] = {
2163 "transfer-encoding", "chunked" 2125 "transfer-encoding", "chunked"
2164 }; 2126 };
2165 scoped_ptr<SpdyFrame> resp( 2127 scoped_ptr<SpdyFrame> resp(
2166 spdy_util_.ConstructSpdyGetSynReply(headers, 1, 1)); 2128 spdy_util_.ConstructSpdyGetSynReply(headers, 1, 1));
2167 scoped_ptr<SpdyFrame> body( 2129 scoped_ptr<SpdyFrame> body(
2168 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2130 spdy_util_.ConstructSpdyBodyFrame(1, true));
2169 MockRead reads[] = { 2131 MockRead reads[] = {
2170 CreateMockRead(*resp), 2132 CreateMockRead(*resp, 1),
2171 CreateMockRead(*body), 2133 CreateMockRead(*body, 3),
2172 MockRead(ASYNC, 0, 0) // EOF 2134 MockRead(ASYNC, 0, 4) // EOF
2173 }; 2135 };
2174 2136
2175 DelayedSocketData data(1, reads, arraysize(reads), 2137 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2176 writes, arraysize(writes));
2177 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2138 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2178 BoundNetLog(), GetParam(), NULL); 2139 BoundNetLog(), GetParam(), NULL);
2179 helper.RunToCompletion(&data); 2140 helper.RunToCompletion(&data);
2180 TransactionHelperResult out = helper.output(); 2141 TransactionHelperResult out = helper.output();
2181 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 2142 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
2182 2143
2183 helper.session()->spdy_session_pool()->CloseAllSessions(); 2144 helper.session()->spdy_session_pool()->CloseAllSessions();
2184 helper.VerifyDataConsumed(); 2145 helper.VerifyDataConsumed();
2185 } 2146 }
2186 2147
2187 TEST_P(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) { 2148 TEST_P(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) {
2188 // Construct the request. 2149 // Construct the request.
2189 scoped_ptr<SpdyFrame> req( 2150 scoped_ptr<SpdyFrame> req(
2190 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2151 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2191 scoped_ptr<SpdyFrame> rst( 2152 scoped_ptr<SpdyFrame> rst(
2192 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2153 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2193 MockWrite writes[] = { 2154 MockWrite writes[] = {
2194 CreateMockWrite(*req), 2155 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
2195 CreateMockWrite(*rst),
2196 }; 2156 };
2197 2157
2198 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2158 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2199 const char* const headers[] = { 2159 const char* const headers[] = {
2200 "transfer-encoding", "chunked" 2160 "transfer-encoding", "chunked"
2201 }; 2161 };
2202 scoped_ptr<SpdyFrame> push( 2162 scoped_ptr<SpdyFrame> push(
2203 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1, 2163 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1,
2204 GetDefaultUrlWithPath("/1").c_str())); 2164 GetDefaultUrlWithPath("/1").c_str()));
2205 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2165 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2206 MockRead reads[] = { 2166 MockRead reads[] = {
2207 CreateMockRead(*resp), 2167 CreateMockRead(*resp, 1),
2208 CreateMockRead(*push), 2168 CreateMockRead(*push, 2),
2209 CreateMockRead(*body), 2169 CreateMockRead(*body, 3),
2210 MockRead(ASYNC, 0, 0) // EOF 2170 MockRead(ASYNC, 0, 5) // EOF
2211 }; 2171 };
2212 2172
2213 DelayedSocketData data(1, reads, arraysize(reads), 2173 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2214 writes, arraysize(writes));
2215 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2174 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2216 BoundNetLog(), GetParam(), NULL); 2175 BoundNetLog(), GetParam(), NULL);
2217 helper.RunToCompletion(&data); 2176 helper.RunToCompletion(&data);
2218 TransactionHelperResult out = helper.output(); 2177 TransactionHelperResult out = helper.output();
2219 EXPECT_EQ(OK, out.rv); 2178 EXPECT_EQ(OK, out.rv);
2220 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 2179 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
2221 EXPECT_EQ("hello!", out.response_data); 2180 EXPECT_EQ("hello!", out.response_data);
2222 2181
2223 helper.session()->spdy_session_pool()->CloseAllSessions(); 2182 helper.session()->spdy_session_pool()->CloseAllSessions();
2224 helper.VerifyDataConsumed(); 2183 helper.VerifyDataConsumed();
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
2305 2264
2306 helper.VerifyDataConsumed(); 2265 helper.VerifyDataConsumed();
2307 } 2266 }
2308 2267
2309 // 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
2310 // 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
2311 // http://crbug.com/47455 2270 // http://crbug.com/47455
2312 TEST_P(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) { 2271 TEST_P(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) {
2313 scoped_ptr<SpdyFrame> req( 2272 scoped_ptr<SpdyFrame> req(
2314 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2273 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2315 MockWrite writes[] = { CreateMockWrite(*req) }; 2274 MockWrite writes[] = { CreateMockWrite(*req) };
ramant (doing other things) 2015/05/01 22:03:13 overly nit: consider making line# 2274 similar to
Ryan Hamilton 2015/05/03 14:13:39 Done.
2316 MockWrite writes2[] = { CreateMockWrite(*req) }; 2275 MockWrite writes2[] = {CreateMockWrite(*req, 0)};
2317 2276
2318 // 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
2319 // 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
2320 // session, and calls the read callback with the incomplete data. 2279 // session, and calls the read callback with the incomplete data.
2321 const uint8 kGetBodyFrame2[] = { 2280 const uint8 kGetBodyFrame2[] = {
2322 0x00, 0x00, 0x00, 0x01, 2281 0x00, 0x00, 0x00, 0x01,
2323 0x01, 0x00, 0x00, 0x07, 2282 0x01, 0x00, 0x00, 0x07,
2324 'h', 'e', 'l', 'l', 'o', '!', 2283 'h', 'e', 'l', 'l', 'o', '!',
2325 }; 2284 };
2326 2285
2327 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2286 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2328 MockRead reads[] = { 2287 MockRead reads[] = {
2329 CreateMockRead(*resp, 2), 2288 CreateMockRead(*resp, 2),
2330 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause 2289 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause
2331 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2), 2290 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2),
2332 arraysize(kGetBodyFrame2), 4), 2291 arraysize(kGetBodyFrame2), 4),
2333 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2292 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause
2334 MockRead(ASYNC, 0, 0, 6), // EOF 2293 MockRead(ASYNC, 0, 0, 6), // EOF
2335 }; 2294 };
2336 MockRead reads2[] = { 2295 MockRead reads2[] = {
2337 CreateMockRead(*resp, 2), 2296 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF
2338 MockRead(ASYNC, 0, 0, 3), // EOF
2339 }; 2297 };
2340 2298
2341 OrderedSocketData data(reads, arraysize(reads), 2299 OrderedSocketData data(reads, arraysize(reads),
2342 writes, arraysize(writes)); 2300 writes, arraysize(writes));
2343 DelayedSocketData data2(1, reads2, arraysize(reads2), 2301 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2344 writes2, arraysize(writes2)); 2302 arraysize(writes2));
2345 2303
2346 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2304 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2347 BoundNetLog(), GetParam(), NULL); 2305 BoundNetLog(), GetParam(), NULL);
2348 helper.RunPreTestSetup(); 2306 helper.RunPreTestSetup();
2349 helper.AddData(&data); 2307 helper.AddData(&data);
2350 helper.AddData(&data2); 2308 helper.AddData(&data2);
2351 HttpNetworkTransaction* trans = helper.trans(); 2309 HttpNetworkTransaction* trans = helper.trans();
2352 2310
2353 // Start the transaction with basic parameters. 2311 // Start the transaction with basic parameters.
2354 TestCompletionCallback callback; 2312 TestCompletionCallback callback;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2447 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2405 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2448 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2406 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true));
2449 MockWrite writes2[] = { 2407 MockWrite writes2[] = {
2450 CreateMockWrite(*req2, 1), 2408 CreateMockWrite(*req2, 1),
2451 }; 2409 };
2452 MockRead reads2[] = { 2410 MockRead reads2[] = {
2453 CreateMockRead(*resp2, 2), 2411 CreateMockRead(*resp2, 2),
2454 CreateMockRead(*body2, 3), 2412 CreateMockRead(*body2, 3),
2455 MockRead(ASYNC, 0, 0, 4) // EOF 2413 MockRead(ASYNC, 0, 0, 4) // EOF
2456 }; 2414 };
2457 OrderedSocketData data(reads, arraysize(reads), 2415 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2458 writes, arraysize(writes)); 2416 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2459 OrderedSocketData data2(reads2, arraysize(reads2), 2417 arraysize(writes2));
2460 writes2, arraysize(writes2));
2461 2418
2462 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN 2419 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN
2463 TestDelegate d; 2420 TestDelegate d;
2464 { 2421 {
2465 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol); 2422 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol);
2466 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest( 2423 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest(
2467 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d)); 2424 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d));
2468 spdy_url_request_context.socket_factory(). 2425 spdy_url_request_context.socket_factory().
2469 AddSocketDataProvider(&data); 2426 AddSocketDataProvider(&data);
2470 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
2530 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2487 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2531 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2488 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true));
2532 MockWrite writes2[] = { 2489 MockWrite writes2[] = {
2533 CreateMockWrite(*req2, 1), 2490 CreateMockWrite(*req2, 1),
2534 }; 2491 };
2535 MockRead reads2[] = { 2492 MockRead reads2[] = {
2536 CreateMockRead(*resp2, 2), 2493 CreateMockRead(*resp2, 2),
2537 CreateMockRead(*body2, 3), 2494 CreateMockRead(*body2, 3),
2538 MockRead(ASYNC, 0, 0, 5) // EOF 2495 MockRead(ASYNC, 0, 0, 5) // EOF
2539 }; 2496 };
2540 OrderedSocketData data(reads, arraysize(reads), 2497 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2541 writes, arraysize(writes)); 2498 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2542 OrderedSocketData data2(reads2, arraysize(reads2), 2499 arraysize(writes2));
2543 writes2, arraysize(writes2));
2544 2500
2545 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN 2501 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN
2546 TestDelegate d; 2502 TestDelegate d;
2547 TestDelegate d2; 2503 TestDelegate d2;
2548 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol); 2504 SpdyURLRequestContext spdy_url_request_context(GetParam().protocol);
2549 { 2505 {
2550 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest( 2506 scoped_ptr<URLRequest> r(spdy_url_request_context.CreateRequest(
2551 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d)); 2507 GURL(GetDefaultUrl()), DEFAULT_PRIORITY, &d));
2552 spdy_url_request_context.socket_factory(). 2508 spdy_url_request_context.socket_factory().
2553 AddSocketDataProvider(&data); 2509 AddSocketDataProvider(&data);
(...skipping 16 matching lines...) Expand all
2570 EXPECT_EQ(1, d2.received_redirect_count()); 2526 EXPECT_EQ(1, d2.received_redirect_count());
2571 2527
2572 r2->FollowDeferredRedirect(); 2528 r2->FollowDeferredRedirect();
2573 base::RunLoop().Run(); 2529 base::RunLoop().Run();
2574 EXPECT_EQ(1, d2.response_started_count()); 2530 EXPECT_EQ(1, d2.response_started_count());
2575 EXPECT_FALSE(d2.received_data_before_response()); 2531 EXPECT_FALSE(d2.received_data_before_response());
2576 EXPECT_EQ(URLRequestStatus::SUCCESS, r2->status().status()); 2532 EXPECT_EQ(URLRequestStatus::SUCCESS, r2->status().status());
2577 std::string contents2("hello!"); 2533 std::string contents2("hello!");
2578 EXPECT_EQ(contents2, d2.data_received()); 2534 EXPECT_EQ(contents2, d2.data_received());
2579 } 2535 }
2580 data.CompleteRead();
2581 data2.CompleteRead();
2582 EXPECT_TRUE(data.AllReadDataConsumed()); 2536 EXPECT_TRUE(data.AllReadDataConsumed());
2583 EXPECT_TRUE(data.AllWriteDataConsumed()); 2537 EXPECT_TRUE(data.AllWriteDataConsumed());
2584 EXPECT_TRUE(data2.AllReadDataConsumed()); 2538 EXPECT_TRUE(data2.AllReadDataConsumed());
2585 EXPECT_TRUE(data2.AllWriteDataConsumed()); 2539 EXPECT_TRUE(data2.AllWriteDataConsumed());
2586 } 2540 }
2587 2541
2588 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { 2542 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) {
2589 scoped_ptr<SpdyFrame> stream1_syn( 2543 scoped_ptr<SpdyFrame> stream1_syn(
2590 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2544 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2591 scoped_ptr<SpdyFrame> stream1_body( 2545 scoped_ptr<SpdyFrame> stream1_body(
2592 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2546 spdy_util_.ConstructSpdyBodyFrame(1, true));
2593 MockWrite writes[] = { 2547 MockWrite writes[] = {
2594 CreateMockWrite(*stream1_syn, 1), 2548 CreateMockWrite(*stream1_syn, 0),
2595 }; 2549 };
2596 2550
2597 scoped_ptr<SpdyFrame> 2551 scoped_ptr<SpdyFrame>
2598 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2552 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2599 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2553 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2600 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2554 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2601 const char kPushedData[] = "pushed"; 2555 const char kPushedData[] = "pushed";
2602 scoped_ptr<SpdyFrame> stream2_body( 2556 scoped_ptr<SpdyFrame> stream2_body(
2603 spdy_util_.ConstructSpdyBodyFrame( 2557 spdy_util_.ConstructSpdyBodyFrame(
2604 2, kPushedData, strlen(kPushedData), true)); 2558 2, kPushedData, strlen(kPushedData), true));
2605 MockRead reads[] = { 2559 MockRead reads[] = {
2606 CreateMockRead(*stream1_reply, 2), 2560 CreateMockRead(*stream1_reply, 1),
2607 CreateMockRead(*stream2_syn, 3), 2561 CreateMockRead(*stream2_syn, 2),
2608 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 2562 CreateMockRead(*stream1_body, 3, SYNCHRONOUS),
2609 CreateMockRead(*stream2_body, 5), 2563 CreateMockRead(*stream2_body, 4),
2610 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2564 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2611 }; 2565 };
2612 2566
2613 HttpResponseInfo response; 2567 HttpResponseInfo response;
2614 HttpResponseInfo response2; 2568 HttpResponseInfo response2;
2615 std::string expected_push_result("pushed"); 2569 std::string expected_push_result("pushed");
2616 OrderedSocketData data(reads, arraysize(reads), 2570 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2617 writes, arraysize(writes));
2618 RunServerPushTest(&data, 2571 RunServerPushTest(&data,
2619 &response, 2572 &response,
2620 &response2, 2573 &response2,
2621 expected_push_result); 2574 expected_push_result);
2622 2575
2623 // Verify the SYN_REPLY. 2576 // Verify the SYN_REPLY.
2624 EXPECT_TRUE(response.headers.get() != NULL); 2577 EXPECT_TRUE(response.headers.get() != NULL);
2625 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2578 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2626 2579
2627 // Verify the pushed stream. 2580 // Verify the pushed stream.
2628 EXPECT_TRUE(response2.headers.get() != NULL); 2581 EXPECT_TRUE(response2.headers.get() != NULL);
2629 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2582 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2630 } 2583 }
2631 2584
2632 TEST_P(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) { 2585 TEST_P(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) {
2633 scoped_ptr<SpdyFrame> stream1_syn( 2586 scoped_ptr<SpdyFrame> stream1_syn(
2634 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2587 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2635 scoped_ptr<SpdyFrame> stream1_body( 2588 scoped_ptr<SpdyFrame> stream1_body(
2636 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2589 spdy_util_.ConstructSpdyBodyFrame(1, true));
2637 MockWrite writes[] = { 2590 MockWrite writes[] = {
2638 CreateMockWrite(*stream1_syn, 1), 2591 CreateMockWrite(*stream1_syn, 0),
2639 }; 2592 };
2640 2593
2641 scoped_ptr<SpdyFrame> 2594 scoped_ptr<SpdyFrame>
2642 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2595 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2643 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2596 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2644 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2597 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2645 const char kPushedData[] = "pushed"; 2598 const char kPushedData[] = "pushed";
2646 scoped_ptr<SpdyFrame> stream2_body( 2599 scoped_ptr<SpdyFrame> stream2_body(
2647 spdy_util_.ConstructSpdyBodyFrame( 2600 spdy_util_.ConstructSpdyBodyFrame(
2648 2, kPushedData, strlen(kPushedData), true)); 2601 2, kPushedData, strlen(kPushedData), true));
2649 MockRead reads[] = { 2602 MockRead reads[] = {
2650 CreateMockRead(*stream2_syn, 2), 2603 CreateMockRead(*stream2_syn, 1),
2651 CreateMockRead(*stream1_reply, 3), 2604 CreateMockRead(*stream1_reply, 2),
2652 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 2605 CreateMockRead(*stream1_body, 3, SYNCHRONOUS),
2653 CreateMockRead(*stream2_body, 5), 2606 CreateMockRead(*stream2_body, 4),
2654 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2607 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2655 }; 2608 };
2656 2609
2657 HttpResponseInfo response; 2610 HttpResponseInfo response;
2658 HttpResponseInfo response2; 2611 HttpResponseInfo response2;
2659 std::string expected_push_result("pushed"); 2612 std::string expected_push_result("pushed");
2660 OrderedSocketData data(reads, arraysize(reads), 2613 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2661 writes, arraysize(writes));
2662 RunServerPushTest(&data, 2614 RunServerPushTest(&data,
2663 &response, 2615 &response,
2664 &response2, 2616 &response2,
2665 expected_push_result); 2617 expected_push_result);
2666 2618
2667 // Verify the SYN_REPLY. 2619 // Verify the SYN_REPLY.
2668 EXPECT_TRUE(response.headers.get() != NULL); 2620 EXPECT_TRUE(response.headers.get() != NULL);
2669 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2621 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2670 2622
2671 // Verify the pushed stream. 2623 // Verify the pushed stream.
2672 EXPECT_TRUE(response2.headers.get() != NULL); 2624 EXPECT_TRUE(response2.headers.get() != NULL);
2673 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2625 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2674 } 2626 }
2675 2627
2676 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) { 2628 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) {
2677 scoped_ptr<SpdyFrame> stream1_syn( 2629 scoped_ptr<SpdyFrame> stream1_syn(
2678 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2630 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2679 MockWrite writes[] = { CreateMockWrite(*stream1_syn, 1), }; 2631 MockWrite writes[] = {
2632 CreateMockWrite(*stream1_syn, 0),
2633 };
2680 2634
2681 scoped_ptr<SpdyFrame> 2635 scoped_ptr<SpdyFrame>
2682 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2636 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2683 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2637 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2684 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2638 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2685 const char kPushedData[] = "pushed"; 2639 const char kPushedData[] = "pushed";
2686 scoped_ptr<SpdyFrame> stream2_body( 2640 scoped_ptr<SpdyFrame> stream2_body(
2687 spdy_util_.ConstructSpdyBodyFrame( 2641 spdy_util_.ConstructSpdyBodyFrame(
2688 2, kPushedData, strlen(kPushedData), true)); 2642 2, kPushedData, strlen(kPushedData), true));
2689 scoped_ptr<SpdyFrame> 2643 scoped_ptr<SpdyFrame>
2690 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2644 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true));
2691 MockRead reads[] = { 2645 MockRead reads[] = {
2692 CreateMockRead(*stream1_reply, 2), 2646 CreateMockRead(*stream1_reply, 1),
2693 CreateMockRead(*stream2_syn, 3), 2647 CreateMockRead(*stream2_syn, 2),
2694 CreateMockRead(*stream2_body, 4), 2648 CreateMockRead(*stream2_body, 3),
2695 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 2649 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
2696 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2650 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2697 }; 2651 };
2698 2652
2699 HttpResponseInfo response; 2653 HttpResponseInfo response;
2700 HttpResponseInfo response2; 2654 HttpResponseInfo response2;
2701 std::string expected_push_result("pushed"); 2655 std::string expected_push_result("pushed");
2702 OrderedSocketData data(reads, arraysize(reads), 2656 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2703 writes, arraysize(writes));
2704 RunServerPushTest(&data, 2657 RunServerPushTest(&data,
2705 &response, 2658 &response,
2706 &response2, 2659 &response2,
2707 expected_push_result); 2660 expected_push_result);
2708 2661
2709 // Verify the SYN_REPLY. 2662 // Verify the SYN_REPLY.
2710 EXPECT_TRUE(response.headers.get() != NULL); 2663 EXPECT_TRUE(response.headers.get() != NULL);
2711 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2664 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2712 2665
2713 // Verify the pushed stream. 2666 // Verify the pushed stream.
2714 EXPECT_TRUE(response2.headers.get() != NULL); 2667 EXPECT_TRUE(response2.headers.get() != NULL);
2715 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2668 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2716 } 2669 }
2717 2670
2718 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) { 2671 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) {
2719 scoped_ptr<SpdyFrame> stream1_syn( 2672 scoped_ptr<SpdyFrame> stream1_syn(
2720 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2673 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2721 scoped_ptr<SpdyFrame> stream1_body( 2674 scoped_ptr<SpdyFrame> stream1_body(
2722 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2675 spdy_util_.ConstructSpdyBodyFrame(1, true));
2723 MockWrite writes[] = { 2676 MockWrite writes[] = {
2724 CreateMockWrite(*stream1_syn, 1), 2677 CreateMockWrite(*stream1_syn, 0),
2725 }; 2678 };
2726 2679
2727 scoped_ptr<SpdyFrame> 2680 scoped_ptr<SpdyFrame>
2728 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2681 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2729 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2682 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2730 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2683 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2731 scoped_ptr<SpdyFrame> stream2_rst( 2684 scoped_ptr<SpdyFrame> stream2_rst(
2732 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2685 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2733 MockRead reads[] = { 2686 MockRead reads[] = {
2734 CreateMockRead(*stream1_reply, 2), 2687 CreateMockRead(*stream1_reply, 1),
2735 CreateMockRead(*stream2_syn, 3), 2688 CreateMockRead(*stream2_syn, 2),
2736 CreateMockRead(*stream2_rst, 4), 2689 CreateMockRead(*stream2_rst, 3),
2737 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 2690 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
2738 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2691 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2739 }; 2692 };
2740 2693
2741 OrderedSocketData data(reads, arraysize(reads), 2694 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2742 writes, arraysize(writes));
2743 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2695 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2744 BoundNetLog(), GetParam(), NULL); 2696 BoundNetLog(), GetParam(), NULL);
2745 2697
2746 helper.RunPreTestSetup(); 2698 helper.RunPreTestSetup();
2747 helper.AddData(&data); 2699 helper.AddData(&data);
2748 2700
2749 HttpNetworkTransaction* trans = helper.trans(); 2701 HttpNetworkTransaction* trans = helper.trans();
2750 2702
2751 // Start the transaction with basic parameters. 2703 // Start the transaction with basic parameters.
2752 TestCompletionCallback callback; 2704 TestCompletionCallback callback;
2753 int rv = trans->Start( 2705 int rv = trans->Start(
2754 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2706 &CreateGetRequest(), callback.callback(), BoundNetLog());
2755 EXPECT_EQ(ERR_IO_PENDING, rv); 2707 EXPECT_EQ(ERR_IO_PENDING, rv);
2756 rv = callback.WaitForResult(); 2708 rv = callback.WaitForResult();
2757 EXPECT_EQ(OK, rv); 2709 EXPECT_EQ(OK, rv);
2758 2710
2759 // Verify that we consumed all test data. 2711 // Verify that we consumed all test data.
2760 EXPECT_TRUE(data.AllReadDataConsumed()) 2712 EXPECT_TRUE(data.AllReadDataConsumed());
2761 << "Read count: " << data.read_count() 2713 EXPECT_TRUE(data.AllWriteDataConsumed());
2762 << " Read index: " << data.read_index();
2763 EXPECT_TRUE(data.AllWriteDataConsumed())
2764 << "Write count: " << data.write_count()
2765 << " Write index: " << data.write_index();
2766 2714
2767 // Verify the SYN_REPLY. 2715 // Verify the SYN_REPLY.
2768 HttpResponseInfo response = *trans->GetResponseInfo(); 2716 HttpResponseInfo response = *trans->GetResponseInfo();
2769 EXPECT_TRUE(response.headers.get() != NULL); 2717 EXPECT_TRUE(response.headers.get() != NULL);
2770 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2718 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2771 } 2719 }
2772 2720
2773 // 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
2774 // if the server pushes the same stream twice. 2722 // if the server pushes the same stream twice.
2775 TEST_P(SpdyNetworkTransactionTest, ServerPushDuplicate) { 2723 TEST_P(SpdyNetworkTransactionTest, ServerPushDuplicate) {
2776 scoped_ptr<SpdyFrame> stream1_syn( 2724 scoped_ptr<SpdyFrame> stream1_syn(
2777 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2725 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2778 scoped_ptr<SpdyFrame> stream1_body( 2726 scoped_ptr<SpdyFrame> stream1_body(
2779 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2727 spdy_util_.ConstructSpdyBodyFrame(1, true));
2780 scoped_ptr<SpdyFrame> stream3_rst( 2728 scoped_ptr<SpdyFrame> stream3_rst(
2781 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR)); 2729 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR));
2782 MockWrite writes[] = { 2730 MockWrite writes[] = {
2783 CreateMockWrite(*stream1_syn, 1), 2731 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream3_rst, 4),
2784 CreateMockWrite(*stream3_rst, 5),
2785 }; 2732 };
2786 2733
2787 scoped_ptr<SpdyFrame> 2734 scoped_ptr<SpdyFrame>
2788 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2735 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2789 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2736 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2790 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2737 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2791 const char kPushedData[] = "pushed"; 2738 const char kPushedData[] = "pushed";
2792 scoped_ptr<SpdyFrame> stream2_body( 2739 scoped_ptr<SpdyFrame> stream2_body(
2793 spdy_util_.ConstructSpdyBodyFrame( 2740 spdy_util_.ConstructSpdyBodyFrame(
2794 2, kPushedData, strlen(kPushedData), true)); 2741 2, kPushedData, strlen(kPushedData), true));
2795 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush( 2742 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush(
2796 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2743 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2797 MockRead reads[] = { 2744 MockRead reads[] = {
2798 CreateMockRead(*stream1_reply, 2), 2745 CreateMockRead(*stream1_reply, 1),
2799 CreateMockRead(*stream2_syn, 3), 2746 CreateMockRead(*stream2_syn, 2),
2800 CreateMockRead(*stream3_syn, 4), 2747 CreateMockRead(*stream3_syn, 3),
2801 CreateMockRead(*stream1_body, 6, SYNCHRONOUS), 2748 CreateMockRead(*stream1_body, 5),
2802 CreateMockRead(*stream2_body, 7), 2749 CreateMockRead(*stream2_body, 6),
2803 MockRead(ASYNC, ERR_IO_PENDING, 8), // Force a pause 2750 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause
2804 }; 2751 };
2805 2752
2806 HttpResponseInfo response; 2753 HttpResponseInfo response;
2807 HttpResponseInfo response2; 2754 HttpResponseInfo response2;
2808 std::string expected_push_result("pushed"); 2755 std::string expected_push_result("pushed");
2809 OrderedSocketData data(reads, arraysize(reads), 2756 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2810 writes, arraysize(writes));
2811 RunServerPushTest(&data, 2757 RunServerPushTest(&data,
2812 &response, 2758 &response,
2813 &response2, 2759 &response2,
2814 expected_push_result); 2760 expected_push_result);
2815 2761
2816 // Verify the SYN_REPLY. 2762 // Verify the SYN_REPLY.
2817 EXPECT_TRUE(response.headers.get() != NULL); 2763 EXPECT_TRUE(response.headers.get() != NULL);
2818 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2764 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2819 2765
2820 // Verify the pushed stream. 2766 // Verify the pushed stream.
2821 EXPECT_TRUE(response2.headers.get() != NULL); 2767 EXPECT_TRUE(response2.headers.get() != NULL);
2822 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2768 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2823 } 2769 }
2824 2770
2825 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { 2771 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) {
2826 scoped_ptr<SpdyFrame> stream1_syn( 2772 scoped_ptr<SpdyFrame> stream1_syn(
2827 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2773 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2828 scoped_ptr<SpdyFrame> stream1_body( 2774 scoped_ptr<SpdyFrame> stream1_body(
2829 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2775 spdy_util_.ConstructSpdyBodyFrame(1, true));
2830 MockWrite writes[] = { 2776 MockWrite writes[] = {
2831 CreateMockWrite(*stream1_syn, 1), 2777 CreateMockWrite(*stream1_syn, 0),
2832 }; 2778 };
2833 2779
2834 scoped_ptr<SpdyFrame> 2780 scoped_ptr<SpdyFrame>
2835 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2781 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2836 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2782 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2837 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2783 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2838 static const char kPushedData[] = "pushed my darling hello my baby"; 2784 static const char kPushedData[] = "pushed my darling hello my baby";
2839 scoped_ptr<SpdyFrame> stream2_body_base( 2785 scoped_ptr<SpdyFrame> stream2_body_base(
2840 spdy_util_.ConstructSpdyBodyFrame( 2786 spdy_util_.ConstructSpdyBodyFrame(
2841 2, kPushedData, strlen(kPushedData), true)); 2787 2, kPushedData, strlen(kPushedData), true));
2842 const size_t kChunkSize = strlen(kPushedData) / 4; 2788 const size_t kChunkSize = strlen(kPushedData) / 4;
2843 scoped_ptr<SpdyFrame> stream2_body1( 2789 scoped_ptr<SpdyFrame> stream2_body1(
2844 new SpdyFrame(stream2_body_base->data(), kChunkSize, false)); 2790 new SpdyFrame(stream2_body_base->data(), kChunkSize, false));
2845 scoped_ptr<SpdyFrame> stream2_body2( 2791 scoped_ptr<SpdyFrame> stream2_body2(
2846 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false)); 2792 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false));
2847 scoped_ptr<SpdyFrame> stream2_body3( 2793 scoped_ptr<SpdyFrame> stream2_body3(
2848 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize, 2794 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize,
2849 kChunkSize, false)); 2795 kChunkSize, false));
2850 scoped_ptr<SpdyFrame> stream2_body4( 2796 scoped_ptr<SpdyFrame> stream2_body4(
2851 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize, 2797 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize,
2852 stream2_body_base->size() - 3 * kChunkSize, false)); 2798 stream2_body_base->size() - 3 * kChunkSize, false));
2853 MockRead reads[] = { 2799 MockRead reads[] = {
2854 CreateMockRead(*stream1_reply, 2), 2800 CreateMockRead(*stream1_reply, 1),
2855 CreateMockRead(*stream2_syn, 3), 2801 CreateMockRead(*stream2_syn, 2),
2856 CreateMockRead(*stream2_body1, 4), 2802 CreateMockRead(*stream2_body1, 3),
2857 CreateMockRead(*stream2_body2, 5), 2803 CreateMockRead(*stream2_body2, 4),
2858 CreateMockRead(*stream2_body3, 6), 2804 CreateMockRead(*stream2_body3, 5),
2859 CreateMockRead(*stream2_body4, 7), 2805 CreateMockRead(*stream2_body4, 6),
2860 CreateMockRead(*stream1_body, 8, SYNCHRONOUS), 2806 CreateMockRead(*stream1_body, 7, SYNCHRONOUS),
2861 MockRead(ASYNC, ERR_IO_PENDING, 9), // Force a pause 2807 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause
2862 }; 2808 };
2863 2809
2864 HttpResponseInfo response; 2810 HttpResponseInfo response;
2865 HttpResponseInfo response2; 2811 HttpResponseInfo response2;
2866 std::string expected_push_result("pushed my darling hello my baby"); 2812 std::string expected_push_result("pushed my darling hello my baby");
2867 OrderedSocketData data(reads, arraysize(reads), 2813 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2868 writes, arraysize(writes));
2869 RunServerPushTest(&data, &response, &response2, kPushedData); 2814 RunServerPushTest(&data, &response, &response2, kPushedData);
2870 2815
2871 // Verify the SYN_REPLY. 2816 // Verify the SYN_REPLY.
2872 EXPECT_TRUE(response.headers.get() != NULL); 2817 EXPECT_TRUE(response.headers.get() != NULL);
2873 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2818 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2874 2819
2875 // Verify the pushed stream. 2820 // Verify the pushed stream.
2876 EXPECT_TRUE(response2.headers.get() != NULL); 2821 EXPECT_TRUE(response2.headers.get() != NULL);
2877 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2822 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2878 } 2823 }
2879 2824
2880 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { 2825 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
2881 scoped_ptr<SpdyFrame> stream1_syn( 2826 scoped_ptr<SpdyFrame> stream1_syn(
2882 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2827 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2883 scoped_ptr<SpdyFrame> stream1_body( 2828 scoped_ptr<SpdyFrame> stream1_body(
2884 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2829 spdy_util_.ConstructSpdyBodyFrame(1, true));
2885 MockWrite writes[] = { 2830 MockWrite writes[] = {
2886 CreateMockWrite(*stream1_syn, 1), 2831 CreateMockWrite(*stream1_syn, 0),
2887 }; 2832 };
2888 2833
2889 scoped_ptr<SpdyFrame> 2834 scoped_ptr<SpdyFrame>
2890 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2835 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2891 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2836 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2892 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2837 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2893 static const char kPushedData[] = "pushed my darling hello my baby"; 2838 static const char kPushedData[] = "pushed my darling hello my baby";
2894 scoped_ptr<SpdyFrame> stream2_body_base( 2839 scoped_ptr<SpdyFrame> stream2_body_base(
2895 spdy_util_.ConstructSpdyBodyFrame( 2840 spdy_util_.ConstructSpdyBodyFrame(
2896 2, kPushedData, strlen(kPushedData), true)); 2841 2, kPushedData, strlen(kPushedData), true));
2897 const size_t kChunkSize = strlen(kPushedData) / 4; 2842 const size_t kChunkSize = strlen(kPushedData) / 4;
2898 scoped_ptr<SpdyFrame> stream2_body1( 2843 scoped_ptr<SpdyFrame> stream2_body1(
2899 new SpdyFrame(stream2_body_base->data(), kChunkSize, false)); 2844 new SpdyFrame(stream2_body_base->data(), kChunkSize, false));
2900 scoped_ptr<SpdyFrame> stream2_body2( 2845 scoped_ptr<SpdyFrame> stream2_body2(
2901 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false)); 2846 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false));
2902 scoped_ptr<SpdyFrame> stream2_body3( 2847 scoped_ptr<SpdyFrame> stream2_body3(
2903 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize, 2848 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize,
2904 kChunkSize, false)); 2849 kChunkSize, false));
2905 scoped_ptr<SpdyFrame> stream2_body4( 2850 scoped_ptr<SpdyFrame> stream2_body4(
2906 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize, 2851 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize,
2907 stream2_body_base->size() - 3 * kChunkSize, false)); 2852 stream2_body_base->size() - 3 * kChunkSize, false));
2908 MockRead reads[] = { 2853 MockRead reads[] = {
2909 CreateMockRead(*stream1_reply, 2), 2854 CreateMockRead(*stream1_reply, 1),
2910 CreateMockRead(*stream2_syn, 3), 2855 CreateMockRead(*stream2_syn, 2),
2911 CreateMockRead(*stream2_body1, 4), 2856 CreateMockRead(*stream2_body1, 3),
2912 CreateMockRead(*stream2_body2, 5), 2857 CreateMockRead(*stream2_body2, 4),
2913 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause 2858 CreateMockRead(*stream2_body3, 5),
2914 CreateMockRead(*stream2_body3, 7), 2859 CreateMockRead(*stream2_body4, 6),
2915 CreateMockRead(*stream2_body4, 8), 2860 CreateMockRead(*stream1_body.get(), 7, SYNCHRONOUS),
2916 CreateMockRead(*stream1_body.get(), 9, SYNCHRONOUS), 2861 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause.
2917 MockRead(ASYNC, ERR_IO_PENDING, 10) // Force a pause.
2918 }; 2862 };
2919 2863
2920 HttpResponseInfo response; 2864 HttpResponseInfo response;
2921 HttpResponseInfo response2; 2865 HttpResponseInfo response2;
2922 OrderedSocketData data(reads, arraysize(reads), 2866 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2923 writes, arraysize(writes));
2924 RunServerPushTest(&data, &response, &response2, kPushedData); 2867 RunServerPushTest(&data, &response, &response2, kPushedData);
2925 2868
2926 // Verify the SYN_REPLY. 2869 // Verify the SYN_REPLY.
2927 EXPECT_TRUE(response.headers.get() != NULL); 2870 EXPECT_TRUE(response.headers.get() != NULL);
2928 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2871 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2929 2872
2930 // Verify the pushed stream. 2873 // Verify the pushed stream.
2931 EXPECT_TRUE(response2.headers.get() != NULL); 2874 EXPECT_TRUE(response2.headers.get() != NULL);
2932 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2875 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2933 } 2876 }
2934 2877
2935 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { 2878 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
2936 if (spdy_util_.spdy_version() == SPDY4) { 2879 if (spdy_util_.spdy_version() == SPDY4) {
2937 // PUSH_PROMISE with stream id 0 is connection-level error. 2880 // PUSH_PROMISE with stream id 0 is connection-level error.
2938 // TODO(baranovich): Test session going away. 2881 // TODO(baranovich): Test session going away.
2939 return; 2882 return;
2940 } 2883 }
2941 2884
2942 scoped_ptr<SpdyFrame> stream1_syn( 2885 scoped_ptr<SpdyFrame> stream1_syn(
2943 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2886 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2944 scoped_ptr<SpdyFrame> stream1_body( 2887 scoped_ptr<SpdyFrame> stream1_body(
2945 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2888 spdy_util_.ConstructSpdyBodyFrame(1, true));
2946 scoped_ptr<SpdyFrame> stream2_rst( 2889 scoped_ptr<SpdyFrame> stream2_rst(
2947 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 2890 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
2948 MockWrite writes[] = { 2891 MockWrite writes[] = {
2949 CreateMockWrite(*stream1_syn, 1), 2892 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
2950 CreateMockWrite(*stream2_rst, 4),
2951 }; 2893 };
2952 2894
2953 scoped_ptr<SpdyFrame> 2895 scoped_ptr<SpdyFrame>
2954 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2896 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2955 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2897 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2956 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); 2898 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str()));
2957 MockRead reads[] = { 2899 MockRead reads[] = {
2958 CreateMockRead(*stream1_reply, 2), 2900 CreateMockRead(*stream1_reply, 1),
2959 CreateMockRead(*stream2_syn, 3), 2901 CreateMockRead(*stream2_syn, 2),
2960 CreateMockRead(*stream1_body, 4), 2902 CreateMockRead(*stream1_body, 4),
2961 MockRead(ASYNC, ERR_IO_PENDING, 5) // Force a pause 2903 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
2962 }; 2904 };
2963 2905
2964 OrderedSocketData data(reads, arraysize(reads), 2906 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2965 writes, arraysize(writes));
2966 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2907 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2967 BoundNetLog(), GetParam(), NULL); 2908 BoundNetLog(), GetParam(), NULL);
2968 2909
2969 helper.RunPreTestSetup(); 2910 helper.RunPreTestSetup();
2970 helper.AddData(&data); 2911 helper.AddData(&data);
2971 2912
2972 HttpNetworkTransaction* trans = helper.trans(); 2913 HttpNetworkTransaction* trans = helper.trans();
2973 2914
2974 // Start the transaction with basic parameters. 2915 // Start the transaction with basic parameters.
2975 TestCompletionCallback callback; 2916 TestCompletionCallback callback;
2976 int rv = trans->Start( 2917 int rv = trans->Start(
2977 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2918 &CreateGetRequest(), callback.callback(), BoundNetLog());
2978 EXPECT_EQ(ERR_IO_PENDING, rv); 2919 EXPECT_EQ(ERR_IO_PENDING, rv);
2979 rv = callback.WaitForResult(); 2920 rv = callback.WaitForResult();
2980 EXPECT_EQ(OK, rv); 2921 EXPECT_EQ(OK, rv);
2981 2922
2982 // Verify that we consumed all test data. 2923 // Verify that we consumed all test data.
2983 EXPECT_TRUE(data.AllReadDataConsumed()) 2924 EXPECT_TRUE(data.AllReadDataConsumed());
2984 << "Read count: " << data.read_count() 2925 EXPECT_TRUE(data.AllWriteDataConsumed());
2985 << " Read index: " << data.read_index();
2986 EXPECT_TRUE(data.AllWriteDataConsumed())
2987 << "Write count: " << data.write_count()
2988 << " Write index: " << data.write_index();
2989 2926
2990 // Verify the SYN_REPLY. 2927 // Verify the SYN_REPLY.
2991 HttpResponseInfo response = *trans->GetResponseInfo(); 2928 HttpResponseInfo response = *trans->GetResponseInfo();
2992 EXPECT_TRUE(response.headers.get() != NULL); 2929 EXPECT_TRUE(response.headers.get() != NULL);
2993 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2930 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2994 } 2931 }
2995 2932
2996 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { 2933 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
2997 scoped_ptr<SpdyFrame> stream1_syn( 2934 scoped_ptr<SpdyFrame> stream1_syn(
2998 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2935 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
2999 scoped_ptr<SpdyFrame> stream1_body( 2936 scoped_ptr<SpdyFrame> stream1_body(
3000 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2937 spdy_util_.ConstructSpdyBodyFrame(1, true));
3001 scoped_ptr<SpdyFrame> stream2_rst( 2938 scoped_ptr<SpdyFrame> stream2_rst(
3002 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); 2939 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM));
3003 MockWrite writes[] = { 2940 MockWrite writes[] = {
3004 CreateMockWrite(*stream1_syn, 1), 2941 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
3005 CreateMockWrite(*stream2_rst, 4),
3006 }; 2942 };
3007 2943
3008 scoped_ptr<SpdyFrame> 2944 scoped_ptr<SpdyFrame>
3009 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2945 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3010 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2946 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
3011 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); 2947 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str()));
3012 MockRead reads[] = { 2948 MockRead reads[] = {
3013 CreateMockRead(*stream1_reply, 2), 2949 CreateMockRead(*stream1_reply, 1),
3014 CreateMockRead(*stream2_syn, 3), 2950 CreateMockRead(*stream2_syn, 2),
3015 CreateMockRead(*stream1_body, 4), 2951 CreateMockRead(*stream1_body, 4),
3016 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2952 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
3017 }; 2953 };
3018 2954
3019 OrderedSocketData data(reads, arraysize(reads), 2955 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3020 writes, arraysize(writes));
3021 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2956 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3022 BoundNetLog(), GetParam(), NULL); 2957 BoundNetLog(), GetParam(), NULL);
3023 2958
3024 helper.RunPreTestSetup(); 2959 helper.RunPreTestSetup();
3025 helper.AddData(&data); 2960 helper.AddData(&data);
3026 2961
3027 HttpNetworkTransaction* trans = helper.trans(); 2962 HttpNetworkTransaction* trans = helper.trans();
3028 2963
3029 // Start the transaction with basic parameters. 2964 // Start the transaction with basic parameters.
3030 TestCompletionCallback callback; 2965 TestCompletionCallback callback;
3031 int rv = trans->Start( 2966 int rv = trans->Start(
3032 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2967 &CreateGetRequest(), callback.callback(), BoundNetLog());
3033 EXPECT_EQ(ERR_IO_PENDING, rv); 2968 EXPECT_EQ(ERR_IO_PENDING, rv);
3034 rv = callback.WaitForResult(); 2969 rv = callback.WaitForResult();
3035 EXPECT_EQ(OK, rv); 2970 EXPECT_EQ(OK, rv);
3036 2971
3037 // Verify that we consumed all test data. 2972 // Verify that we consumed all test data.
3038 EXPECT_TRUE(data.AllReadDataConsumed()) 2973 EXPECT_TRUE(data.AllReadDataConsumed());
3039 << "Read count: " << data.read_count() 2974 EXPECT_TRUE(data.AllWriteDataConsumed());
3040 << " Read index: " << data.read_index();
3041 EXPECT_TRUE(data.AllWriteDataConsumed())
3042 << "Write count: " << data.write_count()
3043 << " Write index: " << data.write_index();
3044 2975
3045 // Verify the SYN_REPLY. 2976 // Verify the SYN_REPLY.
3046 HttpResponseInfo response = *trans->GetResponseInfo(); 2977 HttpResponseInfo response = *trans->GetResponseInfo();
3047 EXPECT_TRUE(response.headers.get() != NULL); 2978 EXPECT_TRUE(response.headers.get() != NULL);
3048 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2979 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
3049 } 2980 }
3050 2981
3051 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) { 2982 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) {
3052 scoped_ptr<SpdyFrame> stream1_syn( 2983 scoped_ptr<SpdyFrame> stream1_syn(
3053 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 2984 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3054 scoped_ptr<SpdyFrame> stream1_body( 2985 scoped_ptr<SpdyFrame> stream1_body(
3055 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2986 spdy_util_.ConstructSpdyBodyFrame(1, true));
3056 scoped_ptr<SpdyFrame> stream2_rst( 2987 scoped_ptr<SpdyFrame> stream2_rst(
3057 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2988 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
3058 MockWrite writes[] = { 2989 MockWrite writes[] = {
3059 CreateMockWrite(*stream1_syn, 1), 2990 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
3060 CreateMockWrite(*stream2_rst, 4),
3061 }; 2991 };
3062 2992
3063 scoped_ptr<SpdyFrame> 2993 scoped_ptr<SpdyFrame>
3064 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2994 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3065 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock()); 2995 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock());
3066 (*incomplete_headers)["hello"] = "bye"; 2996 (*incomplete_headers)["hello"] = "bye";
3067 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK"; 2997 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK";
3068 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 2998 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
3069 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 2999 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
3070 incomplete_headers.Pass(), 2, 1)); 3000 incomplete_headers.Pass(), 2, 1));
3071 MockRead reads[] = { 3001 MockRead reads[] = {
3072 CreateMockRead(*stream1_reply, 2), 3002 CreateMockRead(*stream1_reply, 1),
3073 CreateMockRead(*stream2_syn, 3), 3003 CreateMockRead(*stream2_syn, 2),
3074 CreateMockRead(*stream1_body, 4), 3004 CreateMockRead(*stream1_body, 4),
3075 MockRead(ASYNC, ERR_IO_PENDING, 5) // Force a pause 3005 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
3076 }; 3006 };
3077 3007
3078 OrderedSocketData data(reads, arraysize(reads), 3008 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3079 writes, arraysize(writes));
3080 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3009 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3081 BoundNetLog(), GetParam(), NULL); 3010 BoundNetLog(), GetParam(), NULL);
3082 3011
3083 helper.RunPreTestSetup(); 3012 helper.RunPreTestSetup();
3084 helper.AddData(&data); 3013 helper.AddData(&data);
3085 3014
3086 HttpNetworkTransaction* trans = helper.trans(); 3015 HttpNetworkTransaction* trans = helper.trans();
3087 3016
3088 // Start the transaction with basic parameters. 3017 // Start the transaction with basic parameters.
3089 TestCompletionCallback callback; 3018 TestCompletionCallback callback;
3090 int rv = trans->Start( 3019 int rv = trans->Start(
3091 &CreateGetRequest(), callback.callback(), BoundNetLog()); 3020 &CreateGetRequest(), callback.callback(), BoundNetLog());
3092 EXPECT_EQ(ERR_IO_PENDING, rv); 3021 EXPECT_EQ(ERR_IO_PENDING, rv);
3093 rv = callback.WaitForResult(); 3022 rv = callback.WaitForResult();
3094 EXPECT_EQ(OK, rv); 3023 EXPECT_EQ(OK, rv);
3024
3095 // Verify that we consumed all test data. 3025 // Verify that we consumed all test data.
3096 EXPECT_TRUE(data.AllReadDataConsumed()) 3026 EXPECT_TRUE(data.AllReadDataConsumed());
3097 << "Read count: " << data.read_count() 3027 EXPECT_TRUE(data.AllWriteDataConsumed());
3098 << " Read index: " << data.read_index();
3099 EXPECT_TRUE(data.AllWriteDataConsumed())
3100 << "Write count: " << data.write_count()
3101 << " Write index: " << data.write_index();
3102 3028
3103 // Verify the SYN_REPLY. 3029 // Verify the SYN_REPLY.
3104 HttpResponseInfo response = *trans->GetResponseInfo(); 3030 HttpResponseInfo response = *trans->GetResponseInfo();
3105 EXPECT_TRUE(response.headers.get() != NULL); 3031 EXPECT_TRUE(response.headers.get() != NULL);
3106 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 3032 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
3107 } 3033 }
3108 3034
3109 // Verify that various SynReply headers parse correctly through the 3035 // Verify that various SynReply headers parse correctly through the
3110 // HTTP layer. 3036 // HTTP layer.
3111 TEST_P(SpdyNetworkTransactionTest, SynReplyHeaders) { 3037 TEST_P(SpdyNetworkTransactionTest, SynReplyHeaders) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3149 if (spdy_util_.spdy_version() < SPDY4) { 3075 if (spdy_util_.spdy_version() < SPDY4) {
3150 // SPDY4/HTTP2 eliminates use of the :version header. 3076 // SPDY4/HTTP2 eliminates use of the :version header.
3151 test_cases[0].expected_headers["version"] = "HTTP/1.1"; 3077 test_cases[0].expected_headers["version"] = "HTTP/1.1";
3152 test_cases[1].expected_headers["version"] = "HTTP/1.1"; 3078 test_cases[1].expected_headers["version"] = "HTTP/1.1";
3153 test_cases[2].expected_headers["version"] = "HTTP/1.1"; 3079 test_cases[2].expected_headers["version"] = "HTTP/1.1";
3154 } 3080 }
3155 3081
3156 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3082 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3157 scoped_ptr<SpdyFrame> req( 3083 scoped_ptr<SpdyFrame> req(
3158 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3084 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3159 MockWrite writes[] = { CreateMockWrite(*req) }; 3085 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3160 3086
3161 scoped_ptr<SpdyFrame> resp( 3087 scoped_ptr<SpdyFrame> resp(
3162 spdy_util_.ConstructSpdyGetSynReply(test_cases[i].extra_headers, 3088 spdy_util_.ConstructSpdyGetSynReply(test_cases[i].extra_headers,
3163 test_cases[i].num_headers, 3089 test_cases[i].num_headers,
3164 1)); 3090 1));
3165 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3091 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3166 MockRead reads[] = { 3092 MockRead reads[] = {
3167 CreateMockRead(*resp), 3093 CreateMockRead(*resp, 1),
3168 CreateMockRead(*body), 3094 CreateMockRead(*body, 2),
3169 MockRead(ASYNC, 0, 0) // EOF 3095 MockRead(ASYNC, 0, 3) // EOF
3170 }; 3096 };
3171 3097
3172 DelayedSocketData data(1, reads, arraysize(reads), 3098 SequencedSocketData data(reads, arraysize(reads), writes,
3173 writes, arraysize(writes)); 3099 arraysize(writes));
3174 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3100 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3175 BoundNetLog(), GetParam(), NULL); 3101 BoundNetLog(), GetParam(), NULL);
3176 helper.RunToCompletion(&data); 3102 helper.RunToCompletion(&data);
3177 TransactionHelperResult out = helper.output(); 3103 TransactionHelperResult out = helper.output();
3178 3104
3179 EXPECT_EQ(OK, out.rv); 3105 EXPECT_EQ(OK, out.rv);
3180 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3106 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3181 EXPECT_EQ("hello!", out.response_data); 3107 EXPECT_EQ("hello!", out.response_data);
3182 3108
3183 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
3267 }; 3193 };
3268 3194
3269 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3195 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3270 // Construct the request. 3196 // Construct the request.
3271 scoped_ptr<SpdyFrame> frame_req( 3197 scoped_ptr<SpdyFrame> frame_req(
3272 spdy_util_.ConstructSpdyGet(test_cases[i].extra_headers[0], 3198 spdy_util_.ConstructSpdyGet(test_cases[i].extra_headers[0],
3273 test_cases[i].num_headers[0], 3199 test_cases[i].num_headers[0],
3274 false, 1, LOWEST, true)); 3200 false, 1, LOWEST, true));
3275 3201
3276 MockWrite writes[] = { 3202 MockWrite writes[] = {
3277 CreateMockWrite(*frame_req), 3203 CreateMockWrite(*frame_req, 0),
3278 }; 3204 };
3279 3205
3280 // Construct the reply. 3206 // Construct the reply.
3281 SpdyHeaderBlock reply_headers; 3207 SpdyHeaderBlock reply_headers;
3282 AppendToHeaderBlock(test_cases[i].extra_headers[1], 3208 AppendToHeaderBlock(test_cases[i].extra_headers[1],
3283 test_cases[i].num_headers[1], 3209 test_cases[i].num_headers[1],
3284 &reply_headers); 3210 &reply_headers);
3285 scoped_ptr<SpdyFrame> frame_reply( 3211 scoped_ptr<SpdyFrame> frame_reply(
3286 spdy_util_.ConstructSpdyReply(1, reply_headers)); 3212 spdy_util_.ConstructSpdyReply(1, reply_headers));
3287 3213
3288 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3214 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3289 MockRead reads[] = { 3215 MockRead reads[] = {
3290 CreateMockRead(*frame_reply), 3216 CreateMockRead(*frame_reply, 1),
3291 CreateMockRead(*body), 3217 CreateMockRead(*body, 2),
3292 MockRead(ASYNC, 0, 0) // EOF 3218 MockRead(ASYNC, 0, 3) // EOF
3293 }; 3219 };
3294 3220
3295 // Attach the headers to the request. 3221 // Attach the headers to the request.
3296 int header_count = test_cases[i].num_headers[0]; 3222 int header_count = test_cases[i].num_headers[0];
3297 3223
3298 HttpRequestInfo request = CreateGetRequest(); 3224 HttpRequestInfo request = CreateGetRequest();
3299 for (int ct = 0; ct < header_count; ct++) { 3225 for (int ct = 0; ct < header_count; ct++) {
3300 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];
3301 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];
3302 request.extra_headers.SetHeader(header_key, header_value); 3228 request.extra_headers.SetHeader(header_key, header_value);
3303 } 3229 }
3304 3230
3305 DelayedSocketData data(1, reads, arraysize(reads), 3231 SequencedSocketData data(reads, arraysize(reads), writes,
3306 writes, arraysize(writes)); 3232 arraysize(writes));
3307 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 3233 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
3308 BoundNetLog(), GetParam(), NULL); 3234 BoundNetLog(), GetParam(), NULL);
3309 helper.RunToCompletion(&data); 3235 helper.RunToCompletion(&data);
3310 TransactionHelperResult out = helper.output(); 3236 TransactionHelperResult out = helper.output();
3311 3237
3312 EXPECT_EQ(OK, out.rv) << i; 3238 EXPECT_EQ(OK, out.rv) << i;
3313 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line) << i; 3239 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line) << i;
3314 EXPECT_EQ("hello!", out.response_data) << i; 3240 EXPECT_EQ("hello!", out.response_data) << i;
3315 3241
3316 // Test the response information. 3242 // Test the response information.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3369 // SYN_REPLY with no headers 3295 // SYN_REPLY with no headers
3370 { 0, { NULL }, }, 3296 { 0, { NULL }, },
3371 }; 3297 };
3372 3298
3373 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3299 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3374 scoped_ptr<SpdyFrame> req( 3300 scoped_ptr<SpdyFrame> req(
3375 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3301 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3376 scoped_ptr<SpdyFrame> rst( 3302 scoped_ptr<SpdyFrame> rst(
3377 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 3303 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
3378 MockWrite writes[] = { 3304 MockWrite writes[] = {
3379 CreateMockWrite(*req), 3305 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
3380 CreateMockWrite(*rst),
3381 }; 3306 };
3382 3307
3383 // Construct the reply. 3308 // Construct the reply.
3384 SpdyHeaderBlock reply_headers; 3309 SpdyHeaderBlock reply_headers;
3385 AppendToHeaderBlock( 3310 AppendToHeaderBlock(
3386 test_cases[i].headers, test_cases[i].num_headers, &reply_headers); 3311 test_cases[i].headers, test_cases[i].num_headers, &reply_headers);
3387 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyReply(1, reply_headers)); 3312 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyReply(1, reply_headers));
3388 MockRead reads[] = { 3313 MockRead reads[] = {
3389 CreateMockRead(*resp), 3314 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3) // EOF
3390 MockRead(ASYNC, 0, 0) // EOF
3391 }; 3315 };
3392 3316
3393 DelayedSocketData data(1, reads, arraysize(reads), 3317 SequencedSocketData data(reads, arraysize(reads), writes,
3394 writes, arraysize(writes)); 3318 arraysize(writes));
3395 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3319 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3396 BoundNetLog(), GetParam(), NULL); 3320 BoundNetLog(), GetParam(), NULL);
3397 helper.RunToCompletion(&data); 3321 helper.RunToCompletion(&data);
3398 TransactionHelperResult out = helper.output(); 3322 TransactionHelperResult out = helper.output();
3399 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3323 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3400 } 3324 }
3401 } 3325 }
3402 3326
3403 // Verify that we don't crash on some corrupt frames. 3327 // Verify that we don't crash on some corrupt frames.
3404 // TODO(jgraettinger): SPDY4 and up treats a header decompression failure as a 3328 // TODO(jgraettinger): SPDY4 and up treats a header decompression failure as a
(...skipping 20 matching lines...) Expand all
3425 } test_cases[] = { 3349 } test_cases[] = {
3426 { syn_reply_wrong_length.get(), }, 3350 { syn_reply_wrong_length.get(), },
3427 }; 3351 };
3428 3352
3429 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3353 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3430 scoped_ptr<SpdyFrame> req( 3354 scoped_ptr<SpdyFrame> req(
3431 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3355 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3432 scoped_ptr<SpdyFrame> rst( 3356 scoped_ptr<SpdyFrame> rst(
3433 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 3357 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
3434 MockWrite writes[] = { 3358 MockWrite writes[] = {
3435 CreateMockWrite(*req), 3359 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3),
3436 CreateMockWrite(*rst),
3437 }; 3360 };
3438 3361
3439 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3362 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3440 MockRead reads[] = { 3363 MockRead reads[] = {
3441 MockRead(ASYNC, test_cases[i].syn_reply->data(), wrong_size), 3364 MockRead(ASYNC, test_cases[i].syn_reply->data(), wrong_size, 1),
3442 CreateMockRead(*body), 3365 CreateMockRead(*body, 2),
3443 MockRead(ASYNC, 0, 0) // EOF 3366 MockRead(ASYNC, 0, 4) // EOF
3444 }; 3367 };
3445 3368
3446 DelayedSocketData data(1, reads, arraysize(reads), 3369 SequencedSocketData data(reads, arraysize(reads), writes,
3447 writes, arraysize(writes)); 3370 arraysize(writes));
3448 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3371 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3449 BoundNetLog(), GetParam(), NULL); 3372 BoundNetLog(), GetParam(), NULL);
3450 helper.RunToCompletion(&data); 3373 helper.RunToCompletion(&data);
3451 TransactionHelperResult out = helper.output(); 3374 TransactionHelperResult out = helper.output();
3452 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3375 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3453 } 3376 }
3454 } 3377 }
3455 3378
3456 // SPDY4 treats a header decompression failure as a connection-level error. 3379 // SPDY4 treats a header decompression failure as a connection-level error.
3457 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionErrorSpdy4) { 3380 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionErrorSpdy4) {
3458 if (spdy_util_.spdy_version() < SPDY4) { 3381 if (spdy_util_.spdy_version() < SPDY4) {
3459 return; 3382 return;
3460 } 3383 }
3461 // This is the length field that's too short. 3384 // This is the length field that's too short.
3462 scoped_ptr<SpdyFrame> syn_reply_wrong_length( 3385 scoped_ptr<SpdyFrame> syn_reply_wrong_length(
3463 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3386 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3464 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3387 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3465 size_t right_size = 3388 size_t right_size =
3466 syn_reply_wrong_length->size() - framer.GetControlFrameHeaderSize(); 3389 syn_reply_wrong_length->size() - framer.GetControlFrameHeaderSize();
3467 size_t wrong_size = right_size - 4; 3390 size_t wrong_size = right_size - 4;
3468 test::SetFrameLength(syn_reply_wrong_length.get(), 3391 test::SetFrameLength(syn_reply_wrong_length.get(),
3469 wrong_size, 3392 wrong_size,
3470 spdy_util_.spdy_version()); 3393 spdy_util_.spdy_version());
3471 3394
3472 scoped_ptr<SpdyFrame> req( 3395 scoped_ptr<SpdyFrame> req(
3473 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3396 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3474 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3397 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3475 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3398 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3476 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3399 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3477 3400
3478 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3401 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3479 MockRead reads[] = { 3402 MockRead reads[] = {
3480 MockRead(ASYNC, syn_reply_wrong_length->data(), 3403 MockRead(ASYNC, syn_reply_wrong_length->data(),
3481 syn_reply_wrong_length->size() - 4), 3404 syn_reply_wrong_length->size() - 4, 1),
3482 }; 3405 };
3483 3406
3484 DelayedSocketData data(1, reads, arraysize(reads), 3407 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3485 writes, arraysize(writes));
3486 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3408 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3487 BoundNetLog(), GetParam(), NULL); 3409 BoundNetLog(), GetParam(), NULL);
3488 helper.RunToCompletion(&data); 3410 helper.RunToCompletion(&data);
3489 TransactionHelperResult out = helper.output(); 3411 TransactionHelperResult out = helper.output();
3490 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3412 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3491 } 3413 }
3492 3414
3493 TEST_P(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) { 3415 TEST_P(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) {
3494 if (GetParam().protocol < kProtoSPDY4MinimumVersion) { 3416 if (GetParam().protocol < kProtoSPDY4MinimumVersion) {
3495 // Decompression failures are a stream error in SPDY3 and above. 3417 // Decompression failures are a stream error in SPDY3 and above.
3496 return; 3418 return;
3497 } 3419 }
3498 scoped_ptr<SpdyFrame> req( 3420 scoped_ptr<SpdyFrame> req(
3499 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3421 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3500 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3422 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3501 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3423 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3502 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3424 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3503 3425
3504 // Read HEADERS with corrupted payload. 3426 // Read HEADERS with corrupted payload.
3505 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3427 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3506 memset(resp->data() + 12, 0xff, resp->size() - 12); 3428 memset(resp->data() + 12, 0xff, resp->size() - 12);
3507 MockRead reads[] = {CreateMockRead(*resp)}; 3429 MockRead reads[] = {CreateMockRead(*resp, 1)};
3508 3430
3509 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 3431 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3510 NormalSpdyTransactionHelper helper( 3432 NormalSpdyTransactionHelper helper(
3511 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 3433 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
3512 helper.RunToCompletion(&data); 3434 helper.RunToCompletion(&data);
3513 TransactionHelperResult out = helper.output(); 3435 TransactionHelperResult out = helper.output();
3514 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3436 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3515 } 3437 }
3516 3438
3517 TEST_P(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) { 3439 TEST_P(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) {
3518 scoped_ptr<SpdyFrame> req( 3440 scoped_ptr<SpdyFrame> req(
3519 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3441 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3520 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3442 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3521 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME).")); 3443 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME)."));
3522 MockWrite writes[] = {CreateMockWrite(*req), CreateMockWrite(*goaway)}; 3444 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3523 3445
3524 // Read WINDOW_UPDATE with incorrectly-sized payload. 3446 // Read WINDOW_UPDATE with incorrectly-sized payload.
3525 // TODO(jgraettinger): SpdyFramer signals this as an INVALID_CONTROL_FRAME, 3447 // TODO(jgraettinger): SpdyFramer signals this as an INVALID_CONTROL_FRAME,
3526 // which is mapped to a protocol error, and not a frame size error. 3448 // which is mapped to a protocol error, and not a frame size error.
3527 scoped_ptr<SpdyFrame> bad_window_update( 3449 scoped_ptr<SpdyFrame> bad_window_update(
3528 spdy_util_.ConstructSpdyWindowUpdate(1, 1)); 3450 spdy_util_.ConstructSpdyWindowUpdate(1, 1));
3529 test::SetFrameLength(bad_window_update.get(), 3451 test::SetFrameLength(bad_window_update.get(),
3530 bad_window_update->size() - 1, 3452 bad_window_update->size() - 1,
3531 spdy_util_.spdy_version()); 3453 spdy_util_.spdy_version());
3532 MockRead reads[] = {CreateMockRead(*bad_window_update)}; 3454 MockRead reads[] = {CreateMockRead(*bad_window_update, 1)};
3533 3455
3534 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 3456 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3535 NormalSpdyTransactionHelper helper( 3457 NormalSpdyTransactionHelper helper(
3536 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 3458 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
3537 helper.RunToCompletion(&data); 3459 helper.RunToCompletion(&data);
3538 TransactionHelperResult out = helper.output(); 3460 TransactionHelperResult out = helper.output();
3539 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3461 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3540 } 3462 }
3541 3463
3542 // Test that we shutdown correctly on write errors. 3464 // Test that we shutdown correctly on write errors.
3543 TEST_P(SpdyNetworkTransactionTest, WriteError) { 3465 TEST_P(SpdyNetworkTransactionTest, WriteError) {
3544 scoped_ptr<SpdyFrame> req( 3466 scoped_ptr<SpdyFrame> req(
(...skipping 28 matching lines...) Expand all
3573 EXPECT_EQ(ERR_FAILED, out.rv); 3495 EXPECT_EQ(ERR_FAILED, out.rv);
3574 } 3496 }
3575 3497
3576 // Test that partial writes work. 3498 // Test that partial writes work.
3577 TEST_P(SpdyNetworkTransactionTest, PartialWrite) { 3499 TEST_P(SpdyNetworkTransactionTest, PartialWrite) {
3578 // Chop the SYN_STREAM frame into 5 chunks. 3500 // Chop the SYN_STREAM frame into 5 chunks.
3579 scoped_ptr<SpdyFrame> req( 3501 scoped_ptr<SpdyFrame> req(
3580 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3502 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3581 const int kChunks = 5; 3503 const int kChunks = 5;
3582 scoped_ptr<MockWrite[]> writes(ChopWriteFrame(*req.get(), kChunks)); 3504 scoped_ptr<MockWrite[]> writes(ChopWriteFrame(*req.get(), kChunks));
3505 for (int i = 0; i < kChunks; ++i) {
3506 writes[i].sequence_number = i;
3507 }
3583 3508
3584 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3509 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3585 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3510 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3586 MockRead reads[] = { 3511 MockRead reads[] = {
3587 CreateMockRead(*resp), 3512 CreateMockRead(*resp, kChunks),
3588 CreateMockRead(*body), 3513 CreateMockRead(*body, kChunks + 1),
3589 MockRead(ASYNC, 0, 0) // EOF 3514 MockRead(ASYNC, 0, kChunks + 2) // EOF
3590 }; 3515 };
3591 3516
3592 DelayedSocketData data(kChunks, reads, arraysize(reads), 3517 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks);
3593 writes.get(), kChunks);
3594 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3518 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3595 BoundNetLog(), GetParam(), NULL); 3519 BoundNetLog(), GetParam(), NULL);
3596 helper.RunToCompletion(&data); 3520 helper.RunToCompletion(&data);
3597 TransactionHelperResult out = helper.output(); 3521 TransactionHelperResult out = helper.output();
3598 EXPECT_EQ(OK, out.rv); 3522 EXPECT_EQ(OK, out.rv);
3599 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3523 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3600 EXPECT_EQ("hello!", out.response_data); 3524 EXPECT_EQ("hello!", out.response_data);
3601 } 3525 }
3602 3526
3603 // In this test, we enable compression, but get a uncompressed SynReply from 3527 // In this test, we enable compression, but get a uncompressed SynReply from
3604 // the server. Verify that teardown is all clean. 3528 // the server. Verify that teardown is all clean.
3605 TEST_P(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) { 3529 TEST_P(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) {
3606 if (spdy_util_.spdy_version() >= SPDY4) { 3530 if (spdy_util_.spdy_version() >= SPDY4) {
3607 // HPACK doesn't use deflate compression. 3531 // HPACK doesn't use deflate compression.
3608 return; 3532 return;
3609 } 3533 }
3610 scoped_ptr<SpdyFrame> compressed( 3534 scoped_ptr<SpdyFrame> compressed(
3611 spdy_util_.ConstructSpdyGet(NULL, 0, true, 1, LOWEST, true)); 3535 spdy_util_.ConstructSpdyGet(NULL, 0, true, 1, LOWEST, true));
3612 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3536 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3613 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3537 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3614 MockWrite writes[] = {CreateMockWrite(*compressed), CreateMockWrite(*goaway)}; 3538 MockWrite writes[] = {CreateMockWrite(*compressed, 0),
3539 CreateMockWrite(*goaway, 2)};
3615 3540
3616 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3541 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3617 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3542 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3618 MockRead reads[] = { 3543 MockRead reads[] = {
3619 CreateMockRead(*resp), 3544 CreateMockRead(*resp, 1),
3620 }; 3545 };
3621 3546
3622 DelayedSocketData data(1, reads, arraysize(reads), 3547 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3623 writes, arraysize(writes));
3624 SpdySessionDependencies* session_deps = 3548 SpdySessionDependencies* session_deps =
3625 CreateSpdySessionDependencies(GetParam()); 3549 CreateSpdySessionDependencies(GetParam());
3626 session_deps->enable_compression = true; 3550 session_deps->enable_compression = true;
3627 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3551 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3628 BoundNetLog(), GetParam(), session_deps); 3552 BoundNetLog(), GetParam(), session_deps);
3629 helper.RunToCompletion(&data); 3553 helper.RunToCompletion(&data);
3630 TransactionHelperResult out = helper.output(); 3554 TransactionHelperResult out = helper.output();
3631 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3555 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3632 data.Reset(); 3556 data.Reset();
3633 } 3557 }
3634 3558
3635 // Test that the NetLog contains good data for a simple GET request. 3559 // Test that the NetLog contains good data for a simple GET request.
3636 TEST_P(SpdyNetworkTransactionTest, NetLog) { 3560 TEST_P(SpdyNetworkTransactionTest, NetLog) {
3637 static const char* const kExtraHeaders[] = { 3561 static const char* const kExtraHeaders[] = {
3638 "user-agent", "Chrome", 3562 "user-agent", "Chrome",
3639 }; 3563 };
3640 scoped_ptr<SpdyFrame> req( 3564 scoped_ptr<SpdyFrame> req(
3641 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, false, 1, LOWEST, true)); 3565 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, false, 1, LOWEST, true));
3642 MockWrite writes[] = { CreateMockWrite(*req) }; 3566 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3643 3567
3644 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3568 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3645 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3569 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
3646 MockRead reads[] = { 3570 MockRead reads[] = {
3647 CreateMockRead(*resp), 3571 CreateMockRead(*resp, 1),
3648 CreateMockRead(*body), 3572 CreateMockRead(*body, 2),
3649 MockRead(ASYNC, 0, 0) // EOF 3573 MockRead(ASYNC, 0, 3) // EOF
3650 }; 3574 };
3651 3575
3652 BoundTestNetLog log; 3576 BoundTestNetLog log;
3653 3577
3654 DelayedSocketData data(1, reads, arraysize(reads), 3578 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3655 writes, arraysize(writes));
3656 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(), 3579 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(),
3657 DEFAULT_PRIORITY, 3580 DEFAULT_PRIORITY,
3658 log.bound(), GetParam(), NULL); 3581 log.bound(), GetParam(), NULL);
3659 helper.RunToCompletion(&data); 3582 helper.RunToCompletion(&data);
3660 TransactionHelperResult out = helper.output(); 3583 TransactionHelperResult out = helper.output();
3661 EXPECT_EQ(OK, out.rv); 3584 EXPECT_EQ(OK, out.rv);
3662 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3585 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3663 EXPECT_EQ("hello!", out.response_data); 3586 EXPECT_EQ("hello!", out.response_data);
3664 3587
3665 // Check that the NetLog was filled reasonably. 3588 // Check that the NetLog was filled reasonably.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
3724 3647
3725 // Since we buffer the IO from the stream to the renderer, this test verifies 3648 // Since we buffer the IO from the stream to the renderer, this test verifies
3726 // that when we read out the maximum amount of data (e.g. we received 50 bytes 3649 // that when we read out the maximum amount of data (e.g. we received 50 bytes
3727 // on the network, but issued a Read for only 5 of those bytes) that the data 3650 // on the network, but issued a Read for only 5 of those bytes) that the data
3728 // flow still works correctly. 3651 // flow still works correctly.
3729 TEST_P(SpdyNetworkTransactionTest, BufferFull) { 3652 TEST_P(SpdyNetworkTransactionTest, BufferFull) {
3730 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3653 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3731 3654
3732 scoped_ptr<SpdyFrame> req( 3655 scoped_ptr<SpdyFrame> req(
3733 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3656 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3734 MockWrite writes[] = { CreateMockWrite(*req) }; 3657 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3735 3658
3736 // 2 data frames in a single read. 3659 // 2 data frames in a single read.
3737 scoped_ptr<SpdyFrame> data_frame_1( 3660 scoped_ptr<SpdyFrame> data_frame_1(
3738 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE)); 3661 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE));
3739 scoped_ptr<SpdyFrame> data_frame_2( 3662 scoped_ptr<SpdyFrame> data_frame_2(
3740 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE)); 3663 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE));
3741 const SpdyFrame* data_frames[2] = { 3664 const SpdyFrame* data_frames[2] = {
3742 data_frame_1.get(), 3665 data_frame_1.get(),
3743 data_frame_2.get(), 3666 data_frame_2.get(),
3744 }; 3667 };
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
3913 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 3836 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
3914 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 3837 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
3915 } 3838 }
3916 3839
3917 // Verify the case where we buffer data but read it after it has been buffered. 3840 // Verify the case where we buffer data but read it after it has been buffered.
3918 TEST_P(SpdyNetworkTransactionTest, BufferedAll) { 3841 TEST_P(SpdyNetworkTransactionTest, BufferedAll) {
3919 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); 3842 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false);
3920 3843
3921 scoped_ptr<SpdyFrame> req( 3844 scoped_ptr<SpdyFrame> req(
3922 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 3845 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
3923 MockWrite writes[] = { CreateMockWrite(*req) }; 3846 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3924 3847
3925 // 5 data frames in a single read. 3848 // 5 data frames in a single read.
3926 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3849 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3927 scoped_ptr<SpdyFrame> data_frame( 3850 scoped_ptr<SpdyFrame> data_frame(
3928 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 3851 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
3929 scoped_ptr<SpdyFrame> data_frame_fin( 3852 scoped_ptr<SpdyFrame> data_frame_fin(
3930 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN)); 3853 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN));
3931 const SpdyFrame* frames[5] = {reply.get(), data_frame.get(), data_frame.get(), 3854 const SpdyFrame* frames[5] = {reply.get(), data_frame.get(), data_frame.get(),
3932 data_frame.get(), data_frame_fin.get()}; 3855 data_frame.get(), data_frame_fin.get()};
3933 char combined_frames[200]; 3856 char combined_frames[200];
3934 int combined_frames_len = 3857 int combined_frames_len =
3935 CombineFrames(frames, arraysize(frames), 3858 CombineFrames(frames, arraysize(frames),
3936 combined_frames, arraysize(combined_frames)); 3859 combined_frames, arraysize(combined_frames));
3937 3860
3938 MockRead reads[] = { 3861 MockRead reads[] = {
3939 MockRead(ASYNC, combined_frames, combined_frames_len), 3862 MockRead(ASYNC, combined_frames, combined_frames_len, 1),
3940 MockRead(ASYNC, 0, 0) // EOF 3863 MockRead(ASYNC, 0, 2) // EOF
3941 }; 3864 };
3942 3865
3943 DelayedSocketData data(1, reads, arraysize(reads), 3866 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3944 writes, arraysize(writes));
3945 3867
3946 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3868 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3947 BoundNetLog(), GetParam(), NULL); 3869 BoundNetLog(), GetParam(), NULL);
3948 helper.RunPreTestSetup(); 3870 helper.RunPreTestSetup();
3949 helper.AddData(&data); 3871 helper.AddData(&data);
3950 HttpNetworkTransaction* trans = helper.trans(); 3872 HttpNetworkTransaction* trans = helper.trans();
3951 3873
3952 TestCompletionCallback callback; 3874 TestCompletionCallback callback;
3953 int rv = trans->Start( 3875 int rv = trans->Start(
3954 &CreateGetRequest(), callback.callback(), BoundNetLog()); 3876 &CreateGetRequest(), callback.callback(), BoundNetLog());
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
4187 4109
4188 // Verify that no settings exist initially. 4110 // Verify that no settings exist initially.
4189 HostPortPair host_port_pair("www.example.org", helper.port()); 4111 HostPortPair host_port_pair("www.example.org", helper.port());
4190 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4112 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4191 EXPECT_TRUE(spdy_session_pool->http_server_properties()->GetSpdySettings( 4113 EXPECT_TRUE(spdy_session_pool->http_server_properties()->GetSpdySettings(
4192 host_port_pair).empty()); 4114 host_port_pair).empty());
4193 4115
4194 // Construct the request. 4116 // Construct the request.
4195 scoped_ptr<SpdyFrame> req( 4117 scoped_ptr<SpdyFrame> req(
4196 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4118 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4197 MockWrite writes[] = { CreateMockWrite(*req) }; 4119 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4198 4120
4199 // Construct the reply. 4121 // Construct the reply.
4200 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); 4122 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock());
4201 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; 4123 (*reply_headers)[spdy_util_.GetStatusKey()] = "200";
4202 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 4124 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
4203 scoped_ptr<SpdyFrame> reply( 4125 scoped_ptr<SpdyFrame> reply(
4204 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass())); 4126 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass()));
4205 4127
4206 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH; 4128 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH;
4207 unsigned int kSampleValue1 = 0x0a0a0a0a; 4129 unsigned int kSampleValue1 = 0x0a0a0a0a;
(...skipping 12 matching lines...) Expand all
4220 settings[kSampleId2] = 4142 settings[kSampleId2] =
4221 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kSampleValue2); 4143 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kSampleValue2);
4222 // Next add another persisted setting. 4144 // Next add another persisted setting.
4223 settings[kSampleId3] = 4145 settings[kSampleId3] =
4224 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue3); 4146 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue3);
4225 settings_frame.reset(spdy_util_.ConstructSpdySettings(settings)); 4147 settings_frame.reset(spdy_util_.ConstructSpdySettings(settings));
4226 } 4148 }
4227 4149
4228 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4150 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4229 MockRead reads[] = { 4151 MockRead reads[] = {
4230 CreateMockRead(*reply), 4152 CreateMockRead(*reply, 1),
4231 CreateMockRead(*body), 4153 CreateMockRead(*body, 2),
4232 CreateMockRead(*settings_frame), 4154 CreateMockRead(*settings_frame, 3),
4233 MockRead(ASYNC, 0, 0) // EOF 4155 MockRead(ASYNC, 0, 4) // EOF
4234 }; 4156 };
4235 4157
4236 DelayedSocketData data(1, reads, arraysize(reads), 4158 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4237 writes, arraysize(writes));
4238 helper.AddData(&data); 4159 helper.AddData(&data);
4239 helper.RunDefaultTest(); 4160 helper.RunDefaultTest();
4240 helper.VerifyDataConsumed(); 4161 helper.VerifyDataConsumed();
4241 TransactionHelperResult out = helper.output(); 4162 TransactionHelperResult out = helper.output();
4242 EXPECT_EQ(OK, out.rv); 4163 EXPECT_EQ(OK, out.rv);
4243 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 4164 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
4244 EXPECT_EQ("hello!", out.response_data); 4165 EXPECT_EQ("hello!", out.response_data);
4245 4166
4246 { 4167 {
4247 // Verify we had two persisted settings. 4168 // Verify we had two persisted settings.
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
4398 EXPECT_TRUE(it2 != settings_map.end()); 4319 EXPECT_TRUE(it2 != settings_map.end());
4399 SettingsFlagsAndValue flags_and_value2 = it2->second; 4320 SettingsFlagsAndValue flags_and_value2 = it2->second;
4400 EXPECT_EQ(SETTINGS_FLAG_PERSISTED, flags_and_value2.first); 4321 EXPECT_EQ(SETTINGS_FLAG_PERSISTED, flags_and_value2.first);
4401 EXPECT_EQ(kSampleValue2, flags_and_value2.second); 4322 EXPECT_EQ(kSampleValue2, flags_and_value2.second);
4402 } 4323 }
4403 } 4324 }
4404 4325
4405 TEST_P(SpdyNetworkTransactionTest, GoAwayWithActiveStream) { 4326 TEST_P(SpdyNetworkTransactionTest, GoAwayWithActiveStream) {
4406 scoped_ptr<SpdyFrame> req( 4327 scoped_ptr<SpdyFrame> req(
4407 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4328 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4408 MockWrite writes[] = { CreateMockWrite(*req) }; 4329 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4409 4330
4410 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway()); 4331 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway());
4411 MockRead reads[] = { 4332 MockRead reads[] = {
4412 CreateMockRead(*go_away), 4333 CreateMockRead(*go_away, 1),
4413 }; 4334 };
4414 4335
4415 DelayedSocketData data(1, reads, arraysize(reads), 4336 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4416 writes, arraysize(writes));
4417 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4337 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4418 BoundNetLog(), GetParam(), NULL); 4338 BoundNetLog(), GetParam(), NULL);
4419 helper.AddData(&data); 4339 helper.AddData(&data);
4420 helper.RunToCompletion(&data); 4340 helper.RunToCompletion(&data);
4421 TransactionHelperResult out = helper.output(); 4341 TransactionHelperResult out = helper.output();
4422 EXPECT_EQ(ERR_ABORTED, out.rv); 4342 EXPECT_EQ(ERR_ABORTED, out.rv);
4423 } 4343 }
4424 4344
4425 TEST_P(SpdyNetworkTransactionTest, CloseWithActiveStream) { 4345 TEST_P(SpdyNetworkTransactionTest, CloseWithActiveStream) {
4426 scoped_ptr<SpdyFrame> req( 4346 scoped_ptr<SpdyFrame> req(
4427 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4347 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4428 MockWrite writes[] = { CreateMockWrite(*req) }; 4348 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4429 4349
4430 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4350 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4431 MockRead reads[] = { 4351 MockRead reads[] = {
4432 CreateMockRead(*resp), 4352 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
4433 MockRead(SYNCHRONOUS, 0, 0) // EOF
4434 }; 4353 };
4435 4354
4436 DelayedSocketData data(1, reads, arraysize(reads), 4355 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4437 writes, arraysize(writes));
4438 BoundNetLog log; 4356 BoundNetLog log;
4439 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4357 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4440 log, GetParam(), NULL); 4358 log, GetParam(), NULL);
4441 helper.RunPreTestSetup(); 4359 helper.RunPreTestSetup();
4442 helper.AddData(&data); 4360 helper.AddData(&data);
4443 HttpNetworkTransaction* trans = helper.trans(); 4361 HttpNetworkTransaction* trans = helper.trans();
4444 4362
4445 TestCompletionCallback callback; 4363 TestCompletionCallback callback;
4446 TransactionHelperResult out; 4364 TransactionHelperResult out;
4447 out.rv = trans->Start(&CreateGetRequest(), callback.callback(), log); 4365 out.rv = trans->Start(&CreateGetRequest(), callback.callback(), log);
(...skipping 17 matching lines...) Expand all
4465 // HTTP_1_1_REQUIRED is only supported by SPDY4. 4383 // HTTP_1_1_REQUIRED is only supported by SPDY4.
4466 if (spdy_util_.spdy_version() < SPDY4) 4384 if (spdy_util_.spdy_version() < SPDY4)
4467 return; 4385 return;
4468 4386
4469 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4387 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4470 BoundNetLog(), GetParam(), nullptr); 4388 BoundNetLog(), GetParam(), nullptr);
4471 4389
4472 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4390 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4473 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4391 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4474 MockRead reads[] = { 4392 MockRead reads[] = {
4475 CreateMockRead(*go_away), 4393 CreateMockRead(*go_away, 0),
4476 }; 4394 };
4477 DelayedSocketData data(0, reads, arraysize(reads), nullptr, 0); 4395 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
4478 4396
4479 helper.RunToCompletion(&data); 4397 helper.RunToCompletion(&data);
4480 TransactionHelperResult out = helper.output(); 4398 TransactionHelperResult out = helper.output();
4481 EXPECT_EQ(ERR_HTTP_1_1_REQUIRED, out.rv); 4399 EXPECT_EQ(ERR_HTTP_1_1_REQUIRED, out.rv);
4482 } 4400 }
4483 4401
4484 // Retry with HTTP/1.1 when receiving HTTP_1_1_REQUIRED. Note that no actual 4402 // Retry with HTTP/1.1 when receiving HTTP_1_1_REQUIRED. Note that no actual
4485 // protocol negotiation happens, instead this test forces protocols for both 4403 // protocol negotiation happens, instead this test forces protocols for both
4486 // sockets. 4404 // sockets.
4487 TEST_P(SpdyNetworkTransactionTest, HTTP11RequiredRetry) { 4405 TEST_P(SpdyNetworkTransactionTest, HTTP11RequiredRetry) {
(...skipping 13 matching lines...) Expand all
4501 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 4419 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
4502 session_deps->next_protos = SpdyNextProtos(); 4420 session_deps->next_protos = SpdyNextProtos();
4503 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 4421 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
4504 GetParam(), session_deps.release()); 4422 GetParam(), session_deps.release());
4505 4423
4506 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. 4424 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED.
4507 const char* url = request.url.spec().c_str(); 4425 const char* url = request.url.spec().c_str();
4508 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url)); 4426 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url));
4509 scoped_ptr<SpdyFrame> req( 4427 scoped_ptr<SpdyFrame> req(
4510 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, false, true)); 4428 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, false, true));
4511 MockWrite writes0[] = {CreateMockWrite(*req)}; 4429 MockWrite writes0[] = {CreateMockWrite(*req, 0)};
4512 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4430 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4513 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4431 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4514 MockRead reads0[] = {CreateMockRead(*go_away)}; 4432 MockRead reads0[] = {CreateMockRead(*go_away, 1)};
4515 DelayedSocketData data0(1, reads0, arraysize(reads0), writes0, 4433 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4516 arraysize(writes0)); 4434 arraysize(writes0));
4517 4435
4518 scoped_ptr<SSLSocketDataProvider> ssl_provider0( 4436 scoped_ptr<SSLSocketDataProvider> ssl_provider0(
4519 new SSLSocketDataProvider(ASYNC, OK)); 4437 new SSLSocketDataProvider(ASYNC, OK));
4520 // Expect HTTP/2 protocols too in SSLConfig. 4438 // Expect HTTP/2 protocols too in SSLConfig.
4521 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4439 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4522 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); 4440 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31);
4523 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14); 4441 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14);
4524 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4); 4442 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4);
4525 // Force SPDY. 4443 // Force SPDY.
4526 ssl_provider0->SetNextProto(GetParam().protocol); 4444 ssl_provider0->SetNextProto(GetParam().protocol);
4527 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass()); 4445 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass());
4528 4446
4529 // Second socket: falling back to HTTP/1.1. 4447 // Second socket: falling back to HTTP/1.1.
4530 MockWrite writes1[] = {MockWrite( 4448 MockWrite writes1[] = {MockWrite(ASYNC, 0,
4531 "GET / HTTP/1.1\r\n" 4449 "GET / HTTP/1.1\r\n"
4532 "Host: www.example.org\r\n" 4450 "Host: www.example.org\r\n"
4533 "Connection: keep-alive\r\n\r\n")}; 4451 "Connection: keep-alive\r\n\r\n")};
4534 MockRead reads1[] = {MockRead( 4452 MockRead reads1[] = {MockRead(ASYNC, 1,
4535 "HTTP/1.1 200 OK\r\n" 4453 "HTTP/1.1 200 OK\r\n"
4536 "Content-Length: 5\r\n\r\n" 4454 "Content-Length: 5\r\n\r\n"
4537 "hello")}; 4455 "hello")};
4538 DelayedSocketData data1(1, reads1, arraysize(reads1), writes1, 4456 SequencedSocketData data1(reads1, arraysize(reads1), writes1,
4539 arraysize(writes1)); 4457 arraysize(writes1));
4540 4458
4541 scoped_ptr<SSLSocketDataProvider> ssl_provider1( 4459 scoped_ptr<SSLSocketDataProvider> ssl_provider1(
4542 new SSLSocketDataProvider(ASYNC, OK)); 4460 new SSLSocketDataProvider(ASYNC, OK));
4543 // Expect only HTTP/1.1 protocol in SSLConfig. 4461 // Expect only HTTP/1.1 protocol in SSLConfig.
4544 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4462 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4545 // Force HTTP/1.1. 4463 // Force HTTP/1.1.
4546 ssl_provider1->SetNextProto(kProtoHTTP11); 4464 ssl_provider1->SetNextProto(kProtoHTTP11);
4547 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass()); 4465 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass());
4548 4466
4549 base::WeakPtr<HttpServerProperties> http_server_properties = 4467 base::WeakPtr<HttpServerProperties> http_server_properties =
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4592 GetParam(), 4510 GetParam(),
4593 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70"))); 4511 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70")));
4594 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 4512 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
4595 session_deps->next_protos = SpdyNextProtos(); 4513 session_deps->next_protos = SpdyNextProtos();
4596 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 4514 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
4597 GetParam(), session_deps.release()); 4515 GetParam(), session_deps.release());
4598 4516
4599 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED. 4517 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED.
4600 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect( 4518 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect(
4601 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443))); 4519 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
4602 MockWrite writes0[] = {CreateMockWrite(*req)}; 4520 MockWrite writes0[] = {CreateMockWrite(*req, 0)};
4603 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4521 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4604 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4522 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4605 MockRead reads0[] = {CreateMockRead(*go_away)}; 4523 MockRead reads0[] = {CreateMockRead(*go_away, 1)};
4606 DelayedSocketData data0(1, reads0, arraysize(reads0), writes0, 4524 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4607 arraysize(writes0)); 4525 arraysize(writes0));
4608 4526
4609 scoped_ptr<SSLSocketDataProvider> ssl_provider0( 4527 scoped_ptr<SSLSocketDataProvider> ssl_provider0(
4610 new SSLSocketDataProvider(ASYNC, OK)); 4528 new SSLSocketDataProvider(ASYNC, OK));
4611 // Expect HTTP/2 protocols too in SSLConfig. 4529 // Expect HTTP/2 protocols too in SSLConfig.
4612 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4530 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4613 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); 4531 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31);
4614 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14); 4532 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4_14);
4615 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4); 4533 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY4);
4616 // Force SPDY. 4534 // Force SPDY.
4617 ssl_provider0->SetNextProto(GetParam().protocol); 4535 ssl_provider0->SetNextProto(GetParam().protocol);
4618 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass()); 4536 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass());
4619 4537
4620 // Second socket: retry using HTTP/1.1. 4538 // Second socket: retry using HTTP/1.1.
4621 MockWrite writes1[] = { 4539 MockWrite writes1[] = {
4622 MockWrite(ASYNC, 1, 4540 MockWrite(ASYNC, 0,
4623 "CONNECT www.example.org:443 HTTP/1.1\r\n" 4541 "CONNECT www.example.org:443 HTTP/1.1\r\n"
4624 "Host: www.example.org\r\n" 4542 "Host: www.example.org\r\n"
4625 "Proxy-Connection: keep-alive\r\n\r\n"), 4543 "Proxy-Connection: keep-alive\r\n\r\n"),
4626 MockWrite(ASYNC, 3, 4544 MockWrite(ASYNC, 2,
4627 "GET / HTTP/1.1\r\n" 4545 "GET / HTTP/1.1\r\n"
4628 "Host: www.example.org\r\n" 4546 "Host: www.example.org\r\n"
4629 "Connection: keep-alive\r\n\r\n"), 4547 "Connection: keep-alive\r\n\r\n"),
4630 }; 4548 };
4631 4549
4632 MockRead reads1[] = { 4550 MockRead reads1[] = {
4633 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n\r\n"), 4551 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n\r\n"),
4634 MockRead(ASYNC, 4, 4552 MockRead(ASYNC, 3,
4635 "HTTP/1.1 200 OK\r\n" 4553 "HTTP/1.1 200 OK\r\n"
4636 "Content-Length: 5\r\n\r\n" 4554 "Content-Length: 5\r\n\r\n"
4637 "hello"), 4555 "hello"),
4638 }; 4556 };
4639 DelayedSocketData data1(1, reads1, arraysize(reads1), writes1, 4557 SequencedSocketData data1(reads1, arraysize(reads1), writes1,
4640 arraysize(writes1)); 4558 arraysize(writes1));
4641 4559
4642 scoped_ptr<SSLSocketDataProvider> ssl_provider1( 4560 scoped_ptr<SSLSocketDataProvider> ssl_provider1(
4643 new SSLSocketDataProvider(ASYNC, OK)); 4561 new SSLSocketDataProvider(ASYNC, OK));
4644 // Expect only HTTP/1.1 protocol in SSLConfig. 4562 // Expect only HTTP/1.1 protocol in SSLConfig.
4645 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); 4563 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11);
4646 // Force HTTP/1.1. 4564 // Force HTTP/1.1.
4647 ssl_provider1->SetNextProto(kProtoHTTP11); 4565 ssl_provider1->SetNextProto(kProtoHTTP11);
4648 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass()); 4566 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass());
4649 4567
4650 // A third socket is needed for the tunnelled connection. 4568 // A third socket is needed for the tunnelled connection.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
4704 MockWrite writes[] = { 4622 MockWrite writes[] = {
4705 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4623 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4706 CreateMockWrite(*req, 2), 4624 CreateMockWrite(*req, 2),
4707 }; 4625 };
4708 MockRead reads[] = { 4626 MockRead reads[] = {
4709 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4627 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4710 CreateMockRead(*resp, 3), 4628 CreateMockRead(*resp, 3),
4711 CreateMockRead(*body.get(), 4), 4629 CreateMockRead(*body.get(), 4),
4712 MockRead(ASYNC, 0, 0, 5), 4630 MockRead(ASYNC, 0, 0, 5),
4713 }; 4631 };
4714 scoped_ptr<OrderedSocketData> data(new OrderedSocketData( 4632 scoped_ptr<SequencedSocketData> data(new SequencedSocketData(
4715 reads, arraysize(reads), writes, arraysize(writes))); 4633 reads, arraysize(reads), writes, arraysize(writes)));
4716 4634
4717 helper.AddData(data.get()); 4635 helper.AddData(data.get());
4718 TestCompletionCallback callback; 4636 TestCompletionCallback callback;
4719 4637
4720 int rv = trans->Start( 4638 int rv = trans->Start(
4721 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4639 &CreateGetRequest(), callback.callback(), BoundNetLog());
4722 EXPECT_EQ(ERR_IO_PENDING, rv); 4640 EXPECT_EQ(ERR_IO_PENDING, rv);
4723 4641
4724 rv = callback.WaitForResult(); 4642 rv = callback.WaitForResult();
(...skipping 29 matching lines...) Expand all
4754 helper.SetSession(make_scoped_refptr( 4672 helper.SetSession(make_scoped_refptr(
4755 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get()))); 4673 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get())));
4756 4674
4757 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4675 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4758 helper.RunPreTestSetup(); 4676 helper.RunPreTestSetup();
4759 4677
4760 // Construct and send a simple GET request. 4678 // Construct and send a simple GET request.
4761 scoped_ptr<SpdyFrame> req( 4679 scoped_ptr<SpdyFrame> req(
4762 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4680 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4763 MockWrite writes[] = { 4681 MockWrite writes[] = {
4764 CreateMockWrite(*req, 1), 4682 CreateMockWrite(*req, 0),
4765 }; 4683 };
4766 4684
4767 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4685 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4768 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4686 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4769 MockRead reads[] = { 4687 MockRead reads[] = {
4770 CreateMockRead(*resp, 2), 4688 CreateMockRead(*resp, 1),
4771 CreateMockRead(*body, 3), 4689 CreateMockRead(*body, 2),
4772 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 4690 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause
4773 MockRead(ASYNC, 0, 5) // EOF
4774 }; 4691 };
4775 OrderedSocketData data(reads, arraysize(reads), 4692 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4776 writes, arraysize(writes));
4777 helper.AddData(&data); 4693 helper.AddData(&data);
4778 HttpNetworkTransaction* trans = helper.trans(); 4694 HttpNetworkTransaction* trans = helper.trans();
4779 4695
4780 TestCompletionCallback callback; 4696 TestCompletionCallback callback;
4781 TransactionHelperResult out; 4697 TransactionHelperResult out;
4782 out.rv = trans->Start( 4698 out.rv = trans->Start(
4783 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4699 &CreateGetRequest(), callback.callback(), BoundNetLog());
4784 4700
4785 EXPECT_EQ(out.rv, ERR_IO_PENDING); 4701 EXPECT_EQ(out.rv, ERR_IO_PENDING);
4786 out.rv = callback.WaitForResult(); 4702 out.rv = callback.WaitForResult();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4821 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4737 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4822 CreateMockWrite(*req2, 2), 4738 CreateMockWrite(*req2, 2),
4823 }; 4739 };
4824 MockRead reads2[] = { 4740 MockRead reads2[] = {
4825 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4741 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4826 CreateMockRead(*resp2, 3), 4742 CreateMockRead(*resp2, 3),
4827 CreateMockRead(*body2, 4), 4743 CreateMockRead(*body2, 4),
4828 MockRead(ASYNC, 0, 5) // EOF 4744 MockRead(ASYNC, 0, 5) // EOF
4829 }; 4745 };
4830 4746
4831 scoped_ptr<OrderedSocketData> data_proxy(new OrderedSocketData( 4747 scoped_ptr<SequencedSocketData> data_proxy(new SequencedSocketData(
4832 reads2, arraysize(reads2), writes2, arraysize(writes2))); 4748 reads2, arraysize(reads2), writes2, arraysize(writes2)));
4833 4749
4834 // Create another request to www.example.org, but this time through a proxy. 4750 // Create another request to www.example.org, but this time through a proxy.
4835 HttpRequestInfo request_proxy; 4751 HttpRequestInfo request_proxy;
4836 request_proxy.method = "GET"; 4752 request_proxy.method = "GET";
4837 request_proxy.url = GURL(GetDefaultUrlWithPath("/foo.dat")); 4753 request_proxy.url = GURL(GetDefaultUrlWithPath("/foo.dat"));
4838 request_proxy.load_flags = 0; 4754 request_proxy.load_flags = 0;
4839 scoped_ptr<SpdySessionDependencies> ssd_proxy( 4755 scoped_ptr<SpdySessionDependencies> ssd_proxy(
4840 CreateSpdySessionDependencies(GetParam())); 4756 CreateSpdySessionDependencies(GetParam()));
4841 // Ensure that this transaction uses the same SpdySessionPool. 4757 // Ensure that this transaction uses the same SpdySessionPool.
(...skipping 19 matching lines...) Expand all
4861 EXPECT_EQ(0, rv); 4777 EXPECT_EQ(0, rv);
4862 4778
4863 HttpResponseInfo response_proxy = *trans_proxy->GetResponseInfo(); 4779 HttpResponseInfo response_proxy = *trans_proxy->GetResponseInfo();
4864 EXPECT_TRUE(response_proxy.headers.get() != NULL); 4780 EXPECT_TRUE(response_proxy.headers.get() != NULL);
4865 EXPECT_EQ("HTTP/1.1 200 OK", response_proxy.headers->GetStatusLine()); 4781 EXPECT_EQ("HTTP/1.1 200 OK", response_proxy.headers->GetStatusLine());
4866 4782
4867 std::string response_data; 4783 std::string response_data;
4868 ASSERT_EQ(OK, ReadTransaction(trans_proxy, &response_data)); 4784 ASSERT_EQ(OK, ReadTransaction(trans_proxy, &response_data));
4869 EXPECT_EQ("hello!", response_data); 4785 EXPECT_EQ("hello!", response_data);
4870 4786
4871 data.CompleteRead();
4872 helper_proxy.VerifyDataConsumed(); 4787 helper_proxy.VerifyDataConsumed();
4873 } 4788 }
4874 4789
4875 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction 4790 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction
4876 // on a new connection, if the connection was previously known to be good. 4791 // on a new connection, if the connection was previously known to be good.
4877 // This can happen when a server reboots without saying goodbye, or when 4792 // This can happen when a server reboots without saying goodbye, or when
4878 // we're behind a NAT that masked the RST. 4793 // we're behind a NAT that masked the RST.
4879 TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) { 4794 TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) {
4880 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4795 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4881 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4796 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4882 MockRead reads[] = { 4797 MockRead reads[] = {
4883 CreateMockRead(*resp), 4798 CreateMockRead(*resp, 0),
4884 CreateMockRead(*body), 4799 CreateMockRead(*body, 1),
4885 MockRead(ASYNC, ERR_IO_PENDING), 4800 MockRead(ASYNC, ERR_IO_PENDING, 2),
4886 MockRead(ASYNC, ERR_CONNECTION_RESET), 4801 MockRead(ASYNC, ERR_CONNECTION_RESET, 3),
4887 }; 4802 };
4888 4803
4889 MockRead reads2[] = { 4804 MockRead reads2[] = {
4890 CreateMockRead(*resp), 4805 CreateMockRead(*resp, 0),
4891 CreateMockRead(*body), 4806 CreateMockRead(*body, 1),
4892 MockRead(ASYNC, 0, 0) // EOF 4807 MockRead(ASYNC, 0, 2) // EOF
4893 }; 4808 };
4894 4809
4895 // This test has a couple of variants. 4810 // This test has a couple of variants.
4896 enum { 4811 enum {
4897 // Induce the RST while waiting for our transaction to send. 4812 // Induce the RST while waiting for our transaction to send.
4898 VARIANT_RST_DURING_SEND_COMPLETION, 4813 VARIANT_RST_DURING_SEND_COMPLETION,
4899 // Induce the RST while waiting for our transaction to read. 4814 // Induce the RST while waiting for our transaction to read.
4900 // In this case, the send completed - everything copied into the SNDBUF. 4815 // In this case, the send completed - everything copied into the SNDBUF.
4901 VARIANT_RST_DURING_READ_COMPLETION 4816 VARIANT_RST_DURING_READ_COMPLETION
4902 }; 4817 };
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4951 4866
4952 helper.VerifyDataConsumed(); 4867 helper.VerifyDataConsumed();
4953 } 4868 }
4954 } 4869 }
4955 4870
4956 // Test that turning SPDY on and off works properly. 4871 // Test that turning SPDY on and off works properly.
4957 TEST_P(SpdyNetworkTransactionTest, SpdyOnOffToggle) { 4872 TEST_P(SpdyNetworkTransactionTest, SpdyOnOffToggle) {
4958 HttpStreamFactory::set_spdy_enabled(true); 4873 HttpStreamFactory::set_spdy_enabled(true);
4959 scoped_ptr<SpdyFrame> req( 4874 scoped_ptr<SpdyFrame> req(
4960 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4875 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
4961 MockWrite spdy_writes[] = { CreateMockWrite(*req) }; 4876 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)};
4962 4877
4963 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4878 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4964 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4879 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
4965 MockRead spdy_reads[] = { 4880 MockRead spdy_reads[] = {
4966 CreateMockRead(*resp), 4881 CreateMockRead(*resp, 1),
4967 CreateMockRead(*body), 4882 CreateMockRead(*body, 2),
4968 MockRead(ASYNC, 0, 0) // EOF 4883 MockRead(ASYNC, 0, 3) // EOF
4969 }; 4884 };
4970 4885
4971 DelayedSocketData data(1, spdy_reads, arraysize(spdy_reads), 4886 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
4972 spdy_writes, arraysize(spdy_writes)); 4887 arraysize(spdy_writes));
4973 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4888 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4974 BoundNetLog(), GetParam(), NULL); 4889 BoundNetLog(), GetParam(), NULL);
4975 helper.RunToCompletion(&data); 4890 helper.RunToCompletion(&data);
4976 TransactionHelperResult out = helper.output(); 4891 TransactionHelperResult out = helper.output();
4977 EXPECT_EQ(OK, out.rv); 4892 EXPECT_EQ(OK, out.rv);
4978 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 4893 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
4979 EXPECT_EQ("hello!", out.response_data); 4894 EXPECT_EQ("hello!", out.response_data);
4980 4895
4981 HttpStreamFactory::set_spdy_enabled(false); 4896 HttpStreamFactory::set_spdy_enabled(false);
4897 MockWrite http_writes[] = {
4898 MockWrite(SYNCHRONOUS, 0,
4899 "GET / HTTP/1.1\r\n"
4900 "Host: www.example.org\r\n"
4901 "Connection: keep-alive\r\n\r\n"),
4902 };
4903
4982 MockRead http_reads[] = { 4904 MockRead http_reads[] = {
4983 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 4905 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"),
4984 MockRead("hello from http"), 4906 MockRead(SYNCHRONOUS, 2, "hello from http"),
4985 MockRead(SYNCHRONOUS, OK), 4907 MockRead(SYNCHRONOUS, OK, 3),
4986 }; 4908 };
4987 DelayedSocketData data2(1, http_reads, arraysize(http_reads), NULL, 0); 4909 SequencedSocketData data2(http_reads, arraysize(http_reads), http_writes,
4910 arraysize(http_writes));
4988 NormalSpdyTransactionHelper helper2(CreateGetRequest(), DEFAULT_PRIORITY, 4911 NormalSpdyTransactionHelper helper2(CreateGetRequest(), DEFAULT_PRIORITY,
4989 BoundNetLog(), GetParam(), NULL); 4912 BoundNetLog(), GetParam(), NULL);
4990 helper2.SetSpdyDisabled(); 4913 helper2.SetSpdyDisabled();
4991 helper2.RunToCompletion(&data2); 4914 helper2.RunToCompletion(&data2);
4992 TransactionHelperResult out2 = helper2.output(); 4915 TransactionHelperResult out2 = helper2.output();
4993 EXPECT_EQ(OK, out2.rv); 4916 EXPECT_EQ(OK, out2.rv);
4994 EXPECT_EQ("HTTP/1.1 200 OK", out2.status_line); 4917 EXPECT_EQ("HTTP/1.1 200 OK", out2.status_line);
4995 EXPECT_EQ("hello from http", out2.response_data); 4918 EXPECT_EQ("hello from http", out2.response_data);
4996 4919
4997 HttpStreamFactory::set_spdy_enabled(true); 4920 HttpStreamFactory::set_spdy_enabled(true);
4998 } 4921 }
4999 4922
5000 // Tests that Basic authentication works over SPDY 4923 // Tests that Basic authentication works over SPDY
5001 TEST_P(SpdyNetworkTransactionTest, SpdyBasicAuth) { 4924 TEST_P(SpdyNetworkTransactionTest, SpdyBasicAuth) {
5002 HttpStreamFactory::set_spdy_enabled(true); 4925 HttpStreamFactory::set_spdy_enabled(true);
5003 4926
5004 // The first request will be a bare GET, the second request will be a 4927 // The first request will be a bare GET, the second request will be a
5005 // GET with an Authorization header. 4928 // GET with an Authorization header.
5006 scoped_ptr<SpdyFrame> req_get( 4929 scoped_ptr<SpdyFrame> req_get(
5007 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 4930 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5008 const char* const kExtraAuthorizationHeaders[] = { 4931 const char* const kExtraAuthorizationHeaders[] = {
5009 "authorization", "Basic Zm9vOmJhcg==" 4932 "authorization", "Basic Zm9vOmJhcg=="
5010 }; 4933 };
5011 scoped_ptr<SpdyFrame> req_get_authorization( 4934 scoped_ptr<SpdyFrame> req_get_authorization(
5012 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders, 4935 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders,
5013 arraysize(kExtraAuthorizationHeaders) / 2, 4936 arraysize(kExtraAuthorizationHeaders) / 2,
5014 false, 3, LOWEST, true)); 4937 false, 3, LOWEST, true));
5015 MockWrite spdy_writes[] = { 4938 MockWrite spdy_writes[] = {
5016 CreateMockWrite(*req_get, 1), 4939 CreateMockWrite(*req_get, 0), CreateMockWrite(*req_get_authorization, 3),
5017 CreateMockWrite(*req_get_authorization, 4),
5018 }; 4940 };
5019 4941
5020 // The first response is a 401 authentication challenge, and the second 4942 // The first response is a 401 authentication challenge, and the second
5021 // response will be a 200 response since the second request includes a valid 4943 // response will be a 200 response since the second request includes a valid
5022 // Authorization header. 4944 // Authorization header.
5023 const char* const kExtraAuthenticationHeaders[] = { 4945 const char* const kExtraAuthenticationHeaders[] = {
5024 "www-authenticate", 4946 "www-authenticate",
5025 "Basic realm=\"MyRealm\"" 4947 "Basic realm=\"MyRealm\""
5026 }; 4948 };
5027 scoped_ptr<SpdyFrame> resp_authentication( 4949 scoped_ptr<SpdyFrame> resp_authentication(
5028 spdy_util_.ConstructSpdySynReplyError( 4950 spdy_util_.ConstructSpdySynReplyError(
5029 "401 Authentication Required", 4951 "401 Authentication Required",
5030 kExtraAuthenticationHeaders, 4952 kExtraAuthenticationHeaders,
5031 arraysize(kExtraAuthenticationHeaders) / 2, 4953 arraysize(kExtraAuthenticationHeaders) / 2,
5032 1)); 4954 1));
5033 scoped_ptr<SpdyFrame> body_authentication( 4955 scoped_ptr<SpdyFrame> body_authentication(
5034 spdy_util_.ConstructSpdyBodyFrame(1, true)); 4956 spdy_util_.ConstructSpdyBodyFrame(1, true));
5035 scoped_ptr<SpdyFrame> resp_data( 4957 scoped_ptr<SpdyFrame> resp_data(
5036 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 4958 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
5037 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true)); 4959 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true));
5038 MockRead spdy_reads[] = { 4960 MockRead spdy_reads[] = {
5039 CreateMockRead(*resp_authentication, 2), 4961 CreateMockRead(*resp_authentication, 1),
5040 CreateMockRead(*body_authentication, 3), 4962 CreateMockRead(*body_authentication, 2),
5041 CreateMockRead(*resp_data, 5), 4963 CreateMockRead(*resp_data, 4),
5042 CreateMockRead(*body_data, 6), 4964 CreateMockRead(*body_data, 5),
5043 MockRead(ASYNC, 0, 7), 4965 MockRead(ASYNC, 0, 6),
5044 }; 4966 };
5045 4967
5046 OrderedSocketData data(spdy_reads, arraysize(spdy_reads), 4968 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
5047 spdy_writes, arraysize(spdy_writes)); 4969 arraysize(spdy_writes));
5048 HttpRequestInfo request(CreateGetRequest()); 4970 HttpRequestInfo request(CreateGetRequest());
5049 BoundNetLog net_log; 4971 BoundNetLog net_log;
5050 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 4972 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
5051 net_log, GetParam(), NULL); 4973 net_log, GetParam(), NULL);
5052 4974
5053 helper.RunPreTestSetup(); 4975 helper.RunPreTestSetup();
5054 helper.AddData(&data); 4976 helper.AddData(&data);
5055 HttpNetworkTransaction* trans = helper.trans(); 4977 HttpNetworkTransaction* trans = helper.trans();
5056 TestCompletionCallback callback; 4978 TestCompletionCallback callback;
5057 const int rv_start = trans->Start(&request, callback.callback(), net_log); 4979 const int rv_start = trans->Start(&request, callback.callback(), net_log);
(...skipping 30 matching lines...) Expand all
5088 EXPECT_EQ(200, response_restart->headers->response_code()); 5010 EXPECT_EQ(200, response_restart->headers->response_code());
5089 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL); 5011 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL);
5090 } 5012 }
5091 5013
5092 TEST_P(SpdyNetworkTransactionTest, ServerPushWithHeaders) { 5014 TEST_P(SpdyNetworkTransactionTest, ServerPushWithHeaders) {
5093 scoped_ptr<SpdyFrame> stream1_syn( 5015 scoped_ptr<SpdyFrame> stream1_syn(
5094 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5016 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5095 scoped_ptr<SpdyFrame> stream1_body( 5017 scoped_ptr<SpdyFrame> stream1_body(
5096 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5018 spdy_util_.ConstructSpdyBodyFrame(1, true));
5097 MockWrite writes[] = { 5019 MockWrite writes[] = {
5098 CreateMockWrite(*stream1_syn, 1), 5020 CreateMockWrite(*stream1_syn, 0),
5099 }; 5021 };
5100 5022
5101 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); 5023 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock());
5102 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 5024 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
5103 initial_headers.get()); 5025 initial_headers.get());
5104 scoped_ptr<SpdyFrame> stream2_syn( 5026 scoped_ptr<SpdyFrame> stream2_syn(
5105 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1)); 5027 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1));
5106 5028
5107 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5029 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5108 (*late_headers)["hello"] = "bye"; 5030 (*late_headers)["hello"] = "bye";
5109 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; 5031 (*late_headers)[spdy_util_.GetStatusKey()] = "200";
5110 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 5032 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
5111 scoped_ptr<SpdyFrame> stream2_headers( 5033 scoped_ptr<SpdyFrame> stream2_headers(
5112 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5034 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5113 false, 5035 false,
5114 2, 5036 2,
5115 LOWEST, 5037 LOWEST,
5116 HEADERS, 5038 HEADERS,
5117 CONTROL_FLAG_NONE, 5039 CONTROL_FLAG_NONE,
5118 0)); 5040 0));
5119 5041
5120 scoped_ptr<SpdyFrame> 5042 scoped_ptr<SpdyFrame>
5121 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5043 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5122 const char kPushedData[] = "pushed"; 5044 const char kPushedData[] = "pushed";
5123 scoped_ptr<SpdyFrame> stream2_body( 5045 scoped_ptr<SpdyFrame> stream2_body(
5124 spdy_util_.ConstructSpdyBodyFrame( 5046 spdy_util_.ConstructSpdyBodyFrame(
5125 2, kPushedData, strlen(kPushedData), true)); 5047 2, kPushedData, strlen(kPushedData), true));
5126 MockRead reads[] = { 5048 MockRead reads[] = {
5127 CreateMockRead(*stream1_reply, 2), 5049 CreateMockRead(*stream1_reply, 1),
5128 CreateMockRead(*stream2_syn, 3), 5050 CreateMockRead(*stream2_syn, 2),
5129 CreateMockRead(*stream2_headers, 4), 5051 CreateMockRead(*stream2_headers, 3),
5130 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 5052 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
5131 CreateMockRead(*stream2_body, 5), 5053 CreateMockRead(*stream2_body, 5),
5132 MockRead(ASYNC, ERR_IO_PENDING, 7), // Force a pause 5054 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
5133 }; 5055 };
5134 5056
5135 HttpResponseInfo response; 5057 HttpResponseInfo response;
5136 HttpResponseInfo response2; 5058 HttpResponseInfo response2;
5137 std::string expected_push_result("pushed"); 5059 std::string expected_push_result("pushed");
5138 OrderedSocketData data(reads, arraysize(reads), 5060 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5139 writes, arraysize(writes));
5140 RunServerPushTest(&data, 5061 RunServerPushTest(&data,
5141 &response, 5062 &response,
5142 &response2, 5063 &response2,
5143 expected_push_result); 5064 expected_push_result);
5144 5065
5145 // Verify the SYN_REPLY. 5066 // Verify the SYN_REPLY.
5146 EXPECT_TRUE(response.headers.get() != NULL); 5067 EXPECT_TRUE(response.headers.get() != NULL);
5147 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 5068 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
5148 5069
5149 // Verify the pushed stream. 5070 // Verify the pushed stream.
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
5516 EXPECT_TRUE(data.AllReadDataConsumed()); 5437 EXPECT_TRUE(data.AllReadDataConsumed());
5517 EXPECT_TRUE(data.AllWriteDataConsumed()); 5438 EXPECT_TRUE(data.AllWriteDataConsumed());
5518 } 5439 }
5519 5440
5520 TEST_P(SpdyNetworkTransactionTest, SynReplyWithHeaders) { 5441 TEST_P(SpdyNetworkTransactionTest, SynReplyWithHeaders) {
5521 scoped_ptr<SpdyFrame> req( 5442 scoped_ptr<SpdyFrame> req(
5522 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5443 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5523 scoped_ptr<SpdyFrame> rst( 5444 scoped_ptr<SpdyFrame> rst(
5524 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 5445 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
5525 MockWrite writes[] = { 5446 MockWrite writes[] = {
5526 CreateMockWrite(*req), CreateMockWrite(*rst), 5447 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
5527 }; 5448 };
5528 5449
5529 scoped_ptr<SpdyFrame> stream1_reply( 5450 scoped_ptr<SpdyFrame> stream1_reply(
5530 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5451 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5531 5452
5532 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5453 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5533 (*late_headers)["hello"] = "bye"; 5454 (*late_headers)["hello"] = "bye";
5534 scoped_ptr<SpdyFrame> stream1_headers( 5455 scoped_ptr<SpdyFrame> stream1_headers(
5535 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5456 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5536 false, 5457 false,
5537 1, 5458 1,
5538 LOWEST, 5459 LOWEST,
5539 HEADERS, 5460 HEADERS,
5540 CONTROL_FLAG_NONE, 5461 CONTROL_FLAG_NONE,
5541 0)); 5462 0));
5542 scoped_ptr<SpdyFrame> stream1_body( 5463 scoped_ptr<SpdyFrame> stream1_body(
5543 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5464 spdy_util_.ConstructSpdyBodyFrame(1, true));
5544 MockRead reads[] = { 5465 MockRead reads[] = {
5545 CreateMockRead(*stream1_reply), 5466 CreateMockRead(*stream1_reply, 1),
5546 CreateMockRead(*stream1_headers), 5467 CreateMockRead(*stream1_headers, 2),
5547 CreateMockRead(*stream1_body), 5468 CreateMockRead(*stream1_body, 3),
5548 MockRead(ASYNC, 0, 0) // EOF 5469 MockRead(ASYNC, 0, 5) // EOF
5549 }; 5470 };
5550 5471
5551 DelayedSocketData data(1, reads, arraysize(reads), 5472 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5552 writes, arraysize(writes));
5553 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5473 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5554 BoundNetLog(), GetParam(), NULL); 5474 BoundNetLog(), GetParam(), NULL);
5555 helper.RunToCompletion(&data); 5475 helper.RunToCompletion(&data);
5556 TransactionHelperResult out = helper.output(); 5476 TransactionHelperResult out = helper.output();
5557 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 5477 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
5558 } 5478 }
5559 5479
5560 TEST_P(SpdyNetworkTransactionTest, SynReplyWithLateHeaders) { 5480 TEST_P(SpdyNetworkTransactionTest, SynReplyWithLateHeaders) {
5561 scoped_ptr<SpdyFrame> req( 5481 scoped_ptr<SpdyFrame> req(
5562 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5482 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5563 scoped_ptr<SpdyFrame> rst( 5483 scoped_ptr<SpdyFrame> rst(
5564 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 5484 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
5565 MockWrite writes[] = { 5485 MockWrite writes[] = {
5566 CreateMockWrite(*req), 5486 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
5567 CreateMockWrite(*rst),
5568 }; 5487 };
5569 5488
5570 scoped_ptr<SpdyFrame> stream1_reply( 5489 scoped_ptr<SpdyFrame> stream1_reply(
5571 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5490 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5572 5491
5573 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); 5492 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock());
5574 (*late_headers)["hello"] = "bye"; 5493 (*late_headers)["hello"] = "bye";
5575 scoped_ptr<SpdyFrame> stream1_headers( 5494 scoped_ptr<SpdyFrame> stream1_headers(
5576 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), 5495 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(),
5577 false, 5496 false,
5578 1, 5497 1,
5579 LOWEST, 5498 LOWEST,
5580 HEADERS, 5499 HEADERS,
5581 CONTROL_FLAG_NONE, 5500 CONTROL_FLAG_NONE,
5582 0)); 5501 0));
5583 scoped_ptr<SpdyFrame> stream1_body( 5502 scoped_ptr<SpdyFrame> stream1_body(
5584 spdy_util_.ConstructSpdyBodyFrame(1, false)); 5503 spdy_util_.ConstructSpdyBodyFrame(1, false));
5585 scoped_ptr<SpdyFrame> stream1_body2( 5504 scoped_ptr<SpdyFrame> stream1_body2(
5586 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5505 spdy_util_.ConstructSpdyBodyFrame(1, true));
5587 MockRead reads[] = { 5506 MockRead reads[] = {
5588 CreateMockRead(*stream1_reply), 5507 CreateMockRead(*stream1_reply, 1),
5589 CreateMockRead(*stream1_body), 5508 CreateMockRead(*stream1_body, 2),
5590 CreateMockRead(*stream1_headers), 5509 CreateMockRead(*stream1_headers, 3),
5591 CreateMockRead(*stream1_body2), 5510 CreateMockRead(*stream1_body2, 5),
5592 MockRead(ASYNC, 0, 0) // EOF 5511 MockRead(ASYNC, 0, 6) // EOF
5593 }; 5512 };
5594 5513
5595 DelayedSocketData data(1, reads, arraysize(reads), 5514 DelayedSocketData data(1, reads, arraysize(reads),
5596 writes, arraysize(writes)); 5515 writes, arraysize(writes));
5597 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5516 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5598 BoundNetLog(), GetParam(), NULL); 5517 BoundNetLog(), GetParam(), NULL);
5599 helper.RunToCompletion(&data); 5518 helper.RunToCompletion(&data);
5600 TransactionHelperResult out = helper.output(); 5519 TransactionHelperResult out = helper.output();
5601 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 5520 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
5602 } 5521 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5634 const char* url_to_fetch = kTestCases[index]; 5553 const char* url_to_fetch = kTestCases[index];
5635 const char* url_to_push = kTestCases[index + 1]; 5554 const char* url_to_push = kTestCases[index + 1];
5636 5555
5637 scoped_ptr<SpdyFrame> stream1_syn( 5556 scoped_ptr<SpdyFrame> stream1_syn(
5638 spdy_util_.ConstructSpdyGet(url_to_fetch, false, 1, LOWEST)); 5557 spdy_util_.ConstructSpdyGet(url_to_fetch, false, 1, LOWEST));
5639 scoped_ptr<SpdyFrame> stream1_body( 5558 scoped_ptr<SpdyFrame> stream1_body(
5640 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5559 spdy_util_.ConstructSpdyBodyFrame(1, true));
5641 scoped_ptr<SpdyFrame> push_rst( 5560 scoped_ptr<SpdyFrame> push_rst(
5642 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 5561 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
5643 MockWrite writes[] = { 5562 MockWrite writes[] = {
5644 CreateMockWrite(*stream1_syn, 1), 5563 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*push_rst, 3),
5645 CreateMockWrite(*push_rst, 4),
5646 }; 5564 };
5647 5565
5648 scoped_ptr<SpdyFrame> 5566 scoped_ptr<SpdyFrame>
5649 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5567 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5650 scoped_ptr<SpdyFrame> 5568 scoped_ptr<SpdyFrame>
5651 stream2_syn(spdy_util_.ConstructSpdyPush(NULL, 5569 stream2_syn(spdy_util_.ConstructSpdyPush(NULL,
5652 0, 5570 0,
5653 2, 5571 2,
5654 1, 5572 1,
5655 url_to_push)); 5573 url_to_push));
5656 const char kPushedData[] = "pushed"; 5574 const char kPushedData[] = "pushed";
5657 scoped_ptr<SpdyFrame> stream2_body( 5575 scoped_ptr<SpdyFrame> stream2_body(
5658 spdy_util_.ConstructSpdyBodyFrame( 5576 spdy_util_.ConstructSpdyBodyFrame(
5659 2, kPushedData, strlen(kPushedData), true)); 5577 2, kPushedData, strlen(kPushedData), true));
5660 scoped_ptr<SpdyFrame> rst( 5578 scoped_ptr<SpdyFrame> rst(
5661 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); 5579 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL));
5662 5580
5663 MockRead reads[] = { 5581 MockRead reads[] = {
5664 CreateMockRead(*stream1_reply, 2), 5582 CreateMockRead(*stream1_reply, 1),
5665 CreateMockRead(*stream2_syn, 3), 5583 CreateMockRead(*stream2_syn, 2),
5666 CreateMockRead(*stream1_body, 5, SYNCHRONOUS), 5584 CreateMockRead(*stream1_body, 4),
5667 CreateMockRead(*stream2_body, 6), 5585 CreateMockRead(*stream2_body, 5),
5668 MockRead(ASYNC, ERR_IO_PENDING, 7), // Force a pause 5586 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
5669 }; 5587 };
5670 5588
5671 HttpResponseInfo response; 5589 HttpResponseInfo response;
5672 OrderedSocketData data(reads, arraysize(reads), 5590 SequencedSocketData data(reads, arraysize(reads), writes,
5673 writes, arraysize(writes)); 5591 arraysize(writes));
5674 5592
5675 HttpRequestInfo request; 5593 HttpRequestInfo request;
5676 request.method = "GET"; 5594 request.method = "GET";
5677 request.url = GURL(url_to_fetch); 5595 request.url = GURL(url_to_fetch);
5678 request.load_flags = 0; 5596 request.load_flags = 0;
5679 5597
5680 // Enable cross-origin push. Since we are not using a proxy, this should 5598 // Enable cross-origin push. Since we are not using a proxy, this should
5681 // not actually enable cross-origin SPDY push. 5599 // not actually enable cross-origin SPDY push.
5682 scoped_ptr<SpdySessionDependencies> session_deps( 5600 scoped_ptr<SpdySessionDependencies> session_deps(
5683 CreateSpdySessionDependencies(GetParam())); 5601 CreateSpdySessionDependencies(GetParam()));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5717 } 5635 }
5718 } 5636 }
5719 5637
5720 TEST_P(SpdyNetworkTransactionTest, RetryAfterRefused) { 5638 TEST_P(SpdyNetworkTransactionTest, RetryAfterRefused) {
5721 // Construct the request. 5639 // Construct the request.
5722 scoped_ptr<SpdyFrame> req( 5640 scoped_ptr<SpdyFrame> req(
5723 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 5641 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
5724 scoped_ptr<SpdyFrame> req2( 5642 scoped_ptr<SpdyFrame> req2(
5725 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); 5643 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true));
5726 MockWrite writes[] = { 5644 MockWrite writes[] = {
5727 CreateMockWrite(*req, 1), 5645 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 2),
5728 CreateMockWrite(*req2, 3),
5729 }; 5646 };
5730 5647
5731 scoped_ptr<SpdyFrame> refused( 5648 scoped_ptr<SpdyFrame> refused(
5732 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); 5649 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM));
5733 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 5650 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
5734 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(3, true)); 5651 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(3, true));
5735 MockRead reads[] = { 5652 MockRead reads[] = {
5736 CreateMockRead(*refused, 2), 5653 CreateMockRead(*refused, 1),
5737 CreateMockRead(*resp, 4), 5654 CreateMockRead(*resp, 3),
5738 CreateMockRead(*body, 5), 5655 CreateMockRead(*body, 4),
5739 MockRead(ASYNC, 0, 6) // EOF 5656 MockRead(ASYNC, 0, 5) // EOF
5740 }; 5657 };
5741 5658
5742 OrderedSocketData data(reads, arraysize(reads), 5659 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5743 writes, arraysize(writes));
5744 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5660 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5745 BoundNetLog(), GetParam(), NULL); 5661 BoundNetLog(), GetParam(), NULL);
5746 5662
5747 helper.RunPreTestSetup(); 5663 helper.RunPreTestSetup();
5748 helper.AddData(&data); 5664 helper.AddData(&data);
5749 5665
5750 HttpNetworkTransaction* trans = helper.trans(); 5666 HttpNetworkTransaction* trans = helper.trans();
5751 5667
5752 // Start the transaction with basic parameters. 5668 // Start the transaction with basic parameters.
5753 TestCompletionCallback callback; 5669 TestCompletionCallback callback;
5754 int rv = trans->Start( 5670 int rv = trans->Start(
5755 &CreateGetRequest(), callback.callback(), BoundNetLog()); 5671 &CreateGetRequest(), callback.callback(), BoundNetLog());
5756 EXPECT_EQ(ERR_IO_PENDING, rv); 5672 EXPECT_EQ(ERR_IO_PENDING, rv);
5757 rv = callback.WaitForResult(); 5673 rv = callback.WaitForResult();
5758 EXPECT_EQ(OK, rv); 5674 EXPECT_EQ(OK, rv);
5759 5675
5760 // Verify that we consumed all test data. 5676 // Verify that we consumed all test data.
5761 EXPECT_TRUE(data.AllReadDataConsumed()) 5677 EXPECT_TRUE(data.AllReadDataConsumed());
5762 << "Read count: " << data.read_count() 5678 EXPECT_TRUE(data.AllWriteDataConsumed());
5763 << " Read index: " << data.read_index();
5764 EXPECT_TRUE(data.AllWriteDataConsumed())
5765 << "Write count: " << data.write_count()
5766 << " Write index: " << data.write_index();
5767 5679
5768 // Verify the SYN_REPLY. 5680 // Verify the SYN_REPLY.
5769 HttpResponseInfo response = *trans->GetResponseInfo(); 5681 HttpResponseInfo response = *trans->GetResponseInfo();
5770 EXPECT_TRUE(response.headers.get() != NULL); 5682 EXPECT_TRUE(response.headers.get() != NULL);
5771 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 5683 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
5772 } 5684 }
5773 5685
5774 TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) { 5686 TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) {
5775 // This first request will start to establish the SpdySession. 5687 // This first request will start to establish the SpdySession.
5776 // Then we will start the second (MEDIUM priority) and then third 5688 // Then we will start the second (MEDIUM priority) and then third
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after
6539 MockRead reads[] = {CreateMockRead(*push, 1)}; 6451 MockRead reads[] = {CreateMockRead(*push, 1)};
6540 6452
6541 scoped_ptr<SpdyFrame> req( 6453 scoped_ptr<SpdyFrame> req(
6542 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6454 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6543 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 6455 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
6544 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id.")); 6456 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id."));
6545 MockWrite writes[] = { 6457 MockWrite writes[] = {
6546 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2), 6458 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2),
6547 }; 6459 };
6548 6460
6549 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 6461 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6550 NormalSpdyTransactionHelper helper( 6462 NormalSpdyTransactionHelper helper(
6551 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6463 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6552 helper.RunToCompletion(&data); 6464 helper.RunToCompletion(&data);
6553 TransactionHelperResult out = helper.output(); 6465 TransactionHelperResult out = helper.output();
6554 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 6466 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
6555 } 6467 }
6556 6468
6557 TEST_P(SpdyNetworkTransactionTest, 6469 TEST_P(SpdyNetworkTransactionTest,
6558 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) { 6470 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) {
6559 if (spdy_util_.spdy_version() < SPDY3) 6471 if (spdy_util_.spdy_version() < SPDY3)
(...skipping 13 matching lines...) Expand all
6573 scoped_ptr<SpdyFrame> req( 6485 scoped_ptr<SpdyFrame> req(
6574 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6486 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6575 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 6487 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(
6576 4, 6488 4,
6577 GOAWAY_PROTOCOL_ERROR, 6489 GOAWAY_PROTOCOL_ERROR,
6578 "New push stream id must be greater than the last accepted.")); 6490 "New push stream id must be greater than the last accepted."));
6579 MockWrite writes[] = { 6491 MockWrite writes[] = {
6580 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3), 6492 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3),
6581 }; 6493 };
6582 6494
6583 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); 6495 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6584 NormalSpdyTransactionHelper helper( 6496 NormalSpdyTransactionHelper helper(
6585 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6497 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6586 helper.RunToCompletion(&data); 6498 helper.RunToCompletion(&data);
6587 TransactionHelperResult out = helper.output(); 6499 TransactionHelperResult out = helper.output();
6588 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 6500 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
6589 } 6501 }
6590 6502
6591 class SpdyNetworkTransactionNoTLSUsageCheckTest 6503 class SpdyNetworkTransactionNoTLSUsageCheckTest
6592 : public SpdyNetworkTransactionTest { 6504 : public SpdyNetworkTransactionTest {
6593 protected: 6505 protected:
6594 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { 6506 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
6595 // Construct the request. 6507 // Construct the request.
6596 scoped_ptr<SpdyFrame> req( 6508 scoped_ptr<SpdyFrame> req(
6597 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); 6509 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
6598 MockWrite writes[] = {CreateMockWrite(*req)}; 6510 MockWrite writes[] = {CreateMockWrite(*req, 0)};
6599 6511
6600 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 6512 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
6601 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6513 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
6602 MockRead reads[] = { 6514 MockRead reads[] = {
6603 CreateMockRead(*resp), CreateMockRead(*body), 6515 CreateMockRead(*resp, 1),
6604 MockRead(ASYNC, 0, 0) // EOF 6516 CreateMockRead(*body, 2),
6517 MockRead(ASYNC, 0, 3) // EOF
6605 }; 6518 };
6606 6519
6607 DelayedSocketData data( 6520 SequencedSocketData data(reads, arraysize(reads), writes,
6608 1, reads, arraysize(reads), writes, arraysize(writes)); 6521 arraysize(writes));
6609 HttpRequestInfo request; 6522 HttpRequestInfo request;
6610 request.method = "GET"; 6523 request.method = "GET";
6611 request.url = GURL("https://www.example.org/"); 6524 request.url = GURL("https://www.example.org/");
6612 NormalSpdyTransactionHelper helper( 6525 NormalSpdyTransactionHelper helper(
6613 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6526 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6614 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); 6527 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass());
6615 TransactionHelperResult out = helper.output(); 6528 TransactionHelperResult out = helper.output();
6616 EXPECT_EQ(OK, out.rv); 6529 EXPECT_EQ(OK, out.rv);
6617 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 6530 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
6618 EXPECT_EQ("hello!", out.response_data); 6531 EXPECT_EQ("hello!", out.response_data);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6650 } 6563 }
6651 6564
6652 class SpdyNetworkTransactionTLSUsageCheckTest 6565 class SpdyNetworkTransactionTLSUsageCheckTest
6653 : public SpdyNetworkTransactionTest { 6566 : public SpdyNetworkTransactionTest {
6654 protected: 6567 protected:
6655 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { 6568 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
6656 scoped_ptr<SpdyFrame> goaway( 6569 scoped_ptr<SpdyFrame> goaway(
6657 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, "")); 6570 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, ""));
6658 MockWrite writes[] = {CreateMockWrite(*goaway)}; 6571 MockWrite writes[] = {CreateMockWrite(*goaway)};
6659 6572
6660 DelayedSocketData data(1, NULL, 0, writes, arraysize(writes)); 6573 StaticSocketDataProvider data(NULL, 0, writes, arraysize(writes));
6661 HttpRequestInfo request; 6574 HttpRequestInfo request;
6662 request.method = "GET"; 6575 request.method = "GET";
6663 request.url = GURL("https://www.example.org/"); 6576 request.url = GURL("https://www.example.org/");
6664 NormalSpdyTransactionHelper helper( 6577 NormalSpdyTransactionHelper helper(
6665 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6578 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6666 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); 6579 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass());
6667 TransactionHelperResult out = helper.output(); 6580 TransactionHelperResult out = helper.output();
6668 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv); 6581 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv);
6669 } 6582 }
6670 }; 6583 };
(...skipping 17 matching lines...) Expand all
6688 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { 6601 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) {
6689 scoped_ptr<SSLSocketDataProvider> ssl_provider( 6602 scoped_ptr<SSLSocketDataProvider> ssl_provider(
6690 new SSLSocketDataProvider(ASYNC, OK)); 6603 new SSLSocketDataProvider(ASYNC, OK));
6691 // Set to TLS_RSA_WITH_NULL_MD5 6604 // Set to TLS_RSA_WITH_NULL_MD5
6692 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); 6605 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
6693 6606
6694 RunTLSUsageCheckTest(ssl_provider.Pass()); 6607 RunTLSUsageCheckTest(ssl_provider.Pass());
6695 } 6608 }
6696 6609
6697 } // namespace net 6610 } // 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