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

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

Issue 2596703002: http2: Update priorities of pushed streams (Closed)
Patch Set: actually rebase Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/spdy_http_stream.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 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 <cmath> 5 #include <cmath>
6 #include <memory> 6 #include <memory>
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 // A helper class that handles all the initial npn/ssl setup. 100 // A helper class that handles all the initial npn/ssl setup.
101 class NormalSpdyTransactionHelper { 101 class NormalSpdyTransactionHelper {
102 public: 102 public:
103 NormalSpdyTransactionHelper( 103 NormalSpdyTransactionHelper(
104 const HttpRequestInfo& request, 104 const HttpRequestInfo& request,
105 RequestPriority priority, 105 RequestPriority priority,
106 const NetLogWithSource& log, 106 const NetLogWithSource& log,
107 std::unique_ptr<SpdySessionDependencies> session_deps) 107 std::unique_ptr<SpdySessionDependencies> session_deps)
108 : request_(request), 108 : request_(request),
109 priority_(priority), 109 priority_(priority),
110 session_deps_(session_deps.get() == NULL 110 session_deps_(session_deps.get() == nullptr
111 ? base::MakeUnique<SpdySessionDependencies>() 111 ? base::MakeUnique<SpdySessionDependencies>()
112 : std::move(session_deps)), 112 : std::move(session_deps)),
113 session_( 113 session_(
114 SpdySessionDependencies::SpdyCreateSession(session_deps_.get())), 114 SpdySessionDependencies::SpdyCreateSession(session_deps_.get())),
115 log_(log) {} 115 log_(log) {}
116 116
117 ~NormalSpdyTransactionHelper() { 117 ~NormalSpdyTransactionHelper() {
118 // Any test which doesn't close the socket by sending it an EOF will 118 // Any test which doesn't close the socket by sending it an EOF will
119 // have a valid session left open, which leaks the entire session pool. 119 // have a valid session left open, which leaks the entire session pool.
120 // This is just fine - in fact, some of our tests intentionally do this 120 // This is just fine - in fact, some of our tests intentionally do this
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 ASSERT_TRUE(spdy_session); 438 ASSERT_TRUE(spdy_session);
439 EXPECT_EQ(0u, spdy_session->num_active_streams()); 439 EXPECT_EQ(0u, spdy_session->num_active_streams());
440 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams()); 440 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams());
441 } 441 }
442 442
443 void RunServerPushTest(SequencedSocketData* data, 443 void RunServerPushTest(SequencedSocketData* data,
444 HttpResponseInfo* response, 444 HttpResponseInfo* response,
445 HttpResponseInfo* push_response, 445 HttpResponseInfo* push_response,
446 const std::string& expected) { 446 const std::string& expected) {
447 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 447 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
448 NetLogWithSource(), NULL); 448 NetLogWithSource(), nullptr);
449 helper.RunPreTestSetup(); 449 helper.RunPreTestSetup();
450 helper.AddData(data); 450 helper.AddData(data);
451 451
452 HttpNetworkTransaction* trans = helper.trans(); 452 HttpNetworkTransaction* trans = helper.trans();
453 453
454 // Start the transaction with basic parameters. 454 // Start the transaction with basic parameters.
455 TestCompletionCallback callback; 455 TestCompletionCallback callback;
456 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 456 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
457 NetLogWithSource()); 457 NetLogWithSource());
458 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 458 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 auto trans = 558 auto trans =
559 base::MakeUnique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get()); 559 base::MakeUnique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
560 } 560 }
561 561
562 TEST_F(SpdyNetworkTransactionTest, Get) { 562 TEST_F(SpdyNetworkTransactionTest, Get) {
563 // Construct the request. 563 // Construct the request.
564 SpdySerializedFrame req( 564 SpdySerializedFrame req(
565 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 565 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
566 MockWrite writes[] = {CreateMockWrite(req, 0)}; 566 MockWrite writes[] = {CreateMockWrite(req, 0)};
567 567
568 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 568 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
569 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 569 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
570 MockRead reads[] = { 570 MockRead reads[] = {
571 CreateMockRead(resp, 1), CreateMockRead(body, 2), 571 CreateMockRead(resp, 1), CreateMockRead(body, 2),
572 MockRead(ASYNC, 0, 3) // EOF 572 MockRead(ASYNC, 0, 3) // EOF
573 }; 573 };
574 574
575 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 575 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
576 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 576 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
577 NetLogWithSource(), NULL); 577 NetLogWithSource(), nullptr);
578 helper.RunToCompletion(&data); 578 helper.RunToCompletion(&data);
579 TransactionHelperResult out = helper.output(); 579 TransactionHelperResult out = helper.output();
580 EXPECT_THAT(out.rv, IsOk()); 580 EXPECT_THAT(out.rv, IsOk());
581 EXPECT_EQ("HTTP/1.1 200", out.status_line); 581 EXPECT_EQ("HTTP/1.1 200", out.status_line);
582 EXPECT_EQ("hello!", out.response_data); 582 EXPECT_EQ("hello!", out.response_data);
583 } 583 }
584 584
585 TEST_F(SpdyNetworkTransactionTest, GetAtEachPriority) { 585 TEST_F(SpdyNetworkTransactionTest, GetAtEachPriority) {
586 for (RequestPriority p = MINIMUM_PRIORITY; p <= MAXIMUM_PRIORITY; 586 for (RequestPriority p = MINIMUM_PRIORITY; p <= MAXIMUM_PRIORITY;
587 p = RequestPriority(p + 1)) { 587 p = RequestPriority(p + 1)) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); 625 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true));
626 MockRead reads[] = { 626 MockRead reads[] = {
627 CreateMockRead(resp, 1), CreateMockRead(body, 2), 627 CreateMockRead(resp, 1), CreateMockRead(body, 2),
628 MockRead(ASYNC, 0, 3) // EOF 628 MockRead(ASYNC, 0, 3) // EOF
629 }; 629 };
630 630
631 SequencedSocketData data(reads, arraysize(reads), writes, 631 SequencedSocketData data(reads, arraysize(reads), writes,
632 arraysize(writes)); 632 arraysize(writes));
633 HttpRequestInfo http_req = CreateGetRequest(); 633 HttpRequestInfo http_req = CreateGetRequest();
634 634
635 NormalSpdyTransactionHelper helper(http_req, p, NetLogWithSource(), NULL); 635 NormalSpdyTransactionHelper helper(http_req, p, NetLogWithSource(),
636 nullptr);
636 helper.RunToCompletion(&data); 637 helper.RunToCompletion(&data);
637 TransactionHelperResult out = helper.output(); 638 TransactionHelperResult out = helper.output();
638 EXPECT_THAT(out.rv, IsOk()); 639 EXPECT_THAT(out.rv, IsOk());
639 EXPECT_EQ("HTTP/1.1 200", out.status_line); 640 EXPECT_EQ("HTTP/1.1 200", out.status_line);
640 EXPECT_EQ("hello!", out.response_data); 641 EXPECT_EQ("hello!", out.response_data);
641 } 642 }
642 } 643 }
643 644
644 // Start three gets simultaniously; making sure that multiplexed 645 // Start three gets simultaniously; making sure that multiplexed
645 // streams work properly. 646 // streams work properly.
646 647
647 // This can't use the TransactionHelper method, since it only 648 // This can't use the TransactionHelper method, since it only
648 // handles a single transaction, and finishes them as soon 649 // handles a single transaction, and finishes them as soon
649 // as it launches them. 650 // as it launches them.
650 651
651 // TODO(gavinp): create a working generalized TransactionHelper that 652 // TODO(gavinp): create a working generalized TransactionHelper that
652 // can allow multiple streams in flight. 653 // can allow multiple streams in flight.
653 654
654 TEST_F(SpdyNetworkTransactionTest, ThreeGets) { 655 TEST_F(SpdyNetworkTransactionTest, ThreeGets) {
655 SpdySerializedFrame req( 656 SpdySerializedFrame req(
656 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 657 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
657 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 658 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
658 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 659 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
659 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 660 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
660 661
661 SpdySerializedFrame req2( 662 SpdySerializedFrame req2(
662 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 663 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
663 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 664 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
664 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 665 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
665 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 666 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
666 667
667 SpdySerializedFrame req3( 668 SpdySerializedFrame req3(
668 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); 669 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true));
669 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5)); 670 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 5));
670 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false)); 671 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false));
671 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true)); 672 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true));
672 673
673 MockWrite writes[] = { 674 MockWrite writes[] = {
674 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), 675 CreateMockWrite(req, 0), CreateMockWrite(req2, 3),
675 CreateMockWrite(req3, 6), 676 CreateMockWrite(req3, 6),
676 }; 677 };
677 MockRead reads[] = { 678 MockRead reads[] = {
678 CreateMockRead(resp, 1), CreateMockRead(body, 2), 679 CreateMockRead(resp, 1), CreateMockRead(body, 2),
679 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), 680 CreateMockRead(resp2, 4), CreateMockRead(body2, 5),
680 CreateMockRead(resp3, 7), CreateMockRead(body3, 8), 681 CreateMockRead(resp3, 7), CreateMockRead(body3, 8),
681 682
682 CreateMockRead(fbody, 9), CreateMockRead(fbody2, 10), 683 CreateMockRead(fbody, 9), CreateMockRead(fbody2, 10),
683 CreateMockRead(fbody3, 11), 684 CreateMockRead(fbody3, 11),
684 685
685 MockRead(ASYNC, 0, 12), // EOF 686 MockRead(ASYNC, 0, 12), // EOF
686 }; 687 };
687 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 688 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
688 SequencedSocketData data_placeholder1(NULL, 0, NULL, 0); 689 SequencedSocketData data_placeholder1(nullptr, 0, nullptr, 0);
689 SequencedSocketData data_placeholder2(NULL, 0, NULL, 0); 690 SequencedSocketData data_placeholder2(nullptr, 0, nullptr, 0);
690 691
691 NetLogWithSource log; 692 NetLogWithSource log;
692 TransactionHelperResult out; 693 TransactionHelperResult out;
693 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 694 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
694 NetLogWithSource(), NULL); 695 NetLogWithSource(), nullptr);
695 helper.RunPreTestSetup(); 696 helper.RunPreTestSetup();
696 helper.AddData(&data); 697 helper.AddData(&data);
697 // We require placeholder data because three get requests are sent out at 698 // We require placeholder data because three get requests are sent out at
698 // the same time which results in three sockets being connected. The first 699 // the same time which results in three sockets being connected. The first
699 // on will negotiate SPDY and will be used for all requests. 700 // on will negotiate SPDY and will be used for all requests.
700 helper.AddData(&data_placeholder1); 701 helper.AddData(&data_placeholder1);
701 helper.AddData(&data_placeholder2); 702 helper.AddData(&data_placeholder2);
702 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session()); 703 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session());
703 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); 704 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session());
704 HttpNetworkTransaction trans3(DEFAULT_PRIORITY, helper.session()); 705 HttpNetworkTransaction trans3(DEFAULT_PRIORITY, helper.session());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
736 EXPECT_THAT(out.rv, IsOk()); 737 EXPECT_THAT(out.rv, IsOk());
737 738
738 EXPECT_THAT(out.rv, IsOk()); 739 EXPECT_THAT(out.rv, IsOk());
739 EXPECT_EQ("HTTP/1.1 200", out.status_line); 740 EXPECT_EQ("HTTP/1.1 200", out.status_line);
740 EXPECT_EQ("hello!hello!", out.response_data); 741 EXPECT_EQ("hello!hello!", out.response_data);
741 } 742 }
742 743
743 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBinding) { 744 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBinding) {
744 SpdySerializedFrame req( 745 SpdySerializedFrame req(
745 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 746 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
746 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 747 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
747 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 748 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
748 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 749 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
749 750
750 SpdySerializedFrame req2( 751 SpdySerializedFrame req2(
751 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 752 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
752 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 753 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
753 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 754 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
754 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 755 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
755 756
756 MockWrite writes[] = { 757 MockWrite writes[] = {
757 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), 758 CreateMockWrite(req, 0), CreateMockWrite(req2, 3),
758 }; 759 };
759 MockRead reads[] = { 760 MockRead reads[] = {
760 CreateMockRead(resp, 1), CreateMockRead(body, 2), 761 CreateMockRead(resp, 1), CreateMockRead(body, 2),
761 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), 762 CreateMockRead(resp2, 4), CreateMockRead(body2, 5),
762 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7), 763 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7),
763 MockRead(ASYNC, 0, 8), // EOF 764 MockRead(ASYNC, 0, 8), // EOF
764 }; 765 };
765 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 766 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
766 767
767 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); 768 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING);
768 SequencedSocketData data_placeholder(NULL, 0, NULL, 0); 769 SequencedSocketData data_placeholder(nullptr, 0, nullptr, 0);
769 data_placeholder.set_connect_data(never_finishing_connect); 770 data_placeholder.set_connect_data(never_finishing_connect);
770 771
771 NetLogWithSource log; 772 NetLogWithSource log;
772 TransactionHelperResult out; 773 TransactionHelperResult out;
773 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 774 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
774 NetLogWithSource(), NULL); 775 NetLogWithSource(), nullptr);
775 helper.RunPreTestSetup(); 776 helper.RunPreTestSetup();
776 helper.AddData(&data); 777 helper.AddData(&data);
777 // We require placeholder data because two requests are sent out at 778 // We require placeholder data because two requests are sent out at
778 // the same time which results in two sockets being connected. The first 779 // the same time which results in two sockets being connected. The first
779 // on will negotiate SPDY and will be used for all requests. 780 // on will negotiate SPDY and will be used for all requests.
780 helper.AddData(&data_placeholder); 781 helper.AddData(&data_placeholder);
781 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session()); 782 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session());
782 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); 783 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session());
783 784
784 TestCompletionCallback callback1; 785 TestCompletionCallback callback1;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 EXPECT_THAT(out.rv, IsOk()); 817 EXPECT_THAT(out.rv, IsOk());
817 EXPECT_EQ("HTTP/1.1 200", out.status_line); 818 EXPECT_EQ("HTTP/1.1 200", out.status_line);
818 EXPECT_EQ("hello!hello!", out.response_data); 819 EXPECT_EQ("hello!hello!", out.response_data);
819 820
820 helper.VerifyDataConsumed(); 821 helper.VerifyDataConsumed();
821 } 822 }
822 823
823 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBindingFromPreconnect) { 824 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBindingFromPreconnect) {
824 SpdySerializedFrame req( 825 SpdySerializedFrame req(
825 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 826 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
826 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 827 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
827 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 828 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
828 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 829 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
829 830
830 SpdySerializedFrame req2( 831 SpdySerializedFrame req2(
831 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 832 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
832 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 833 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
833 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 834 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
834 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 835 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
835 836
836 MockWrite writes[] = { 837 MockWrite writes[] = {
837 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), 838 CreateMockWrite(req, 0), CreateMockWrite(req2, 3),
838 }; 839 };
839 MockRead reads[] = { 840 MockRead reads[] = {
840 CreateMockRead(resp, 1), CreateMockRead(body, 2), 841 CreateMockRead(resp, 1), CreateMockRead(body, 2),
841 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), 842 CreateMockRead(resp2, 4), CreateMockRead(body2, 5),
842 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7), 843 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7),
843 MockRead(ASYNC, 0, 8), // EOF 844 MockRead(ASYNC, 0, 8), // EOF
844 }; 845 };
845 SequencedSocketData preconnect_data(reads, arraysize(reads), writes, 846 SequencedSocketData preconnect_data(reads, arraysize(reads), writes,
846 arraysize(writes)); 847 arraysize(writes));
847 848
848 MockConnect never_finishing_connect(ASYNC, ERR_IO_PENDING); 849 MockConnect never_finishing_connect(ASYNC, ERR_IO_PENDING);
849 850
850 SequencedSocketData data_placeholder(NULL, 0, NULL, 0); 851 SequencedSocketData data_placeholder(nullptr, 0, nullptr, 0);
851 data_placeholder.set_connect_data(never_finishing_connect); 852 data_placeholder.set_connect_data(never_finishing_connect);
852 853
853 NetLogWithSource log; 854 NetLogWithSource log;
854 TransactionHelperResult out; 855 TransactionHelperResult out;
855 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 856 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
856 NetLogWithSource(), NULL); 857 NetLogWithSource(), nullptr);
857 helper.RunPreTestSetup(); 858 helper.RunPreTestSetup();
858 helper.AddData(&preconnect_data); 859 helper.AddData(&preconnect_data);
859 // We require placeholder data because 3 connections are attempted (first is 860 // We require placeholder data because 3 connections are attempted (first is
860 // the preconnect, 2nd and 3rd are the never finished connections. 861 // the preconnect, 2nd and 3rd are the never finished connections.
861 helper.AddData(&data_placeholder); 862 helper.AddData(&data_placeholder);
862 helper.AddData(&data_placeholder); 863 helper.AddData(&data_placeholder);
863 864
864 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session()); 865 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session());
865 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); 866 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session());
866 867
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 // Similar to ThreeGets above, however this test adds a SETTINGS 912 // Similar to ThreeGets above, however this test adds a SETTINGS
912 // frame. The SETTINGS frame is read during the IO loop waiting on 913 // frame. The SETTINGS frame is read during the IO loop waiting on
913 // the first transaction completion, and sets a maximum concurrent 914 // the first transaction completion, and sets a maximum concurrent
914 // stream limit of 1. This means that our IO loop exists after the 915 // stream limit of 1. This means that our IO loop exists after the
915 // second transaction completes, so we can assert on read_index(). 916 // second transaction completes, so we can assert on read_index().
916 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) { 917 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) {
917 // Construct the request. 918 // Construct the request.
918 // Each request fully completes before the next starts. 919 // Each request fully completes before the next starts.
919 SpdySerializedFrame req( 920 SpdySerializedFrame req(
920 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 921 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
921 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 922 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
922 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 923 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
923 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 924 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
924 spdy_util_.UpdateWithStreamDestruction(1); 925 spdy_util_.UpdateWithStreamDestruction(1);
925 926
926 SpdySerializedFrame req2( 927 SpdySerializedFrame req2(
927 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 928 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
928 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 929 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
929 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 930 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
930 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 931 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
931 spdy_util_.UpdateWithStreamDestruction(3); 932 spdy_util_.UpdateWithStreamDestruction(3);
932 933
933 SpdySerializedFrame req3( 934 SpdySerializedFrame req3(
934 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); 935 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true));
935 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5)); 936 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 5));
936 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false)); 937 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false));
937 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true)); 938 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true));
938 939
939 SettingsMap settings; 940 SettingsMap settings;
940 const uint32_t max_concurrent_streams = 1; 941 const uint32_t max_concurrent_streams = 1;
941 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = max_concurrent_streams; 942 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = max_concurrent_streams;
942 SpdySerializedFrame settings_frame( 943 SpdySerializedFrame settings_frame(
943 spdy_util_.ConstructSpdySettings(settings)); 944 spdy_util_.ConstructSpdySettings(settings));
944 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 945 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
945 946
(...skipping 16 matching lines...) Expand all
962 963
963 MockRead(ASYNC, 0, 14), // EOF 964 MockRead(ASYNC, 0, 14), // EOF
964 }; 965 };
965 966
966 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 967 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
967 968
968 NetLogWithSource log; 969 NetLogWithSource log;
969 TransactionHelperResult out; 970 TransactionHelperResult out;
970 { 971 {
971 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 972 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
972 NetLogWithSource(), NULL); 973 NetLogWithSource(), nullptr);
973 helper.RunPreTestSetup(); 974 helper.RunPreTestSetup();
974 helper.AddData(&data); 975 helper.AddData(&data);
975 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session()); 976 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session());
976 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); 977 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session());
977 HttpNetworkTransaction trans3(DEFAULT_PRIORITY, helper.session()); 978 HttpNetworkTransaction trans3(DEFAULT_PRIORITY, helper.session());
978 979
979 TestCompletionCallback callback1; 980 TestCompletionCallback callback1;
980 TestCompletionCallback callback2; 981 TestCompletionCallback callback2;
981 TestCompletionCallback callback3; 982 TestCompletionCallback callback3;
982 983
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 1036
1036 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds 1037 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds
1037 // a fourth transaction. The third and fourth transactions have 1038 // a fourth transaction. The third and fourth transactions have
1038 // different data ("hello!" vs "hello!hello!") and because of the 1039 // different data ("hello!" vs "hello!hello!") and because of the
1039 // user specified priority, we expect to see them inverted in 1040 // user specified priority, we expect to see them inverted in
1040 // the response from the server. 1041 // the response from the server.
1041 TEST_F(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) { 1042 TEST_F(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) {
1042 // Construct the request. 1043 // Construct the request.
1043 SpdySerializedFrame req( 1044 SpdySerializedFrame req(
1044 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1045 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1045 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1046 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1046 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 1047 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
1047 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 1048 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
1048 spdy_util_.UpdateWithStreamDestruction(1); 1049 spdy_util_.UpdateWithStreamDestruction(1);
1049 1050
1050 SpdySerializedFrame req2( 1051 SpdySerializedFrame req2(
1051 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1052 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1052 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 1053 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
1053 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 1054 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
1054 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 1055 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
1055 spdy_util_.UpdateWithStreamDestruction(3); 1056 spdy_util_.UpdateWithStreamDestruction(3);
1056 1057
1057 SpdySerializedFrame req4( 1058 SpdySerializedFrame req4(
1058 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, HIGHEST, true)); 1059 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, HIGHEST, true));
1059 SpdySerializedFrame resp4(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5)); 1060 SpdySerializedFrame resp4(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 5));
1060 SpdySerializedFrame fbody4(spdy_util_.ConstructSpdyDataFrame(5, true)); 1061 SpdySerializedFrame fbody4(spdy_util_.ConstructSpdyDataFrame(5, true));
1061 spdy_util_.UpdateWithStreamDestruction(5); 1062 spdy_util_.UpdateWithStreamDestruction(5);
1062 1063
1063 SpdySerializedFrame req3( 1064 SpdySerializedFrame req3(
1064 spdy_util_.ConstructSpdyGet(nullptr, 0, 7, LOWEST, true)); 1065 spdy_util_.ConstructSpdyGet(nullptr, 0, 7, LOWEST, true));
1065 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 7)); 1066 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 7));
1066 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(7, false)); 1067 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(7, false));
1067 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(7, true)); 1068 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(7, true));
1068 1069
1069 SettingsMap settings; 1070 SettingsMap settings;
1070 const uint32_t max_concurrent_streams = 1; 1071 const uint32_t max_concurrent_streams = 1;
1071 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = max_concurrent_streams; 1072 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = max_concurrent_streams;
1072 SpdySerializedFrame settings_frame( 1073 SpdySerializedFrame settings_frame(
1073 spdy_util_.ConstructSpdySettings(settings)); 1074 spdy_util_.ConstructSpdySettings(settings));
1074 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1075 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
1075 MockWrite writes[] = { 1076 MockWrite writes[] = {
(...skipping 18 matching lines...) Expand all
1094 CreateMockRead(resp3, 14), 1095 CreateMockRead(resp3, 14),
1095 CreateMockRead(body3, 15), 1096 CreateMockRead(body3, 15),
1096 CreateMockRead(fbody3, 16), 1097 CreateMockRead(fbody3, 16),
1097 1098
1098 MockRead(ASYNC, 0, 17), // EOF 1099 MockRead(ASYNC, 0, 17), // EOF
1099 }; 1100 };
1100 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1101 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1101 NetLogWithSource log; 1102 NetLogWithSource log;
1102 TransactionHelperResult out; 1103 TransactionHelperResult out;
1103 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1104 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1104 NetLogWithSource(), NULL); 1105 NetLogWithSource(), nullptr);
1105 helper.RunPreTestSetup(); 1106 helper.RunPreTestSetup();
1106 helper.AddData(&data); 1107 helper.AddData(&data);
1107 1108
1108 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session()); 1109 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session());
1109 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); 1110 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session());
1110 HttpNetworkTransaction trans3(DEFAULT_PRIORITY, helper.session()); 1111 HttpNetworkTransaction trans3(DEFAULT_PRIORITY, helper.session());
1111 HttpNetworkTransaction trans4(HIGHEST, helper.session()); 1112 HttpNetworkTransaction trans4(HIGHEST, helper.session());
1112 1113
1113 TestCompletionCallback callback1; 1114 TestCompletionCallback callback1;
1114 TestCompletionCallback callback2; 1115 TestCompletionCallback callback2;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 } 1185 }
1185 1186
1186 // Similar to ThreeGetsMaxConcurrrent above, however, this test 1187 // Similar to ThreeGetsMaxConcurrrent above, however, this test
1187 // deletes a session in the middle of the transaction to ensure 1188 // deletes a session in the middle of the transaction to ensure
1188 // that we properly remove pendingcreatestream objects from 1189 // that we properly remove pendingcreatestream objects from
1189 // the spdy_session 1190 // the spdy_session
1190 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) { 1191 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) {
1191 // Construct the request. 1192 // Construct the request.
1192 SpdySerializedFrame req( 1193 SpdySerializedFrame req(
1193 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1194 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1194 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1195 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1195 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 1196 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
1196 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 1197 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
1197 spdy_util_.UpdateWithStreamDestruction(1); 1198 spdy_util_.UpdateWithStreamDestruction(1);
1198 1199
1199 SpdySerializedFrame req2( 1200 SpdySerializedFrame req2(
1200 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1201 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1201 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 1202 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
1202 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 1203 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
1203 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 1204 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
1204 1205
1205 SettingsMap settings; 1206 SettingsMap settings;
1206 const uint32_t max_concurrent_streams = 1; 1207 const uint32_t max_concurrent_streams = 1;
1207 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = max_concurrent_streams; 1208 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = max_concurrent_streams;
1208 SpdySerializedFrame settings_frame( 1209 SpdySerializedFrame settings_frame(
1209 spdy_util_.ConstructSpdySettings(settings)); 1210 spdy_util_.ConstructSpdySettings(settings));
1210 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1211 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
1211 1212
1212 MockWrite writes[] = { 1213 MockWrite writes[] = {
1213 CreateMockWrite(req, 0), CreateMockWrite(settings_ack, 5), 1214 CreateMockWrite(req, 0), CreateMockWrite(settings_ack, 5),
1214 CreateMockWrite(req2, 6), 1215 CreateMockWrite(req2, 6),
1215 }; 1216 };
1216 MockRead reads[] = { 1217 MockRead reads[] = {
1217 CreateMockRead(settings_frame, 1), CreateMockRead(resp, 2), 1218 CreateMockRead(settings_frame, 1), CreateMockRead(resp, 2),
1218 CreateMockRead(body, 3), CreateMockRead(fbody, 4), 1219 CreateMockRead(body, 3), CreateMockRead(fbody, 4),
1219 CreateMockRead(resp2, 7), CreateMockRead(body2, 8), 1220 CreateMockRead(resp2, 7), CreateMockRead(body2, 8),
1220 CreateMockRead(fbody2, 9), MockRead(ASYNC, 0, 10), // EOF 1221 CreateMockRead(fbody2, 9), MockRead(ASYNC, 0, 10), // EOF
1221 }; 1222 };
1222 1223
1223 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1224 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1224 1225
1225 NetLogWithSource log; 1226 NetLogWithSource log;
1226 TransactionHelperResult out; 1227 TransactionHelperResult out;
1227 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1228 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1228 NetLogWithSource(), NULL); 1229 NetLogWithSource(), nullptr);
1229 helper.RunPreTestSetup(); 1230 helper.RunPreTestSetup();
1230 helper.AddData(&data); 1231 helper.AddData(&data);
1231 std::unique_ptr<HttpNetworkTransaction> trans1( 1232 std::unique_ptr<HttpNetworkTransaction> trans1(
1232 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); 1233 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session()));
1233 std::unique_ptr<HttpNetworkTransaction> trans2( 1234 std::unique_ptr<HttpNetworkTransaction> trans2(
1234 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); 1235 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session()));
1235 std::unique_ptr<HttpNetworkTransaction> trans3( 1236 std::unique_ptr<HttpNetworkTransaction> trans3(
1236 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); 1237 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session()));
1237 1238
1238 TestCompletionCallback callback1; 1239 TestCompletionCallback callback1;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1310 1311
1311 } // namespace 1312 } // namespace
1312 1313
1313 // Similar to ThreeGetsMaxConcurrrentDelete above, however, this test 1314 // Similar to ThreeGetsMaxConcurrrentDelete above, however, this test
1314 // closes the socket while we have a pending transaction waiting for 1315 // closes the socket while we have a pending transaction waiting for
1315 // a pending stream creation. http://crbug.com/52901 1316 // a pending stream creation. http://crbug.com/52901
1316 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) { 1317 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) {
1317 // Construct the request. 1318 // Construct the request.
1318 SpdySerializedFrame req( 1319 SpdySerializedFrame req(
1319 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1320 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1320 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1321 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1321 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 1322 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
1322 SpdySerializedFrame fin_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1323 SpdySerializedFrame fin_body(spdy_util_.ConstructSpdyDataFrame(1, true));
1323 spdy_util_.UpdateWithStreamDestruction(1); 1324 spdy_util_.UpdateWithStreamDestruction(1);
1324 1325
1325 SpdySerializedFrame req2( 1326 SpdySerializedFrame req2(
1326 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1327 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1327 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 1328 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
1328 1329
1329 SettingsMap settings; 1330 SettingsMap settings;
1330 const uint32_t max_concurrent_streams = 1; 1331 const uint32_t max_concurrent_streams = 1;
1331 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = max_concurrent_streams; 1332 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = max_concurrent_streams;
1332 SpdySerializedFrame settings_frame( 1333 SpdySerializedFrame settings_frame(
1333 spdy_util_.ConstructSpdySettings(settings)); 1334 spdy_util_.ConstructSpdySettings(settings));
1334 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1335 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
1335 1336
1336 MockWrite writes[] = { 1337 MockWrite writes[] = {
1337 CreateMockWrite(req, 0), CreateMockWrite(settings_ack, 5), 1338 CreateMockWrite(req, 0), CreateMockWrite(settings_ack, 5),
1338 CreateMockWrite(req2, 6), 1339 CreateMockWrite(req2, 6),
1339 }; 1340 };
1340 MockRead reads[] = { 1341 MockRead reads[] = {
1341 CreateMockRead(settings_frame, 1), 1342 CreateMockRead(settings_frame, 1),
1342 CreateMockRead(resp, 2), 1343 CreateMockRead(resp, 2),
1343 CreateMockRead(body, 3), 1344 CreateMockRead(body, 3),
1344 CreateMockRead(fin_body, 4), 1345 CreateMockRead(fin_body, 4),
1345 CreateMockRead(resp2, 7), 1346 CreateMockRead(resp2, 7),
1346 MockRead(ASYNC, ERR_CONNECTION_RESET, 8), // Abort! 1347 MockRead(ASYNC, ERR_CONNECTION_RESET, 8), // Abort!
1347 }; 1348 };
1348 1349
1349 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1350 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1350 SequencedSocketData data_placeholder(NULL, 0, NULL, 0); 1351 SequencedSocketData data_placeholder(nullptr, 0, nullptr, 0);
1351 1352
1352 NetLogWithSource log; 1353 NetLogWithSource log;
1353 TransactionHelperResult out; 1354 TransactionHelperResult out;
1354 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1355 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1355 NetLogWithSource(), NULL); 1356 NetLogWithSource(), nullptr);
1356 helper.RunPreTestSetup(); 1357 helper.RunPreTestSetup();
1357 helper.AddData(&data); 1358 helper.AddData(&data);
1358 // We require placeholder data because three get requests are sent out, so 1359 // We require placeholder data because three get requests are sent out, so
1359 // there needs to be three sets of SSL connection data. 1360 // there needs to be three sets of SSL connection data.
1360 helper.AddData(&data_placeholder); 1361 helper.AddData(&data_placeholder);
1361 helper.AddData(&data_placeholder); 1362 helper.AddData(&data_placeholder);
1362 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session()); 1363 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, helper.session());
1363 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); 1364 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session());
1364 HttpNetworkTransaction* trans3( 1365 HttpNetworkTransaction* trans3(
1365 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); 1366 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session()));
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 request.url = default_url_; 1413 request.url = default_url_;
1413 1414
1414 SpdyHeaderBlock put_headers( 1415 SpdyHeaderBlock put_headers(
1415 spdy_util_.ConstructPutHeaderBlock(kDefaultUrl, 0)); 1416 spdy_util_.ConstructPutHeaderBlock(kDefaultUrl, 0));
1416 SpdySerializedFrame req( 1417 SpdySerializedFrame req(
1417 spdy_util_.ConstructSpdyHeaders(1, std::move(put_headers), LOWEST, true)); 1418 spdy_util_.ConstructSpdyHeaders(1, std::move(put_headers), LOWEST, true));
1418 MockWrite writes[] = { 1419 MockWrite writes[] = {
1419 CreateMockWrite(req, 0), 1420 CreateMockWrite(req, 0),
1420 }; 1421 };
1421 1422
1422 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1423 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1423 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1424 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1424 MockRead reads[] = { 1425 MockRead reads[] = {
1425 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1426 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1426 MockRead(ASYNC, 0, 3) // EOF 1427 MockRead(ASYNC, 0, 3) // EOF
1427 }; 1428 };
1428 1429
1429 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1430 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1430 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1431 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1431 NetLogWithSource(), NULL); 1432 NetLogWithSource(), nullptr);
1432 helper.RunToCompletion(&data); 1433 helper.RunToCompletion(&data);
1433 TransactionHelperResult out = helper.output(); 1434 TransactionHelperResult out = helper.output();
1434 1435
1435 EXPECT_THAT(out.rv, IsOk()); 1436 EXPECT_THAT(out.rv, IsOk());
1436 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1437 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1437 } 1438 }
1438 1439
1439 // Test that a simple HEAD request works. 1440 // Test that a simple HEAD request works.
1440 TEST_F(SpdyNetworkTransactionTest, Head) { 1441 TEST_F(SpdyNetworkTransactionTest, Head) {
1441 // Setup the request 1442 // Setup the request
1442 HttpRequestInfo request; 1443 HttpRequestInfo request;
1443 request.method = "HEAD"; 1444 request.method = "HEAD";
1444 request.url = default_url_; 1445 request.url = default_url_;
1445 1446
1446 SpdyHeaderBlock head_headers( 1447 SpdyHeaderBlock head_headers(
1447 spdy_util_.ConstructHeadHeaderBlock(kDefaultUrl, 0)); 1448 spdy_util_.ConstructHeadHeaderBlock(kDefaultUrl, 0));
1448 SpdySerializedFrame req(spdy_util_.ConstructSpdyHeaders( 1449 SpdySerializedFrame req(spdy_util_.ConstructSpdyHeaders(
1449 1, std::move(head_headers), LOWEST, true)); 1450 1, std::move(head_headers), LOWEST, true));
1450 MockWrite writes[] = { 1451 MockWrite writes[] = {
1451 CreateMockWrite(req, 0), 1452 CreateMockWrite(req, 0),
1452 }; 1453 };
1453 1454
1454 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1455 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1455 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1456 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1456 MockRead reads[] = { 1457 MockRead reads[] = {
1457 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1458 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1458 MockRead(ASYNC, 0, 3) // EOF 1459 MockRead(ASYNC, 0, 3) // EOF
1459 }; 1460 };
1460 1461
1461 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1462 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1462 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1463 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1463 NetLogWithSource(), NULL); 1464 NetLogWithSource(), nullptr);
1464 helper.RunToCompletion(&data); 1465 helper.RunToCompletion(&data);
1465 TransactionHelperResult out = helper.output(); 1466 TransactionHelperResult out = helper.output();
1466 1467
1467 EXPECT_THAT(out.rv, IsOk()); 1468 EXPECT_THAT(out.rv, IsOk());
1468 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1469 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1469 } 1470 }
1470 1471
1471 // Test that a simple POST works. 1472 // Test that a simple POST works.
1472 TEST_F(SpdyNetworkTransactionTest, Post) { 1473 TEST_F(SpdyNetworkTransactionTest, Post) {
1473 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1474 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1474 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); 1475 kDefaultUrl, 1, kUploadDataSize, LOWEST, nullptr, 0));
1475 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1476 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1476 MockWrite writes[] = { 1477 MockWrite writes[] = {
1477 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame 1478 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame
1478 }; 1479 };
1479 1480
1480 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 1481 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
1481 MockRead reads[] = { 1482 MockRead reads[] = {
1482 CreateMockRead(resp, 2), CreateMockRead(body, 3), 1483 CreateMockRead(resp, 2), CreateMockRead(body, 3),
1483 MockRead(ASYNC, 0, 4) // EOF 1484 MockRead(ASYNC, 0, 4) // EOF
1484 }; 1485 };
1485 1486
1486 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1487 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1487 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY, 1488 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY,
1488 NetLogWithSource(), NULL); 1489 NetLogWithSource(), nullptr);
1489 helper.RunToCompletion(&data); 1490 helper.RunToCompletion(&data);
1490 TransactionHelperResult out = helper.output(); 1491 TransactionHelperResult out = helper.output();
1491 EXPECT_THAT(out.rv, IsOk()); 1492 EXPECT_THAT(out.rv, IsOk());
1492 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1493 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1493 EXPECT_EQ("hello!", out.response_data); 1494 EXPECT_EQ("hello!", out.response_data);
1494 } 1495 }
1495 1496
1496 // Test that a POST with a file works. 1497 // Test that a POST with a file works.
1497 TEST_F(SpdyNetworkTransactionTest, FilePost) { 1498 TEST_F(SpdyNetworkTransactionTest, FilePost) {
1498 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1499 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1499 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); 1500 kDefaultUrl, 1, kUploadDataSize, LOWEST, nullptr, 0));
1500 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1501 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1501 MockWrite writes[] = { 1502 MockWrite writes[] = {
1502 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame 1503 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame
1503 }; 1504 };
1504 1505
1505 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 1506 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
1506 MockRead reads[] = { 1507 MockRead reads[] = {
1507 CreateMockRead(resp, 2), CreateMockRead(body, 3), 1508 CreateMockRead(resp, 2), CreateMockRead(body, 3),
1508 MockRead(ASYNC, 0, 4) // EOF 1509 MockRead(ASYNC, 0, 4) // EOF
1509 }; 1510 };
1510 1511
1511 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1512 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1512 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY, 1513 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY,
1513 NetLogWithSource(), NULL); 1514 NetLogWithSource(), nullptr);
1514 helper.RunToCompletion(&data); 1515 helper.RunToCompletion(&data);
1515 TransactionHelperResult out = helper.output(); 1516 TransactionHelperResult out = helper.output();
1516 EXPECT_THAT(out.rv, IsOk()); 1517 EXPECT_THAT(out.rv, IsOk());
1517 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1518 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1518 EXPECT_EQ("hello!", out.response_data); 1519 EXPECT_EQ("hello!", out.response_data);
1519 } 1520 }
1520 1521
1521 // Test that a POST with a unreadable file fails. 1522 // Test that a POST with a unreadable file fails.
1522 TEST_F(SpdyNetworkTransactionTest, UnreadableFilePost) { 1523 TEST_F(SpdyNetworkTransactionTest, UnreadableFilePost) {
1523 MockWrite writes[] = { 1524 MockWrite writes[] = {
1524 MockWrite(ASYNC, 0, 0) // EOF 1525 MockWrite(ASYNC, 0, 0) // EOF
1525 }; 1526 };
1526 MockRead reads[] = { 1527 MockRead reads[] = {
1527 MockRead(ASYNC, 0, 1) // EOF 1528 MockRead(ASYNC, 0, 1) // EOF
1528 }; 1529 };
1529 1530
1530 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1531 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1531 NormalSpdyTransactionHelper helper(CreateUnreadableFilePostRequest(), 1532 NormalSpdyTransactionHelper helper(CreateUnreadableFilePostRequest(),
1532 DEFAULT_PRIORITY, NetLogWithSource(), 1533 DEFAULT_PRIORITY, NetLogWithSource(),
1533 NULL); 1534 nullptr);
1534 helper.RunPreTestSetup(); 1535 helper.RunPreTestSetup();
1535 helper.AddData(&data); 1536 helper.AddData(&data);
1536 helper.RunDefaultTest(); 1537 helper.RunDefaultTest();
1537 1538
1538 base::RunLoop().RunUntilIdle(); 1539 base::RunLoop().RunUntilIdle();
1539 helper.VerifyDataNotConsumed(); 1540 helper.VerifyDataNotConsumed();
1540 EXPECT_THAT(helper.output().rv, IsError(ERR_ACCESS_DENIED)); 1541 EXPECT_THAT(helper.output().rv, IsError(ERR_ACCESS_DENIED));
1541 } 1542 }
1542 1543
1543 // Test that a complex POST works. 1544 // Test that a complex POST works.
1544 TEST_F(SpdyNetworkTransactionTest, ComplexPost) { 1545 TEST_F(SpdyNetworkTransactionTest, ComplexPost) {
1545 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1546 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1546 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); 1547 kDefaultUrl, 1, kUploadDataSize, LOWEST, nullptr, 0));
1547 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1548 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1548 MockWrite writes[] = { 1549 MockWrite writes[] = {
1549 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame 1550 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame
1550 }; 1551 };
1551 1552
1552 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 1553 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
1553 MockRead reads[] = { 1554 MockRead reads[] = {
1554 CreateMockRead(resp, 2), CreateMockRead(body, 3), 1555 CreateMockRead(resp, 2), CreateMockRead(body, 3),
1555 MockRead(ASYNC, 0, 4) // EOF 1556 MockRead(ASYNC, 0, 4) // EOF
1556 }; 1557 };
1557 1558
1558 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1559 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1559 NormalSpdyTransactionHelper helper( 1560 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(),
1560 CreateComplexPostRequest(), DEFAULT_PRIORITY, NetLogWithSource(), NULL); 1561 DEFAULT_PRIORITY, NetLogWithSource(),
1562 nullptr);
1561 helper.RunToCompletion(&data); 1563 helper.RunToCompletion(&data);
1562 TransactionHelperResult out = helper.output(); 1564 TransactionHelperResult out = helper.output();
1563 EXPECT_THAT(out.rv, IsOk()); 1565 EXPECT_THAT(out.rv, IsOk());
1564 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1566 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1565 EXPECT_EQ("hello!", out.response_data); 1567 EXPECT_EQ("hello!", out.response_data);
1566 } 1568 }
1567 1569
1568 // Test that a chunked POST works. 1570 // Test that a chunked POST works.
1569 TEST_F(SpdyNetworkTransactionTest, ChunkedPost) { 1571 TEST_F(SpdyNetworkTransactionTest, ChunkedPost) {
1570 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1572 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
1571 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1573 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1572 MockWrite writes[] = { 1574 MockWrite writes[] = {
1573 CreateMockWrite(req, 0), CreateMockWrite(body, 1), 1575 CreateMockWrite(req, 0), CreateMockWrite(body, 1),
1574 }; 1576 };
1575 1577
1576 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 1578 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
1577 MockRead reads[] = { 1579 MockRead reads[] = {
1578 CreateMockRead(resp, 2), CreateMockRead(body, 3), 1580 CreateMockRead(resp, 2), CreateMockRead(body, 3),
1579 MockRead(ASYNC, 0, 4) // EOF 1581 MockRead(ASYNC, 0, 4) // EOF
1580 }; 1582 };
1581 1583
1582 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1584 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1583 NormalSpdyTransactionHelper helper( 1585 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1584 CreateChunkedPostRequest(), DEFAULT_PRIORITY, NetLogWithSource(), NULL); 1586 DEFAULT_PRIORITY, NetLogWithSource(),
1587 nullptr);
1585 1588
1586 // These chunks get merged into a single frame when being sent. 1589 // These chunks get merged into a single frame when being sent.
1587 const int kFirstChunkSize = kUploadDataSize/2; 1590 const int kFirstChunkSize = kUploadDataSize/2;
1588 upload_chunked_data_stream()->AppendData(kUploadData, kFirstChunkSize, false); 1591 upload_chunked_data_stream()->AppendData(kUploadData, kFirstChunkSize, false);
1589 upload_chunked_data_stream()->AppendData( 1592 upload_chunked_data_stream()->AppendData(
1590 kUploadData + kFirstChunkSize, kUploadDataSize - kFirstChunkSize, true); 1593 kUploadData + kFirstChunkSize, kUploadDataSize - kFirstChunkSize, true);
1591 1594
1592 helper.RunToCompletion(&data); 1595 helper.RunToCompletion(&data);
1593 TransactionHelperResult out = helper.output(); 1596 TransactionHelperResult out = helper.output();
1594 EXPECT_THAT(out.rv, IsOk()); 1597 EXPECT_THAT(out.rv, IsOk());
1595 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1598 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1596 EXPECT_EQ(kUploadData, out.response_data); 1599 EXPECT_EQ(kUploadData, out.response_data);
1597 } 1600 }
1598 1601
1599 // Test that a chunked POST works with chunks appended after transaction starts. 1602 // Test that a chunked POST works with chunks appended after transaction starts.
1600 TEST_F(SpdyNetworkTransactionTest, DelayedChunkedPost) { 1603 TEST_F(SpdyNetworkTransactionTest, DelayedChunkedPost) {
1601 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1604 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
1602 SpdySerializedFrame chunk1(spdy_util_.ConstructSpdyDataFrame(1, false)); 1605 SpdySerializedFrame chunk1(spdy_util_.ConstructSpdyDataFrame(1, false));
1603 SpdySerializedFrame chunk2(spdy_util_.ConstructSpdyDataFrame(1, false)); 1606 SpdySerializedFrame chunk2(spdy_util_.ConstructSpdyDataFrame(1, false));
1604 SpdySerializedFrame chunk3(spdy_util_.ConstructSpdyDataFrame(1, true)); 1607 SpdySerializedFrame chunk3(spdy_util_.ConstructSpdyDataFrame(1, true));
1605 MockWrite writes[] = { 1608 MockWrite writes[] = {
1606 CreateMockWrite(req, 0), CreateMockWrite(chunk1, 1), 1609 CreateMockWrite(req, 0), CreateMockWrite(chunk1, 1),
1607 CreateMockWrite(chunk2, 2), CreateMockWrite(chunk3, 3), 1610 CreateMockWrite(chunk2, 2), CreateMockWrite(chunk3, 3),
1608 }; 1611 };
1609 1612
1610 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 1613 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
1611 MockRead reads[] = { 1614 MockRead reads[] = {
1612 CreateMockRead(resp, 4), CreateMockRead(chunk1, 5), 1615 CreateMockRead(resp, 4), CreateMockRead(chunk1, 5),
1613 CreateMockRead(chunk2, 6), CreateMockRead(chunk3, 7), 1616 CreateMockRead(chunk2, 6), CreateMockRead(chunk3, 7),
1614 MockRead(ASYNC, 0, 8) // EOF 1617 MockRead(ASYNC, 0, 8) // EOF
1615 }; 1618 };
1616 1619
1617 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1620 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1618 NormalSpdyTransactionHelper helper( 1621 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1619 CreateChunkedPostRequest(), DEFAULT_PRIORITY, NetLogWithSource(), NULL); 1622 DEFAULT_PRIORITY, NetLogWithSource(),
1623 nullptr);
1620 1624
1621 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false); 1625 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false);
1622 1626
1623 helper.RunPreTestSetup(); 1627 helper.RunPreTestSetup();
1624 helper.AddData(&data); 1628 helper.AddData(&data);
1625 ASSERT_TRUE(helper.StartDefaultTest()); 1629 ASSERT_TRUE(helper.StartDefaultTest());
1626 1630
1627 base::RunLoop().RunUntilIdle(); 1631 base::RunLoop().RunUntilIdle();
1628 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false); 1632 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false);
1629 base::RunLoop().RunUntilIdle(); 1633 base::RunLoop().RunUntilIdle();
(...skipping 13 matching lines...) Expand all
1643 EXPECT_EQ(expected_response, out.response_data); 1647 EXPECT_EQ(expected_response, out.response_data);
1644 } 1648 }
1645 1649
1646 // Test that a POST without any post data works. 1650 // Test that a POST without any post data works.
1647 TEST_F(SpdyNetworkTransactionTest, NullPost) { 1651 TEST_F(SpdyNetworkTransactionTest, NullPost) {
1648 // Setup the request 1652 // Setup the request
1649 HttpRequestInfo request; 1653 HttpRequestInfo request;
1650 request.method = "POST"; 1654 request.method = "POST";
1651 request.url = default_url_; 1655 request.url = default_url_;
1652 // Create an empty UploadData. 1656 // Create an empty UploadData.
1653 request.upload_data_stream = NULL; 1657 request.upload_data_stream = nullptr;
1654 1658
1655 // When request.upload_data_stream is NULL for post, content-length is 1659 // When request.upload_data_stream is NULL for post, content-length is
1656 // expected to be 0. 1660 // expected to be 0.
1657 SpdyHeaderBlock req_block( 1661 SpdyHeaderBlock req_block(
1658 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, 0)); 1662 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, 0));
1659 SpdySerializedFrame req( 1663 SpdySerializedFrame req(
1660 spdy_util_.ConstructSpdyHeaders(1, std::move(req_block), LOWEST, true)); 1664 spdy_util_.ConstructSpdyHeaders(1, std::move(req_block), LOWEST, true));
1661 1665
1662 MockWrite writes[] = { 1666 MockWrite writes[] = {
1663 CreateMockWrite(req, 0), 1667 CreateMockWrite(req, 0),
1664 }; 1668 };
1665 1669
1666 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 1670 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
1667 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1671 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1668 MockRead reads[] = { 1672 MockRead reads[] = {
1669 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1673 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1670 MockRead(ASYNC, 0, 3) // EOF 1674 MockRead(ASYNC, 0, 3) // EOF
1671 }; 1675 };
1672 1676
1673 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1677 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1674 1678
1675 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1679 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1676 NetLogWithSource(), NULL); 1680 NetLogWithSource(), nullptr);
1677 helper.RunToCompletion(&data); 1681 helper.RunToCompletion(&data);
1678 TransactionHelperResult out = helper.output(); 1682 TransactionHelperResult out = helper.output();
1679 EXPECT_THAT(out.rv, IsOk()); 1683 EXPECT_THAT(out.rv, IsOk());
1680 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1684 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1681 EXPECT_EQ("hello!", out.response_data); 1685 EXPECT_EQ("hello!", out.response_data);
1682 } 1686 }
1683 1687
1684 // Test that a simple POST works. 1688 // Test that a simple POST works.
1685 TEST_F(SpdyNetworkTransactionTest, EmptyPost) { 1689 TEST_F(SpdyNetworkTransactionTest, EmptyPost) {
1686 // Create an empty UploadDataStream. 1690 // Create an empty UploadDataStream.
(...skipping 10 matching lines...) Expand all
1697 1701
1698 SpdyHeaderBlock req_block( 1702 SpdyHeaderBlock req_block(
1699 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kContentLength)); 1703 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kContentLength));
1700 SpdySerializedFrame req( 1704 SpdySerializedFrame req(
1701 spdy_util_.ConstructSpdyHeaders(1, std::move(req_block), LOWEST, true)); 1705 spdy_util_.ConstructSpdyHeaders(1, std::move(req_block), LOWEST, true));
1702 1706
1703 MockWrite writes[] = { 1707 MockWrite writes[] = {
1704 CreateMockWrite(req, 0), 1708 CreateMockWrite(req, 0),
1705 }; 1709 };
1706 1710
1707 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 1711 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
1708 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1712 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1709 MockRead reads[] = { 1713 MockRead reads[] = {
1710 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1714 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1711 MockRead(ASYNC, 0, 3) // EOF 1715 MockRead(ASYNC, 0, 3) // EOF
1712 }; 1716 };
1713 1717
1714 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1718 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1715 1719
1716 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1720 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1717 NetLogWithSource(), NULL); 1721 NetLogWithSource(), nullptr);
1718 helper.RunToCompletion(&data); 1722 helper.RunToCompletion(&data);
1719 TransactionHelperResult out = helper.output(); 1723 TransactionHelperResult out = helper.output();
1720 EXPECT_THAT(out.rv, IsOk()); 1724 EXPECT_THAT(out.rv, IsOk());
1721 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1725 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1722 EXPECT_EQ("hello!", out.response_data); 1726 EXPECT_EQ("hello!", out.response_data);
1723 } 1727 }
1724 1728
1725 // While we're doing a post, the server sends the reply before upload completes. 1729 // While we're doing a post, the server sends the reply before upload completes.
1726 TEST_F(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) { 1730 TEST_F(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) {
1727 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1731 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
1728 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1732 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1729 MockWrite writes[] = { 1733 MockWrite writes[] = {
1730 CreateMockWrite(req, 0), CreateMockWrite(body, 3), 1734 CreateMockWrite(req, 0), CreateMockWrite(body, 3),
1731 }; 1735 };
1732 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 1736 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
1733 MockRead reads[] = { 1737 MockRead reads[] = {
1734 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1738 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1735 MockRead(ASYNC, 0, 4) // EOF 1739 MockRead(ASYNC, 0, 4) // EOF
1736 }; 1740 };
1737 1741
1738 // Write the request headers, and read the complete response 1742 // Write the request headers, and read the complete response
1739 // while still waiting for chunked request data. 1743 // while still waiting for chunked request data.
1740 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1744 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1741 NormalSpdyTransactionHelper helper( 1745 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1742 CreateChunkedPostRequest(), DEFAULT_PRIORITY, NetLogWithSource(), NULL); 1746 DEFAULT_PRIORITY, NetLogWithSource(),
1747 nullptr);
1743 helper.RunPreTestSetup(); 1748 helper.RunPreTestSetup();
1744 helper.AddData(&data); 1749 helper.AddData(&data);
1745 1750
1746 ASSERT_TRUE(helper.StartDefaultTest()); 1751 ASSERT_TRUE(helper.StartDefaultTest());
1747 1752
1748 base::RunLoop().RunUntilIdle(); 1753 base::RunLoop().RunUntilIdle();
1749 1754
1750 // Process the request headers, response headers, and response body. 1755 // Process the request headers, response headers, and response body.
1751 // The request body is still in flight. 1756 // The request body is still in flight.
1752 const HttpResponseInfo* response = helper.trans()->GetResponseInfo(); 1757 const HttpResponseInfo* response = helper.trans()->GetResponseInfo();
(...skipping 19 matching lines...) Expand all
1772 TEST_F(SpdyNetworkTransactionTest, SocketWriteReturnsZero) { 1777 TEST_F(SpdyNetworkTransactionTest, SocketWriteReturnsZero) {
1773 SpdySerializedFrame req( 1778 SpdySerializedFrame req(
1774 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1779 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1775 SpdySerializedFrame rst( 1780 SpdySerializedFrame rst(
1776 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1781 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1777 MockWrite writes[] = { 1782 MockWrite writes[] = {
1778 CreateMockWrite(req, 0, SYNCHRONOUS), MockWrite(SYNCHRONOUS, 0, 0, 2), 1783 CreateMockWrite(req, 0, SYNCHRONOUS), MockWrite(SYNCHRONOUS, 0, 0, 2),
1779 CreateMockWrite(rst, 3, SYNCHRONOUS), 1784 CreateMockWrite(rst, 3, SYNCHRONOUS),
1780 }; 1785 };
1781 1786
1782 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1787 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1783 MockRead reads[] = { 1788 MockRead reads[] = {
1784 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 4) // EOF 1789 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 4) // EOF
1785 }; 1790 };
1786 1791
1787 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1792 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1788 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1793 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1789 NetLogWithSource(), NULL); 1794 NetLogWithSource(), nullptr);
1790 helper.RunPreTestSetup(); 1795 helper.RunPreTestSetup();
1791 helper.AddData(&data); 1796 helper.AddData(&data);
1792 helper.StartDefaultTest(); 1797 helper.StartDefaultTest();
1793 EXPECT_THAT(helper.output().rv, IsError(ERR_IO_PENDING)); 1798 EXPECT_THAT(helper.output().rv, IsError(ERR_IO_PENDING));
1794 1799
1795 helper.WaitForCallbackToComplete(); 1800 helper.WaitForCallbackToComplete();
1796 EXPECT_THAT(helper.output().rv, IsOk()); 1801 EXPECT_THAT(helper.output().rv, IsOk());
1797 1802
1798 helper.ResetTrans(); 1803 helper.ResetTrans();
1799 base::RunLoop().RunUntilIdle(); 1804 base::RunLoop().RunUntilIdle();
(...skipping 10 matching lines...) Expand all
1810 1815
1811 SpdySerializedFrame req( 1816 SpdySerializedFrame req(
1812 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1817 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1813 SpdySerializedFrame rst( 1818 SpdySerializedFrame rst(
1814 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 1819 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
1815 MockWrite writes[] = { 1820 MockWrite writes[] = {
1816 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), 1821 CreateMockWrite(req, 0), CreateMockWrite(rst, 2),
1817 }; 1822 };
1818 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1823 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1819 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1824 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1820 NetLogWithSource(), NULL); 1825 NetLogWithSource(), nullptr);
1821 helper.RunToCompletion(&data); 1826 helper.RunToCompletion(&data);
1822 TransactionHelperResult out = helper.output(); 1827 TransactionHelperResult out = helper.output();
1823 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); 1828 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
1824 } 1829 }
1825 1830
1826 // Test that the transaction doesn't crash when we get two replies on the same 1831 // Test that the transaction doesn't crash when we get two replies on the same
1827 // stream ID. See http://crbug.com/45639. 1832 // stream ID. See http://crbug.com/45639.
1828 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { 1833 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) {
1829 SpdySerializedFrame req( 1834 SpdySerializedFrame req(
1830 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1835 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1831 SpdySerializedFrame rst( 1836 SpdySerializedFrame rst(
1832 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 1837 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
1833 MockWrite writes[] = { 1838 MockWrite writes[] = {
1834 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), 1839 CreateMockWrite(req, 0), CreateMockWrite(rst, 4),
1835 }; 1840 };
1836 1841
1837 SpdySerializedFrame resp0(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 1842 SpdySerializedFrame resp0(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1838 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 1843 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1839 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1844 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1840 MockRead reads[] = { 1845 MockRead reads[] = {
1841 CreateMockRead(resp0, 1), CreateMockRead(resp1, 2), 1846 CreateMockRead(resp0, 1), CreateMockRead(resp1, 2),
1842 CreateMockRead(body, 3), MockRead(ASYNC, 0, 5) // EOF 1847 CreateMockRead(body, 3), MockRead(ASYNC, 0, 5) // EOF
1843 }; 1848 };
1844 1849
1845 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1850 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1846 1851
1847 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1852 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1848 NetLogWithSource(), NULL); 1853 NetLogWithSource(), nullptr);
1849 helper.RunPreTestSetup(); 1854 helper.RunPreTestSetup();
1850 helper.AddData(&data); 1855 helper.AddData(&data);
1851 1856
1852 HttpNetworkTransaction* trans = helper.trans(); 1857 HttpNetworkTransaction* trans = helper.trans();
1853 1858
1854 TestCompletionCallback callback; 1859 TestCompletionCallback callback;
1855 int rv = 1860 int rv =
1856 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); 1861 trans->Start(&helper.request(), callback.callback(), NetLogWithSource());
1857 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 1862 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1858 rv = callback.WaitForResult(); 1863 rv = callback.WaitForResult();
(...skipping 25 matching lines...) Expand all
1884 }; 1889 };
1885 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(headers, 1, 1)); 1890 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(headers, 1, 1));
1886 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1891 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1887 MockRead reads[] = { 1892 MockRead reads[] = {
1888 CreateMockRead(resp, 1), CreateMockRead(body, 3), 1893 CreateMockRead(resp, 1), CreateMockRead(body, 3),
1889 MockRead(ASYNC, 0, 4) // EOF 1894 MockRead(ASYNC, 0, 4) // EOF
1890 }; 1895 };
1891 1896
1892 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1897 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1893 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1898 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1894 NetLogWithSource(), NULL); 1899 NetLogWithSource(), nullptr);
1895 helper.RunToCompletion(&data); 1900 helper.RunToCompletion(&data);
1896 TransactionHelperResult out = helper.output(); 1901 TransactionHelperResult out = helper.output();
1897 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); 1902 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
1898 1903
1899 helper.session()->spdy_session_pool()->CloseAllSessions(); 1904 helper.session()->spdy_session_pool()->CloseAllSessions();
1900 helper.VerifyDataConsumed(); 1905 helper.VerifyDataConsumed();
1901 } 1906 }
1902 1907
1903 TEST_F(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) { 1908 TEST_F(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) {
1904 // Construct the request. 1909 // Construct the request.
1905 SpdySerializedFrame req( 1910 SpdySerializedFrame req(
1906 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1911 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1912 SpdySerializedFrame priority(
1913 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
1907 SpdySerializedFrame rst( 1914 SpdySerializedFrame rst(
1908 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 1915 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
1909 MockWrite writes[] = { 1916 MockWrite writes[] = {
1910 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), 1917 CreateMockWrite(req, 0), CreateMockWrite(priority, 3),
1918 CreateMockWrite(rst, 5),
1911 }; 1919 };
1912 1920
1913 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1921 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1914 const char* const headers[] = { 1922 const char* const headers[] = {
1915 "transfer-encoding", "chunked" 1923 "transfer-encoding", "chunked"
1916 }; 1924 };
1917 SpdySerializedFrame push( 1925 SpdySerializedFrame push(
1918 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1, 1926 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1,
1919 GetDefaultUrlWithPath("/1").c_str())); 1927 GetDefaultUrlWithPath("/1").c_str()));
1920 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1928 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1921 MockRead reads[] = { 1929 MockRead reads[] = {
1922 CreateMockRead(resp, 1), CreateMockRead(push, 2), CreateMockRead(body, 3), 1930 CreateMockRead(resp, 1), CreateMockRead(push, 2), CreateMockRead(body, 4),
1923 MockRead(ASYNC, 0, 5) // EOF 1931 MockRead(ASYNC, 0, 6) // EOF
1924 }; 1932 };
1925 1933
1926 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1934 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1927 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1935 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1928 NetLogWithSource(), NULL); 1936 NetLogWithSource(), nullptr);
1929 helper.RunToCompletion(&data); 1937 helper.RunToCompletion(&data);
1930 TransactionHelperResult out = helper.output(); 1938 TransactionHelperResult out = helper.output();
1931 EXPECT_THAT(out.rv, IsOk()); 1939 EXPECT_THAT(out.rv, IsOk());
1932 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1940 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1933 EXPECT_EQ("hello!", out.response_data); 1941 EXPECT_EQ("hello!", out.response_data);
1934 1942
1935 helper.session()->spdy_session_pool()->CloseAllSessions(); 1943 helper.session()->spdy_session_pool()->CloseAllSessions();
1936 helper.VerifyDataConsumed(); 1944 helper.VerifyDataConsumed();
1937 } 1945 }
1938 1946
1939 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) { 1947 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) {
1940 // Construct the request. 1948 // Construct the request.
1941 SpdySerializedFrame req( 1949 SpdySerializedFrame req(
1942 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1950 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1943 MockWrite writes[] = { 1951 MockWrite writes[] = {
1944 CreateMockWrite(req), 1952 CreateMockWrite(req),
1945 }; 1953 };
1946 1954
1947 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1955 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1948 MockRead reads[] = { 1956 MockRead reads[] = {
1949 CreateMockRead(resp), 1957 CreateMockRead(resp),
1950 // This following read isn't used by the test, except during the 1958 // This following read isn't used by the test, except during the
1951 // RunUntilIdle() call at the end since the SpdySession survives the 1959 // RunUntilIdle() call at the end since the SpdySession survives the
1952 // HttpNetworkTransaction and still tries to continue Read()'ing. Any 1960 // HttpNetworkTransaction and still tries to continue Read()'ing. Any
1953 // MockRead will do here. 1961 // MockRead will do here.
1954 MockRead(ASYNC, 0, 0) // EOF 1962 MockRead(ASYNC, 0, 0) // EOF
1955 }; 1963 };
1956 1964
1957 StaticSocketDataProvider data(reads, arraysize(reads), 1965 StaticSocketDataProvider data(reads, arraysize(reads),
1958 writes, arraysize(writes)); 1966 writes, arraysize(writes));
1959 1967
1960 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1968 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1961 NetLogWithSource(), NULL); 1969 NetLogWithSource(), nullptr);
1962 helper.RunPreTestSetup(); 1970 helper.RunPreTestSetup();
1963 helper.AddData(&data); 1971 helper.AddData(&data);
1964 HttpNetworkTransaction* trans = helper.trans(); 1972 HttpNetworkTransaction* trans = helper.trans();
1965 1973
1966 TestCompletionCallback callback; 1974 TestCompletionCallback callback;
1967 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 1975 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
1968 NetLogWithSource()); 1976 NetLogWithSource());
1969 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 1977 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1970 helper.ResetTrans(); // Cancel the transaction. 1978 helper.ResetTrans(); // Cancel the transaction.
1971 1979
1972 // Flush the MessageLoop while the SpdySessionDependencies (in particular, the 1980 // Flush the MessageLoop while the SpdySessionDependencies (in particular, the
1973 // MockClientSocketFactory) are still alive. 1981 // MockClientSocketFactory) are still alive.
1974 base::RunLoop().RunUntilIdle(); 1982 base::RunLoop().RunUntilIdle();
1975 helper.VerifyDataNotConsumed(); 1983 helper.VerifyDataNotConsumed();
1976 } 1984 }
1977 1985
1978 // Verify that the client sends a Rst Frame upon cancelling the stream. 1986 // Verify that the client sends a Rst Frame upon cancelling the stream.
1979 TEST_F(SpdyNetworkTransactionTest, CancelledTransactionSendRst) { 1987 TEST_F(SpdyNetworkTransactionTest, CancelledTransactionSendRst) {
1980 SpdySerializedFrame req( 1988 SpdySerializedFrame req(
1981 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1989 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1982 SpdySerializedFrame rst( 1990 SpdySerializedFrame rst(
1983 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1991 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1984 MockWrite writes[] = { 1992 MockWrite writes[] = {
1985 CreateMockWrite(req, 0, SYNCHRONOUS), 1993 CreateMockWrite(req, 0, SYNCHRONOUS),
1986 CreateMockWrite(rst, 2, SYNCHRONOUS), 1994 CreateMockWrite(rst, 2, SYNCHRONOUS),
1987 }; 1995 };
1988 1996
1989 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 1997 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1990 MockRead reads[] = { 1998 MockRead reads[] = {
1991 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 3) // EOF 1999 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 3) // EOF
1992 }; 2000 };
1993 2001
1994 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2002 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1995 2003
1996 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2004 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1997 NetLogWithSource(), NULL); 2005 NetLogWithSource(), nullptr);
1998 helper.RunPreTestSetup(); 2006 helper.RunPreTestSetup();
1999 helper.AddData(&data); 2007 helper.AddData(&data);
2000 HttpNetworkTransaction* trans = helper.trans(); 2008 HttpNetworkTransaction* trans = helper.trans();
2001 2009
2002 TestCompletionCallback callback; 2010 TestCompletionCallback callback;
2003 2011
2004 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 2012 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
2005 NetLogWithSource()); 2013 NetLogWithSource());
2006 EXPECT_THAT(callback.GetResult(rv), IsOk()); 2014 EXPECT_THAT(callback.GetResult(rv), IsOk());
2007 2015
(...skipping 14 matching lines...) Expand all
2022 MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 3)}; 2030 MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 3)};
2023 2031
2024 // The indicated length of this frame is longer than its actual length. When 2032 // The indicated length of this frame is longer than its actual length. When
2025 // the session receives an empty frame after this one, it shuts down the 2033 // the session receives an empty frame after this one, it shuts down the
2026 // session, and calls the read callback with the incomplete data. 2034 // session, and calls the read callback with the incomplete data.
2027 const uint8_t kGetBodyFrame2[] = { 2035 const uint8_t kGetBodyFrame2[] = {
2028 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 2036 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
2029 0x07, 'h', 'e', 'l', 'l', 'o', '!', 2037 0x07, 'h', 'e', 'l', 'l', 'o', '!',
2030 }; 2038 };
2031 2039
2032 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2040 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2033 MockRead reads[] = { 2041 MockRead reads[] = {
2034 CreateMockRead(resp, 1), 2042 CreateMockRead(resp, 1),
2035 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 2043 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
2036 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2), 2044 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2),
2037 arraysize(kGetBodyFrame2), 3), 2045 arraysize(kGetBodyFrame2), 3),
2038 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 2046 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause
2039 MockRead(ASYNC, 0, 0, 5), // EOF 2047 MockRead(ASYNC, 0, 0, 5), // EOF
2040 }; 2048 };
2041 MockRead reads2[] = { 2049 MockRead reads2[] = {
2042 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF 2050 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF
2043 }; 2051 };
2044 2052
2045 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2053 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2046 SequencedSocketData data2(reads2, arraysize(reads2), writes2, 2054 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2047 arraysize(writes2)); 2055 arraysize(writes2));
2048 2056
2049 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2057 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2050 NetLogWithSource(), NULL); 2058 NetLogWithSource(), nullptr);
2051 helper.RunPreTestSetup(); 2059 helper.RunPreTestSetup();
2052 helper.AddData(&data); 2060 helper.AddData(&data);
2053 helper.AddData(&data2); 2061 helper.AddData(&data2);
2054 HttpNetworkTransaction* trans = helper.trans(); 2062 HttpNetworkTransaction* trans = helper.trans();
2055 2063
2056 // Start the transaction with basic parameters. 2064 // Start the transaction with basic parameters.
2057 TestCompletionCallback callback; 2065 TestCompletionCallback callback;
2058 int rv = 2066 int rv =
2059 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); 2067 trans->Start(&helper.request(), callback.callback(), NetLogWithSource());
2060 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 2068 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
(...skipping 17 matching lines...) Expand all
2078 } 2086 }
2079 2087
2080 // Verify that the client can correctly deal with the user callback deleting the 2088 // Verify that the client can correctly deal with the user callback deleting the
2081 // transaction. Failures will usually be valgrind errors. See 2089 // transaction. Failures will usually be valgrind errors. See
2082 // http://crbug.com/46925 2090 // http://crbug.com/46925
2083 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { 2091 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) {
2084 SpdySerializedFrame req( 2092 SpdySerializedFrame req(
2085 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2093 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2086 MockWrite writes[] = {CreateMockWrite(req, 0)}; 2094 MockWrite writes[] = {CreateMockWrite(req, 0)};
2087 2095
2088 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2096 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2089 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2097 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
2090 MockRead reads[] = { 2098 MockRead reads[] = {
2091 CreateMockRead(resp, 1), 2099 CreateMockRead(resp, 1),
2092 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 2100 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
2093 CreateMockRead(body, 3), MockRead(ASYNC, 0, 0, 4), // EOF 2101 CreateMockRead(body, 3), MockRead(ASYNC, 0, 0, 4), // EOF
2094 }; 2102 };
2095 2103
2096 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2104 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2097 2105
2098 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2106 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2099 NetLogWithSource(), NULL); 2107 NetLogWithSource(), nullptr);
2100 helper.RunPreTestSetup(); 2108 helper.RunPreTestSetup();
2101 helper.AddData(&data); 2109 helper.AddData(&data);
2102 HttpNetworkTransaction* trans = helper.trans(); 2110 HttpNetworkTransaction* trans = helper.trans();
2103 2111
2104 // Start the transaction with basic parameters. 2112 // Start the transaction with basic parameters.
2105 TestCompletionCallback callback; 2113 TestCompletionCallback callback;
2106 int rv = 2114 int rv =
2107 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); 2115 trans->Start(&helper.request(), callback.callback(), NetLogWithSource());
2108 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 2116 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2109 rv = callback.WaitForResult(); 2117 rv = callback.WaitForResult();
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2175 } 2183 }
2176 2184
2177 TEST_F(SpdyNetworkTransactionTest, 2185 TEST_F(SpdyNetworkTransactionTest,
2178 TestRawHeaderSizeSuccessfullPushHeadersFirst) { 2186 TestRawHeaderSizeSuccessfullPushHeadersFirst) {
2179 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); 2187 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
2180 headers["user-agent"] = ""; 2188 headers["user-agent"] = "";
2181 headers["accept-encoding"] = "gzip, deflate"; 2189 headers["accept-encoding"] = "gzip, deflate";
2182 2190
2183 SpdySerializedFrame req( 2191 SpdySerializedFrame req(
2184 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); 2192 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
2193 SpdySerializedFrame priority(
2194 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2185 MockWrite writes[] = { 2195 MockWrite writes[] = {
2186 CreateMockWrite(req, 0), 2196 CreateMockWrite(req, 0), CreateMockWrite(priority, 2),
2187 }; 2197 };
2188 2198
2189 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 2199 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2190 SpdySerializedFrame response_body_frame( 2200 SpdySerializedFrame response_body_frame(
2191 spdy_util_.ConstructSpdyDataFrame(1, "should not include", 18, true)); 2201 spdy_util_.ConstructSpdyDataFrame(1, "should not include", 18, true));
2192 2202
2193 SpdyHeaderBlock push_headers; 2203 SpdyHeaderBlock push_headers;
2194 spdy_util_.AddUrlToHeaderBlock(std::string(kDefaultUrl) + "b.dat", 2204 spdy_util_.AddUrlToHeaderBlock(std::string(kDefaultUrl) + "b.dat",
2195 &push_headers); 2205 &push_headers);
2196 2206
2197 SpdySerializedFrame push_init_frame( 2207 SpdySerializedFrame push_init_frame(
2198 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 2, 1)); 2208 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 2, 1));
2199 2209
2200 SpdySerializedFrame push_headers_frame( 2210 SpdySerializedFrame push_headers_frame(
2201 spdy_util_.ConstructSpdyPushHeaders(2, nullptr, 0)); 2211 spdy_util_.ConstructSpdyPushHeaders(2, nullptr, 0));
2202 2212
2203 SpdySerializedFrame push_body_frame(spdy_util_.ConstructSpdyDataFrame( 2213 SpdySerializedFrame push_body_frame(spdy_util_.ConstructSpdyDataFrame(
2204 2, "should not include either", 25, false)); 2214 2, "should not include either", 25, false));
2205 2215
2206 MockRead push_init_read(CreateMockRead(push_init_frame, 1)); 2216 MockRead push_init_read(CreateMockRead(push_init_frame, 1));
2207 MockRead response_headers(CreateMockRead(resp, 4)); 2217 MockRead response_headers(CreateMockRead(resp, 5));
2208 // raw_header_size() will contain the size of the push promise frame 2218 // raw_header_size() will contain the size of the push promise frame
2209 // initialization. 2219 // initialization.
2210 int expected_response_headers_size = 2220 int expected_response_headers_size =
2211 response_headers.data_len + push_init_read.data_len; 2221 response_headers.data_len + push_init_read.data_len;
2212 2222
2213 MockRead reads[] = { 2223 MockRead reads[] = {
2214 push_init_read, 2224 push_init_read,
2215 CreateMockRead(push_headers_frame, 2), 2225 CreateMockRead(push_headers_frame, 3),
2216 CreateMockRead(push_body_frame, 3), 2226 CreateMockRead(push_body_frame, 4),
2217 response_headers, 2227 response_headers,
2218 CreateMockRead(response_body_frame, 5), 2228 CreateMockRead(response_body_frame, 6),
2219 MockRead(ASYNC, 0, 6) // EOF 2229 MockRead(ASYNC, 0, 7) // EOF
2220 }; 2230 };
2221 2231
2222 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2232 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2223 2233
2224 TestDelegate delegate; 2234 TestDelegate delegate;
2225 SpdyURLRequestContext spdy_url_request_context; 2235 SpdyURLRequestContext spdy_url_request_context;
2226 TestNetworkDelegate network_delegate; 2236 TestNetworkDelegate network_delegate;
2227 spdy_url_request_context.set_network_delegate(&network_delegate); 2237 spdy_url_request_context.set_network_delegate(&network_delegate);
2228 SSLSocketDataProvider ssl_data(ASYNC, OK); 2238 SSLSocketDataProvider ssl_data(ASYNC, OK);
2229 ssl_data.next_proto = kProtoHTTP2; 2239 ssl_data.next_proto = kProtoHTTP2;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2269 SpdyHeaderBlock headers2( 2279 SpdyHeaderBlock headers2(
2270 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); 2280 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php"));
2271 headers2["user-agent"] = ""; 2281 headers2["user-agent"] = "";
2272 headers2["accept-encoding"] = "gzip, deflate"; 2282 headers2["accept-encoding"] = "gzip, deflate";
2273 SpdySerializedFrame req2( 2283 SpdySerializedFrame req2(
2274 spdy_util_.ConstructSpdyHeaders(1, std::move(headers2), LOWEST, true)); 2284 spdy_util_.ConstructSpdyHeaders(1, std::move(headers2), LOWEST, true));
2275 MockWrite writes2[] = { 2285 MockWrite writes2[] = {
2276 CreateMockWrite(req2, 1), 2286 CreateMockWrite(req2, 1),
2277 }; 2287 };
2278 2288
2279 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2289 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2280 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); 2290 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true));
2281 MockRead reads2[] = { 2291 MockRead reads2[] = {
2282 CreateMockRead(resp2, 2), CreateMockRead(body2, 3), 2292 CreateMockRead(resp2, 2), CreateMockRead(body2, 3),
2283 MockRead(ASYNC, 0, 0, 4) // EOF 2293 MockRead(ASYNC, 0, 0, 4) // EOF
2284 }; 2294 };
2285 2295
2286 SequencedSocketData data2(reads2, arraysize(reads2), writes2, 2296 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2287 arraysize(writes2)); 2297 arraysize(writes2));
2288 2298
2289 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN 2299 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN
(...skipping 30 matching lines...) Expand all
2320 // Send a spdy request to www.example.org. Get a pushed stream that redirects to 2330 // Send a spdy request to www.example.org. Get a pushed stream that redirects to
2321 // www.foo.com. 2331 // www.foo.com.
2322 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectServerPush) { 2332 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectServerPush) {
2323 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); 2333 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
2324 headers["user-agent"] = ""; 2334 headers["user-agent"] = "";
2325 headers["accept-encoding"] = "gzip, deflate"; 2335 headers["accept-encoding"] = "gzip, deflate";
2326 2336
2327 // Setup writes/reads to www.example.org 2337 // Setup writes/reads to www.example.org
2328 SpdySerializedFrame req( 2338 SpdySerializedFrame req(
2329 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); 2339 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
2330 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2340 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2331 SpdySerializedFrame rep(spdy_util_.ConstructSpdyPush( 2341 SpdySerializedFrame rep(spdy_util_.ConstructSpdyPush(
2332 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str(), 2342 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str(),
2333 "301 Moved Permanently", "http://www.foo.com/index.php")); 2343 "301 Moved Permanently", "http://www.foo.com/index.php"));
2334 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2344 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
2335 SpdySerializedFrame rst( 2345 SpdySerializedFrame rst(
2336 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); 2346 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL));
2337 MockWrite writes[] = { 2347 MockWrite writes[] = {
2338 CreateMockWrite(req, 1), CreateMockWrite(rst, 6), 2348 CreateMockWrite(req, 1), CreateMockWrite(rst, 6),
2339 }; 2349 };
2340 MockRead reads[] = { 2350 MockRead reads[] = {
2341 CreateMockRead(resp, 2), CreateMockRead(rep, 3), CreateMockRead(body, 4), 2351 CreateMockRead(resp, 2), CreateMockRead(rep, 3), CreateMockRead(body, 4),
2342 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2352 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause
2343 MockRead(ASYNC, 0, 0, 7) // EOF 2353 MockRead(ASYNC, 0, 0, 7) // EOF
2344 }; 2354 };
2345 2355
2346 // Setup writes/reads to www.foo.com 2356 // Setup writes/reads to www.foo.com
2347 SpdyHeaderBlock headers2( 2357 SpdyHeaderBlock headers2(
2348 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); 2358 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php"));
2349 headers2["user-agent"] = ""; 2359 headers2["user-agent"] = "";
2350 headers2["accept-encoding"] = "gzip, deflate"; 2360 headers2["accept-encoding"] = "gzip, deflate";
2351 SpdySerializedFrame req2( 2361 SpdySerializedFrame req2(
2352 spdy_util_.ConstructSpdyHeaders(1, std::move(headers2), LOWEST, true)); 2362 spdy_util_.ConstructSpdyHeaders(1, std::move(headers2), LOWEST, true));
2353 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2363 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2354 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); 2364 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true));
2355 MockWrite writes2[] = { 2365 MockWrite writes2[] = {
2356 CreateMockWrite(req2, 1), 2366 CreateMockWrite(req2, 1),
2357 }; 2367 };
2358 MockRead reads2[] = { 2368 MockRead reads2[] = {
2359 CreateMockRead(resp2, 2), CreateMockRead(body2, 3), 2369 CreateMockRead(resp2, 2), CreateMockRead(body2, 3),
2360 MockRead(ASYNC, 0, 0, 5) // EOF 2370 MockRead(ASYNC, 0, 0, 5) // EOF
2361 }; 2371 };
2362 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2372 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2363 SequencedSocketData data2(reads2, arraysize(reads2), writes2, 2373 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2399 } 2409 }
2400 EXPECT_TRUE(data.AllReadDataConsumed()); 2410 EXPECT_TRUE(data.AllReadDataConsumed());
2401 EXPECT_TRUE(data.AllWriteDataConsumed()); 2411 EXPECT_TRUE(data.AllWriteDataConsumed());
2402 EXPECT_TRUE(data2.AllReadDataConsumed()); 2412 EXPECT_TRUE(data2.AllReadDataConsumed());
2403 EXPECT_TRUE(data2.AllWriteDataConsumed()); 2413 EXPECT_TRUE(data2.AllWriteDataConsumed());
2404 } 2414 }
2405 2415
2406 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { 2416 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) {
2407 SpdySerializedFrame stream1_syn( 2417 SpdySerializedFrame stream1_syn(
2408 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2418 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2409 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2419 SpdySerializedFrame stream2_priority(
2420 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2410 MockWrite writes[] = { 2421 MockWrite writes[] = {
2411 CreateMockWrite(stream1_syn, 0), 2422 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
2412 }; 2423 };
2413 2424
2414 SpdySerializedFrame stream1_reply( 2425 SpdySerializedFrame stream1_reply(
2415 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2426 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2416 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2427 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2417 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2428 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2429 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2418 const char kPushedData[] = "pushed"; 2430 const char kPushedData[] = "pushed";
2419 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2431 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2420 2, kPushedData, strlen(kPushedData), true)); 2432 2, kPushedData, strlen(kPushedData), true));
2421 MockRead reads[] = { 2433 MockRead reads[] = {
2422 CreateMockRead(stream1_reply, 1), 2434 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2423 CreateMockRead(stream2_syn, 2), 2435 CreateMockRead(stream1_body, 4), CreateMockRead(stream2_body, 5),
2424 CreateMockRead(stream1_body, 3, SYNCHRONOUS), 2436 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
2425 CreateMockRead(stream2_body, 4),
2426 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2427 }; 2437 };
2428 2438
2429 HttpResponseInfo response; 2439 HttpResponseInfo response;
2430 HttpResponseInfo response2; 2440 HttpResponseInfo response2;
2431 std::string expected_push_result("pushed"); 2441 std::string expected_push_result("pushed");
2432 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2442 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2433 RunServerPushTest(&data, 2443 RunServerPushTest(&data,
2434 &response, 2444 &response,
2435 &response2, 2445 &response2,
2436 expected_push_result); 2446 expected_push_result);
2437 2447
2438 // Verify the response headers. 2448 // Verify the response headers.
2439 EXPECT_TRUE(response.headers); 2449 EXPECT_TRUE(response.headers);
2440 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2450 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2441 2451
2442 // Verify the pushed stream. 2452 // Verify the pushed stream.
2443 EXPECT_TRUE(response2.headers); 2453 EXPECT_TRUE(response2.headers);
2444 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2454 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2445 } 2455 }
2446 2456
2447 TEST_F(SpdyNetworkTransactionTest, ServerPushBeforeHeaders) { 2457 TEST_F(SpdyNetworkTransactionTest, ServerPushBeforeHeaders) {
2448 SpdySerializedFrame stream1_syn( 2458 SpdySerializedFrame stream1_syn(
2449 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2459 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2460 SpdySerializedFrame stream2_priority(
2461 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2450 MockWrite writes[] = { 2462 MockWrite writes[] = {
2451 CreateMockWrite(stream1_syn, 0), 2463 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 2),
2452 }; 2464 };
2453 2465
2454 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2466 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2455 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2467 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2456 SpdySerializedFrame stream1_reply( 2468 SpdySerializedFrame stream1_reply(
2457 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2469 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2458 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2470 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2459 const char kPushedData[] = "pushed"; 2471 const char kPushedData[] = "pushed";
2460 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2472 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2461 2, kPushedData, strlen(kPushedData), true)); 2473 2, kPushedData, strlen(kPushedData), true));
2462 MockRead reads[] = { 2474 MockRead reads[] = {
2463 CreateMockRead(stream2_syn, 1), 2475 CreateMockRead(stream2_syn, 1),
2464 CreateMockRead(stream1_reply, 2), 2476 CreateMockRead(stream1_reply, 3),
2465 CreateMockRead(stream1_body, 3, SYNCHRONOUS), 2477 CreateMockRead(stream1_body, 4, SYNCHRONOUS),
2466 CreateMockRead(stream2_body, 4), 2478 CreateMockRead(stream2_body, 5),
2467 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2479 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
2468 }; 2480 };
2469 2481
2470 HttpResponseInfo response; 2482 HttpResponseInfo response;
2471 HttpResponseInfo response2; 2483 HttpResponseInfo response2;
2472 std::string expected_push_result("pushed"); 2484 std::string expected_push_result("pushed");
2473 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2485 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2474 RunServerPushTest(&data, 2486 RunServerPushTest(&data,
2475 &response, 2487 &response,
2476 &response2, 2488 &response2,
2477 expected_push_result); 2489 expected_push_result);
2478 2490
2479 // Verify the response headers. 2491 // Verify the response headers.
2480 EXPECT_TRUE(response.headers); 2492 EXPECT_TRUE(response.headers);
2481 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2493 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2482 2494
2483 // Verify the pushed stream. 2495 // Verify the pushed stream.
2484 EXPECT_TRUE(response2.headers); 2496 EXPECT_TRUE(response2.headers);
2485 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2497 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2486 } 2498 }
2487 2499
2488 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) { 2500 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) {
2489 SpdySerializedFrame stream1_syn( 2501 SpdySerializedFrame stream1_syn(
2490 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2502 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2503 SpdySerializedFrame stream2_priority(
2504 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2491 MockWrite writes[] = { 2505 MockWrite writes[] = {
2492 CreateMockWrite(stream1_syn, 0), 2506 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
2493 }; 2507 };
2494 2508
2495 SpdySerializedFrame stream1_reply( 2509 SpdySerializedFrame stream1_reply(
2496 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2510 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2497 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2511 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2498 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2512 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2499 const char kPushedData[] = "pushed"; 2513 const char kPushedData[] = "pushed";
2500 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2514 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2501 2, kPushedData, strlen(kPushedData), true)); 2515 2, kPushedData, strlen(kPushedData), true));
2502 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2516 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2503 MockRead reads[] = { 2517 MockRead reads[] = {
2504 CreateMockRead(stream1_reply, 1), 2518 CreateMockRead(stream1_reply, 1),
2505 CreateMockRead(stream2_syn, 2), 2519 CreateMockRead(stream2_syn, 2),
2506 CreateMockRead(stream2_body, 3), 2520 CreateMockRead(stream2_body, 4),
2507 CreateMockRead(stream1_body, 4, SYNCHRONOUS), 2521 CreateMockRead(stream1_body, 5, SYNCHRONOUS),
2508 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2522 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
2509 }; 2523 };
2510 2524
2511 HttpResponseInfo response; 2525 HttpResponseInfo response;
2512 HttpResponseInfo response2; 2526 HttpResponseInfo response2;
2513 std::string expected_push_result("pushed"); 2527 std::string expected_push_result("pushed");
2514 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2528 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2515 RunServerPushTest(&data, 2529 RunServerPushTest(&data,
2516 &response, 2530 &response,
2517 &response2, 2531 &response2,
2518 expected_push_result); 2532 expected_push_result);
2519 2533
2520 // Verify the response headers. 2534 // Verify the response headers.
2521 EXPECT_TRUE(response.headers); 2535 EXPECT_TRUE(response.headers);
2522 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2536 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2523 2537
2524 // Verify the pushed stream. 2538 // Verify the pushed stream.
2525 EXPECT_TRUE(response2.headers); 2539 EXPECT_TRUE(response2.headers);
2526 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2540 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2527 } 2541 }
2528 2542
2543 TEST_F(SpdyNetworkTransactionTest, ServerPushUpdatesPriority) {
2544 SpdySerializedFrame stream1_headers(
2545 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, HIGHEST, true));
2546 SpdySerializedFrame stream3_headers(
2547 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true));
2548 SpdySerializedFrame stream5_headers(
2549 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true));
2550
2551 // Stream 1 pushes two streams that are initially prioritized below stream 5.
2552 // Stream 2 is later prioritized below stream 1 after it matches a request.
2553 SpdySerializedFrame stream2_priority(
2554 spdy_util_.ConstructSpdyPriority(2, 5, IDLE, true));
2555 SpdySerializedFrame stream4_priority(
2556 spdy_util_.ConstructSpdyPriority(4, 2, IDLE, true));
2557 SpdySerializedFrame stream4_priority_update(
2558 spdy_util_.ConstructSpdyPriority(4, 5, IDLE, true));
2559 SpdySerializedFrame stream2_priority_update(
2560 spdy_util_.ConstructSpdyPriority(2, 1, HIGHEST, true));
2561
2562 MockWrite writes[] = {
2563 CreateMockWrite(stream1_headers, 0),
2564 CreateMockWrite(stream3_headers, 1),
2565 CreateMockWrite(stream5_headers, 2),
2566 CreateMockWrite(stream2_priority, 7),
2567 CreateMockWrite(stream4_priority, 9),
2568 CreateMockWrite(stream4_priority_update, 11),
2569 CreateMockWrite(stream2_priority_update, 12),
2570 };
2571
2572 SpdySerializedFrame stream1_reply(
2573 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2574 SpdySerializedFrame stream3_reply(
2575 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
2576 SpdySerializedFrame stream5_reply(
2577 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 5));
2578
2579 SpdySerializedFrame stream2_push(spdy_util_.ConstructSpdyPush(
2580 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2581 SpdySerializedFrame stream4_push(spdy_util_.ConstructSpdyPush(
2582 nullptr, 0, 4, 1, GetDefaultUrlWithPath("/bar.dat").c_str()));
2583
2584 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2585 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(2, true));
2586 SpdySerializedFrame stream3_body(spdy_util_.ConstructSpdyDataFrame(3, true));
2587 SpdySerializedFrame stream5_body(spdy_util_.ConstructSpdyDataFrame(5, true));
2588
2589 MockRead reads[] = {
2590 CreateMockRead(stream1_reply, 3),
2591 CreateMockRead(stream3_reply, 4),
2592 CreateMockRead(stream5_reply, 5),
2593 CreateMockRead(stream2_push, 6),
2594 CreateMockRead(stream4_push, 8),
2595 MockRead(ASYNC, ERR_IO_PENDING, 10),
2596 CreateMockRead(stream1_body, 13),
2597 CreateMockRead(stream2_body, 14),
2598 CreateMockRead(stream3_body, 15),
2599 CreateMockRead(stream5_body, 16),
2600 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 17), // Force a pause
2601 };
2602
2603 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2604 SequencedSocketData data_placeholder1(nullptr, 0, nullptr, 0);
2605 SequencedSocketData data_placeholder2(nullptr, 0, nullptr, 0);
2606 SequencedSocketData data_placeholder3(nullptr, 0, nullptr, 0);
2607
2608 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST,
2609 NetLogWithSource(), nullptr);
2610 helper.RunPreTestSetup();
2611 helper.AddData(&data);
2612 helper.AddData(&data_placeholder1); // other requests reuse the same socket
2613 helper.AddData(&data_placeholder2);
2614 helper.AddData(&data_placeholder3);
2615 HttpNetworkTransaction trans1(HIGHEST, helper.session());
2616 HttpNetworkTransaction trans3(MEDIUM, helper.session());
2617 HttpNetworkTransaction trans5(MEDIUM, helper.session());
2618
2619 TestCompletionCallback callback1;
2620 TestCompletionCallback callback3;
2621 TestCompletionCallback callback5;
2622
2623 // Start the ordinary requests.
2624 NetLogWithSource log;
2625 ASSERT_THAT(trans1.Start(&CreateGetRequest(), callback1.callback(), log),
2626 IsError(ERR_IO_PENDING));
2627 ASSERT_THAT(trans3.Start(&CreateGetRequest(), callback3.callback(), log),
2628 IsError(ERR_IO_PENDING));
2629 ASSERT_THAT(trans5.Start(&CreateGetRequest(), callback5.callback(), log),
2630 IsError(ERR_IO_PENDING));
2631 data.RunUntilPaused();
2632
2633 HttpNetworkTransaction trans2(HIGHEST, helper.session());
2634 TestCompletionCallback callback2;
2635
2636 // Start a request that matches the push.
2637 HttpRequestInfo push_req = CreateGetRequest();
2638 push_req.url = GURL(GetDefaultUrlWithPath("/foo.dat"));
2639 ASSERT_THAT(trans2.Start(&push_req, callback2.callback(), log),
2640 IsError(ERR_IO_PENDING));
2641 data.Resume();
2642
2643 base::RunLoop().RunUntilIdle();
2644 ASSERT_THAT(callback1.WaitForResult(), IsOk());
2645 ASSERT_THAT(callback2.WaitForResult(), IsOk());
2646 ASSERT_THAT(callback3.WaitForResult(), IsOk());
2647 ASSERT_THAT(callback5.WaitForResult(), IsOk());
2648 helper.VerifyDataConsumed();
2649 }
2650
2529 TEST_F(SpdyNetworkTransactionTest, ServerPushServerAborted) { 2651 TEST_F(SpdyNetworkTransactionTest, ServerPushServerAborted) {
2530 SpdySerializedFrame stream1_syn( 2652 SpdySerializedFrame stream1_syn(
2531 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2653 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2532 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2654 SpdySerializedFrame stream2_priority(
2655 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2533 MockWrite writes[] = { 2656 MockWrite writes[] = {
2534 CreateMockWrite(stream1_syn, 0), 2657 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
2535 }; 2658 };
2536 2659
2537 SpdySerializedFrame stream1_reply( 2660 SpdySerializedFrame stream1_reply(
2538 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2661 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2539 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2662 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2540 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2663 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2541 SpdySerializedFrame stream2_rst( 2664 SpdySerializedFrame stream2_rst(
2542 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2665 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2666 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2543 MockRead reads[] = { 2667 MockRead reads[] = {
2544 CreateMockRead(stream1_reply, 1), 2668 CreateMockRead(stream1_reply, 1),
2545 CreateMockRead(stream2_syn, 2, SYNCHRONOUS), 2669 CreateMockRead(stream2_syn, 2, SYNCHRONOUS),
2546 CreateMockRead(stream2_rst, 3, SYNCHRONOUS), 2670 CreateMockRead(stream2_rst, 4),
2547 CreateMockRead(stream1_body, 4, SYNCHRONOUS), 2671 CreateMockRead(stream1_body, 5, SYNCHRONOUS),
2548 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2672 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
2549 }; 2673 };
2550 2674
2551 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2675 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2552 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2676 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2553 NetLogWithSource(), NULL); 2677 NetLogWithSource(), nullptr);
2554 2678
2555 helper.RunPreTestSetup(); 2679 helper.RunPreTestSetup();
2556 helper.AddData(&data); 2680 helper.AddData(&data);
2557 2681
2558 HttpNetworkTransaction* trans = helper.trans(); 2682 HttpNetworkTransaction* trans = helper.trans();
2559 2683
2560 // Start the transaction with basic parameters. 2684 // Start the transaction with basic parameters.
2561 TestCompletionCallback callback; 2685 TestCompletionCallback callback;
2562 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 2686 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
2563 NetLogWithSource()); 2687 NetLogWithSource());
2564 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 2688 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2565 rv = callback.WaitForResult(); 2689 rv = callback.WaitForResult();
2566 EXPECT_THAT(rv, IsOk()); 2690 EXPECT_THAT(rv, IsOk());
2567 2691
2568 // Verify that we consumed all test data. 2692 // Verify that we consumed all test data.
2693 base::RunLoop().RunUntilIdle();
2569 EXPECT_TRUE(data.AllReadDataConsumed()); 2694 EXPECT_TRUE(data.AllReadDataConsumed());
2570 EXPECT_TRUE(data.AllWriteDataConsumed()); 2695 EXPECT_TRUE(data.AllWriteDataConsumed());
2571 2696
2572 // Verify the response headers. 2697 // Verify the response headers.
2573 HttpResponseInfo response = *trans->GetResponseInfo(); 2698 HttpResponseInfo response = *trans->GetResponseInfo();
2574 EXPECT_TRUE(response.headers); 2699 EXPECT_TRUE(response.headers);
2575 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2700 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2576 } 2701 }
2577 2702
2578 // Verify that we don't leak streams and that we properly send a reset 2703 // Verify that we don't leak streams and that we properly send a reset
2579 // if the server pushes the same stream twice. 2704 // if the server pushes the same stream twice.
2580 TEST_F(SpdyNetworkTransactionTest, ServerPushDuplicate) { 2705 TEST_F(SpdyNetworkTransactionTest, ServerPushDuplicate) {
2581 SpdySerializedFrame stream1_syn( 2706 SpdySerializedFrame stream1_syn(
2582 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2707 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2583 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2708 SpdySerializedFrame stream2_priority(
2709 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2584 SpdySerializedFrame stream3_rst( 2710 SpdySerializedFrame stream3_rst(
2585 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR)); 2711 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR));
2586 MockWrite writes[] = { 2712 MockWrite writes[] = {
2587 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream3_rst, 4), 2713 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
2714 CreateMockWrite(stream3_rst, 5),
2588 }; 2715 };
2589 2716
2590 SpdySerializedFrame stream1_reply( 2717 SpdySerializedFrame stream1_reply(
2591 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2718 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2592 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2719 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2593 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2720 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2721 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush(
2722 nullptr, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2723
2594 const char kPushedData[] = "pushed"; 2724 const char kPushedData[] = "pushed";
2725 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2595 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2726 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2596 2, kPushedData, strlen(kPushedData), true)); 2727 2, kPushedData, strlen(kPushedData), true));
2597 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( 2728
2598 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2599 MockRead reads[] = { 2729 MockRead reads[] = {
2600 CreateMockRead(stream1_reply, 1), 2730 CreateMockRead(stream1_reply, 1),
2601 CreateMockRead(stream2_syn, 2), 2731 CreateMockRead(stream2_syn, 2),
2602 CreateMockRead(stream3_syn, 3), 2732 CreateMockRead(stream3_syn, 4),
2603 CreateMockRead(stream1_body, 5), 2733 CreateMockRead(stream1_body, 6),
2604 CreateMockRead(stream2_body, 6), 2734 CreateMockRead(stream2_body, 7),
2605 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause 2735 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause
2606 }; 2736 };
2607 2737
2608 HttpResponseInfo response; 2738 HttpResponseInfo response;
2609 HttpResponseInfo response2; 2739 HttpResponseInfo response2;
2610 std::string expected_push_result("pushed"); 2740 std::string expected_push_result("pushed");
2611 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2741 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2612 RunServerPushTest(&data, 2742 RunServerPushTest(&data,
2613 &response, 2743 &response,
2614 &response2, 2744 &response2,
2615 expected_push_result); 2745 expected_push_result);
2616 2746
2617 // Verify the response headers. 2747 // Verify the response headers.
2618 EXPECT_TRUE(response.headers); 2748 EXPECT_TRUE(response.headers);
2619 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2749 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2620 2750
2621 // Verify the pushed stream. 2751 // Verify the pushed stream.
2622 EXPECT_TRUE(response2.headers); 2752 EXPECT_TRUE(response2.headers);
2623 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2753 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2624 } 2754 }
2625 2755
2626 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { 2756 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) {
2627 SpdySerializedFrame stream1_syn( 2757 SpdySerializedFrame stream1_syn(
2628 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2758 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2629 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2759 SpdySerializedFrame stream2_priority(
2760 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2630 MockWrite writes[] = { 2761 MockWrite writes[] = {
2631 CreateMockWrite(stream1_syn, 0), 2762 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
2632 }; 2763 };
2633 2764
2634 SpdySerializedFrame stream1_reply( 2765 SpdySerializedFrame stream1_reply(
2635 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2766 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2636 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2767 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2637 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2768 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2638 static const char kPushedData[] = "pushed my darling hello my baby"; 2769 static const char kPushedData[] = "pushed my darling hello my baby";
2639 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame( 2770 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame(
2640 2, kPushedData, strlen(kPushedData), true)); 2771 2, kPushedData, strlen(kPushedData), true));
2641 const size_t kChunkSize = strlen(kPushedData) / 4; 2772 const size_t kChunkSize = strlen(kPushedData) / 4;
2642 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize, 2773 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize,
2643 false); 2774 false);
2644 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize, 2775 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize,
2645 kChunkSize, false); 2776 kChunkSize, false);
2646 SpdySerializedFrame stream2_body3(stream2_body_base.data() + 2 * kChunkSize, 2777 SpdySerializedFrame stream2_body3(stream2_body_base.data() + 2 * kChunkSize,
2647 kChunkSize, false); 2778 kChunkSize, false);
2648 SpdySerializedFrame stream2_body4(stream2_body_base.data() + 3 * kChunkSize, 2779 SpdySerializedFrame stream2_body4(stream2_body_base.data() + 3 * kChunkSize,
2649 stream2_body_base.size() - 3 * kChunkSize, 2780 stream2_body_base.size() - 3 * kChunkSize,
2650 false); 2781 false);
2782 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2651 MockRead reads[] = { 2783 MockRead reads[] = {
2652 CreateMockRead(stream1_reply, 1), 2784 CreateMockRead(stream1_reply, 1),
2653 CreateMockRead(stream2_syn, 2), 2785 CreateMockRead(stream2_syn, 2),
2654 CreateMockRead(stream2_body1, 3), 2786 CreateMockRead(stream2_body1, 4),
2655 CreateMockRead(stream2_body2, 4), 2787 CreateMockRead(stream2_body2, 5),
2656 CreateMockRead(stream2_body3, 5), 2788 CreateMockRead(stream2_body3, 6),
2657 CreateMockRead(stream2_body4, 6), 2789 CreateMockRead(stream2_body4, 7),
2658 CreateMockRead(stream1_body, 7, SYNCHRONOUS), 2790 CreateMockRead(stream1_body, 8, SYNCHRONOUS),
2659 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause 2791 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 9), // Force a pause
2660 }; 2792 };
2661 2793
2662 HttpResponseInfo response; 2794 HttpResponseInfo response;
2663 HttpResponseInfo response2; 2795 HttpResponseInfo response2;
2664 std::string expected_push_result("pushed my darling hello my baby"); 2796 std::string expected_push_result("pushed my darling hello my baby");
2665 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2797 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2666 RunServerPushTest(&data, &response, &response2, kPushedData); 2798 RunServerPushTest(&data, &response, &response2, kPushedData);
2667 2799
2668 // Verify the response headers. 2800 // Verify the response headers.
2669 EXPECT_TRUE(response.headers); 2801 EXPECT_TRUE(response.headers);
2670 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2802 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2671 2803
2672 // Verify the pushed stream. 2804 // Verify the pushed stream.
2673 EXPECT_TRUE(response2.headers); 2805 EXPECT_TRUE(response2.headers);
2674 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2806 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2675 } 2807 }
2676 2808
2677 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { 2809 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
2678 SpdySerializedFrame stream1_syn( 2810 SpdySerializedFrame stream1_syn(
2679 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2811 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2680 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2812 SpdySerializedFrame stream2_priority(
2813 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2681 MockWrite writes[] = { 2814 MockWrite writes[] = {
2682 CreateMockWrite(stream1_syn, 0), 2815 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
2683 }; 2816 };
2684 2817
2685 SpdySerializedFrame stream1_reply( 2818 SpdySerializedFrame stream1_reply(
2686 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2819 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2687 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2820 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2688 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2821 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2689 static const char kPushedData[] = "pushed my darling hello my baby"; 2822 static const char kPushedData[] = "pushed my darling hello my baby";
2690 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame( 2823 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame(
2691 2, kPushedData, strlen(kPushedData), true)); 2824 2, kPushedData, strlen(kPushedData), true));
2692 const size_t kChunkSize = strlen(kPushedData) / 4; 2825 const size_t kChunkSize = strlen(kPushedData) / 4;
2693 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize, 2826 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize,
2694 false); 2827 false);
2695 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize, 2828 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize,
2696 kChunkSize, false); 2829 kChunkSize, false);
2697 SpdySerializedFrame stream2_body3(stream2_body_base.data() + 2 * kChunkSize, 2830 SpdySerializedFrame stream2_body3(stream2_body_base.data() + 2 * kChunkSize,
2698 kChunkSize, false); 2831 kChunkSize, false);
2699 SpdySerializedFrame stream2_body4(stream2_body_base.data() + 3 * kChunkSize, 2832 SpdySerializedFrame stream2_body4(stream2_body_base.data() + 3 * kChunkSize,
2700 stream2_body_base.size() - 3 * kChunkSize, 2833 stream2_body_base.size() - 3 * kChunkSize,
2701 false); 2834 false);
2835 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2702 MockRead reads[] = { 2836 MockRead reads[] = {
2703 CreateMockRead(stream1_reply, 1), 2837 CreateMockRead(stream1_reply, 1),
2704 CreateMockRead(stream2_syn, 2), 2838 CreateMockRead(stream2_syn, 2),
2705 CreateMockRead(stream2_body1, 3), 2839 CreateMockRead(stream2_body1, 4),
2706 CreateMockRead(stream2_body2, 4), 2840 CreateMockRead(stream2_body2, 5),
2707 CreateMockRead(stream2_body3, 5), 2841 CreateMockRead(stream2_body3, 6),
2708 CreateMockRead(stream2_body4, 6), 2842 CreateMockRead(stream2_body4, 7),
2709 CreateMockRead(stream1_body, 7, SYNCHRONOUS), 2843 CreateMockRead(stream1_body, 8, SYNCHRONOUS),
2710 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause. 2844 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 9) // Force a pause.
2711 }; 2845 };
2712 2846
2713 HttpResponseInfo response; 2847 HttpResponseInfo response;
2714 HttpResponseInfo response2; 2848 HttpResponseInfo response2;
2715 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2849 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2716 RunServerPushTest(&data, &response, &response2, kPushedData); 2850 RunServerPushTest(&data, &response, &response2, kPushedData);
2717 2851
2718 // Verify the response headers. 2852 // Verify the response headers.
2719 EXPECT_TRUE(response.headers); 2853 EXPECT_TRUE(response.headers);
2720 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2854 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2721 2855
2722 // Verify the pushed stream. 2856 // Verify the pushed stream.
2723 EXPECT_TRUE(response2.headers); 2857 EXPECT_TRUE(response2.headers);
2724 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2858 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2725 } 2859 }
2726 2860
2727 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { 2861 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
2728 SpdySerializedFrame stream1_syn( 2862 SpdySerializedFrame stream1_syn(
2729 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2863 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2730 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 2864 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
2731 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID).")); 2865 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID)."));
2732 MockWrite writes[] = { 2866 MockWrite writes[] = {
2733 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3), 2867 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3),
2734 }; 2868 };
2735 2869
2736 SpdySerializedFrame stream1_reply( 2870 SpdySerializedFrame stream1_reply(
2737 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2871 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2738 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2872 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2739 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); 2873 nullptr, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str()));
2740 MockRead reads[] = { 2874 MockRead reads[] = {
2741 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2875 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2742 }; 2876 };
2743 2877
2744 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2878 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2745 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2879 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2746 NetLogWithSource(), NULL); 2880 NetLogWithSource(), nullptr);
2747 2881
2748 helper.RunPreTestSetup(); 2882 helper.RunPreTestSetup();
2749 helper.AddData(&data); 2883 helper.AddData(&data);
2750 2884
2751 HttpNetworkTransaction* trans = helper.trans(); 2885 HttpNetworkTransaction* trans = helper.trans();
2752 2886
2753 // Start the transaction with basic parameters. 2887 // Start the transaction with basic parameters.
2754 TestCompletionCallback callback; 2888 TestCompletionCallback callback;
2755 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 2889 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
2756 NetLogWithSource()); 2890 NetLogWithSource());
(...skipping 18 matching lines...) Expand all
2775 SpdySerializedFrame stream1_syn( 2909 SpdySerializedFrame stream1_syn(
2776 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2910 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2777 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2911 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2778 SpdySerializedFrame stream2_rst( 2912 SpdySerializedFrame stream2_rst(
2779 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); 2913 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM));
2780 MockWrite writes[] = { 2914 MockWrite writes[] = {
2781 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), 2915 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3),
2782 }; 2916 };
2783 2917
2784 SpdySerializedFrame stream1_reply( 2918 SpdySerializedFrame stream1_reply(
2785 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2919 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2786 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2920 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2787 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); 2921 nullptr, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str()));
2788 MockRead reads[] = { 2922 MockRead reads[] = {
2789 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2923 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2790 CreateMockRead(stream1_body, 4), 2924 CreateMockRead(stream1_body, 4),
2791 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2925 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2792 }; 2926 };
2793 2927
2794 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2928 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2795 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2929 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2796 NetLogWithSource(), NULL); 2930 NetLogWithSource(), nullptr);
2797 2931
2798 helper.RunPreTestSetup(); 2932 helper.RunPreTestSetup();
2799 helper.AddData(&data); 2933 helper.AddData(&data);
2800 2934
2801 HttpNetworkTransaction* trans = helper.trans(); 2935 HttpNetworkTransaction* trans = helper.trans();
2802 2936
2803 // Start the transaction with basic parameters. 2937 // Start the transaction with basic parameters.
2804 TestCompletionCallback callback; 2938 TestCompletionCallback callback;
2805 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 2939 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
2806 NetLogWithSource()); 2940 NetLogWithSource());
(...skipping 18 matching lines...) Expand all
2825 SpdySerializedFrame stream1_syn( 2959 SpdySerializedFrame stream1_syn(
2826 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2960 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2827 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2961 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2828 SpdySerializedFrame stream2_rst( 2962 SpdySerializedFrame stream2_rst(
2829 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2963 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2830 MockWrite writes[] = { 2964 MockWrite writes[] = {
2831 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), 2965 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3),
2832 }; 2966 };
2833 2967
2834 SpdySerializedFrame stream1_reply( 2968 SpdySerializedFrame stream1_reply(
2835 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 2969 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2836 SpdyHeaderBlock incomplete_headers; 2970 SpdyHeaderBlock incomplete_headers;
2837 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK"; 2971 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK";
2838 incomplete_headers["hello"] = "bye"; 2972 incomplete_headers["hello"] = "bye";
2839 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 2973 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
2840 std::move(incomplete_headers), 2, 1)); 2974 std::move(incomplete_headers), 2, 1));
2841 MockRead reads[] = { 2975 MockRead reads[] = {
2842 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2976 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2843 CreateMockRead(stream1_body, 4), 2977 CreateMockRead(stream1_body, 4),
2844 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause 2978 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
2845 }; 2979 };
2846 2980
2847 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2981 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2848 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2982 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2849 NetLogWithSource(), NULL); 2983 NetLogWithSource(), nullptr);
2850 2984
2851 helper.RunPreTestSetup(); 2985 helper.RunPreTestSetup();
2852 helper.AddData(&data); 2986 helper.AddData(&data);
2853 2987
2854 HttpNetworkTransaction* trans = helper.trans(); 2988 HttpNetworkTransaction* trans = helper.trans();
2855 2989
2856 // Start the transaction with basic parameters. 2990 // Start the transaction with basic parameters.
2857 TestCompletionCallback callback; 2991 TestCompletionCallback callback;
2858 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 2992 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
2859 NetLogWithSource()); 2993 NetLogWithSource());
(...skipping 11 matching lines...) Expand all
2871 // Verify the response headers. 3005 // Verify the response headers.
2872 HttpResponseInfo response = *trans->GetResponseInfo(); 3006 HttpResponseInfo response = *trans->GetResponseInfo();
2873 EXPECT_TRUE(response.headers); 3007 EXPECT_TRUE(response.headers);
2874 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 3008 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2875 } 3009 }
2876 3010
2877 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY. 3011 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY.
2878 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) { 3012 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) {
2879 SpdySerializedFrame stream1_syn( 3013 SpdySerializedFrame stream1_syn(
2880 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3014 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3015 SpdySerializedFrame stream2_priority(
3016 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2881 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 3017 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
2882 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); 3018 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id."));
2883 MockWrite writes[] = { 3019 MockWrite writes[] = {
2884 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 4), 3020 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
3021 CreateMockWrite(goaway, 5),
2885 }; 3022 };
2886 3023
2887 SpdySerializedFrame stream1_reply( 3024 SpdySerializedFrame stream1_reply(
2888 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3025 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2889 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 3026 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2890 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 3027 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2891 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( 3028 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush(
2892 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); 3029 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str()));
2893 MockRead reads[] = { 3030 MockRead reads[] = {
2894 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 3031 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2895 CreateMockRead(stream3_syn, 3), 3032 CreateMockRead(stream3_syn, 4),
2896 }; 3033 };
2897 3034
2898 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3035 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2899 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3036 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2900 NetLogWithSource(), nullptr); 3037 NetLogWithSource(), nullptr);
2901 helper.RunToCompletion(&data); 3038 helper.RunToCompletion(&data);
2902 } 3039 }
2903 3040
2904 // PUSH_PROMISE on a closed client-initiated stream should trigger RST_STREAM. 3041 // PUSH_PROMISE on a closed client-initiated stream should trigger RST_STREAM.
2905 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedStream) { 3042 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedStream) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2945 EXPECT_TRUE(data.AllReadDataConsumed()); 3082 EXPECT_TRUE(data.AllReadDataConsumed());
2946 EXPECT_TRUE(data.AllWriteDataConsumed()); 3083 EXPECT_TRUE(data.AllWriteDataConsumed());
2947 VerifyStreamsClosed(helper); 3084 VerifyStreamsClosed(helper);
2948 } 3085 }
2949 3086
2950 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY even if 3087 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY even if
2951 // stream is closed. 3088 // stream is closed.
2952 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) { 3089 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) {
2953 SpdySerializedFrame stream1_syn( 3090 SpdySerializedFrame stream1_syn(
2954 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3091 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3092 SpdySerializedFrame stream2_priority(
3093 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
2955 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 3094 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
2956 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); 3095 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id."));
2957 MockWrite writes[] = { 3096 MockWrite writes[] = {
2958 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 7), 3097 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
3098 CreateMockWrite(goaway, 8),
2959 }; 3099 };
2960 3100
2961 SpdySerializedFrame stream1_reply( 3101 SpdySerializedFrame stream1_reply(
2962 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 3102 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2963 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 3103 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2964 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 3104 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2965 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 3105 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2966 const char kPushedData[] = "pushed"; 3106 const char kPushedData[] = "pushed";
2967 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 3107 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2968 2, kPushedData, strlen(kPushedData), true)); 3108 2, kPushedData, strlen(kPushedData), true));
2969 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( 3109 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush(
2970 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); 3110 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str()));
2971 3111
2972 MockRead reads[] = { 3112 MockRead reads[] = {
2973 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 3113 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2974 CreateMockRead(stream1_body, 3), CreateMockRead(stream2_body, 4), 3114 CreateMockRead(stream1_body, 4), CreateMockRead(stream2_body, 5),
2975 MockRead(ASYNC, ERR_IO_PENDING, 5), CreateMockRead(stream3_syn, 6), 3115 MockRead(ASYNC, ERR_IO_PENDING, 6), CreateMockRead(stream3_syn, 7),
2976 }; 3116 };
2977 3117
2978 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3118 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2979 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3119 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2980 NetLogWithSource(), nullptr); 3120 NetLogWithSource(), nullptr);
2981 helper.RunPreTestSetup(); 3121 helper.RunPreTestSetup();
2982 helper.AddData(&data); 3122 helper.AddData(&data);
2983 3123
2984 HttpNetworkTransaction* trans1 = helper.trans(); 3124 HttpNetworkTransaction* trans1 = helper.trans();
2985 TestCompletionCallback callback1; 3125 TestCompletionCallback callback1;
(...skipping 24 matching lines...) Expand all
3010 EXPECT_TRUE(data.AllReadDataConsumed()); 3150 EXPECT_TRUE(data.AllReadDataConsumed());
3011 EXPECT_TRUE(data.AllWriteDataConsumed()); 3151 EXPECT_TRUE(data.AllWriteDataConsumed());
3012 } 3152 }
3013 3153
3014 // Verify that various response headers parse correctly through the HTTP layer. 3154 // Verify that various response headers parse correctly through the HTTP layer.
3015 TEST_F(SpdyNetworkTransactionTest, ResponseHeaders) { 3155 TEST_F(SpdyNetworkTransactionTest, ResponseHeaders) {
3016 struct ResponseHeadersTests { 3156 struct ResponseHeadersTests {
3017 int num_headers; 3157 int num_headers;
3018 const char* extra_headers[5]; 3158 const char* extra_headers[5];
3019 SpdyHeaderBlock expected_headers; 3159 SpdyHeaderBlock expected_headers;
3020 } test_cases[] = { 3160 } test_cases[] = {// This uses a multi-valued cookie header.
3021 // This uses a multi-valued cookie header. 3161 {
3022 { 2, 3162 2,
3023 { "cookie", "val1", 3163 {"cookie", "val1", "cookie",
3024 "cookie", "val2", // will get appended separated by NULL 3164 "val2", // will get appended separated by nullptr
3025 NULL 3165 nullptr},
3026 }, 3166 },
3027 }, 3167 // This is the minimalist set of headers.
3028 // This is the minimalist set of headers. 3168 {
3029 { 0, 3169 0, {nullptr},
3030 { NULL }, 3170 },
3031 }, 3171 // Headers with a comma separated list.
3032 // Headers with a comma separated list. 3172 {
3033 { 1, 3173 1, {"cookie", "val1,val2", nullptr},
3034 { "cookie", "val1,val2", 3174 }};
3035 NULL
3036 },
3037 }
3038 };
3039 3175
3040 test_cases[0].expected_headers["status"] = "200"; 3176 test_cases[0].expected_headers["status"] = "200";
3041 test_cases[1].expected_headers["status"] = "200"; 3177 test_cases[1].expected_headers["status"] = "200";
3042 test_cases[2].expected_headers["status"] = "200"; 3178 test_cases[2].expected_headers["status"] = "200";
3043 3179
3044 test_cases[0].expected_headers["hello"] = "bye"; 3180 test_cases[0].expected_headers["hello"] = "bye";
3045 test_cases[1].expected_headers["hello"] = "bye"; 3181 test_cases[1].expected_headers["hello"] = "bye";
3046 test_cases[2].expected_headers["hello"] = "bye"; 3182 test_cases[2].expected_headers["hello"] = "bye";
3047 3183
3048 test_cases[0].expected_headers["cookie"] = base::StringPiece("val1\0val2", 9); 3184 test_cases[0].expected_headers["cookie"] = base::StringPiece("val1\0val2", 9);
3049 test_cases[2].expected_headers["cookie"] = "val1,val2"; 3185 test_cases[2].expected_headers["cookie"] = "val1,val2";
3050 3186
3051 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3187 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3052 SpdyTestUtil spdy_test_util; 3188 SpdyTestUtil spdy_test_util;
3053 SpdySerializedFrame req( 3189 SpdySerializedFrame req(
3054 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3190 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3055 MockWrite writes[] = {CreateMockWrite(req, 0)}; 3191 MockWrite writes[] = {CreateMockWrite(req, 0)};
3056 3192
3057 SpdySerializedFrame resp(spdy_test_util.ConstructSpdyGetReply( 3193 SpdySerializedFrame resp(spdy_test_util.ConstructSpdyGetReply(
3058 test_cases[i].extra_headers, test_cases[i].num_headers, 1)); 3194 test_cases[i].extra_headers, test_cases[i].num_headers, 1));
3059 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); 3195 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true));
3060 MockRead reads[] = { 3196 MockRead reads[] = {
3061 CreateMockRead(resp, 1), CreateMockRead(body, 2), 3197 CreateMockRead(resp, 1), CreateMockRead(body, 2),
3062 MockRead(ASYNC, 0, 3) // EOF 3198 MockRead(ASYNC, 0, 3) // EOF
3063 }; 3199 };
3064 3200
3065 SequencedSocketData data(reads, arraysize(reads), writes, 3201 SequencedSocketData data(reads, arraysize(reads), writes,
3066 arraysize(writes)); 3202 arraysize(writes));
3067 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3203 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3068 NetLogWithSource(), NULL); 3204 NetLogWithSource(), nullptr);
3069 helper.RunToCompletion(&data); 3205 helper.RunToCompletion(&data);
3070 TransactionHelperResult out = helper.output(); 3206 TransactionHelperResult out = helper.output();
3071 3207
3072 EXPECT_THAT(out.rv, IsOk()); 3208 EXPECT_THAT(out.rv, IsOk());
3073 EXPECT_EQ("HTTP/1.1 200", out.status_line); 3209 EXPECT_EQ("HTTP/1.1 200", out.status_line);
3074 EXPECT_EQ("hello!", out.response_data); 3210 EXPECT_EQ("hello!", out.response_data);
3075 3211
3076 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers; 3212 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers;
3077 EXPECT_TRUE(headers); 3213 EXPECT_TRUE(headers);
3078 size_t iter = 0; 3214 size_t iter = 0;
(...skipping 20 matching lines...) Expand all
3099 // Modify the following data to change/add test cases: 3235 // Modify the following data to change/add test cases:
3100 struct ResponseTests { 3236 struct ResponseTests {
3101 bool vary_matches; 3237 bool vary_matches;
3102 int num_headers[2]; 3238 int num_headers[2];
3103 const char* extra_headers[2][16]; 3239 const char* extra_headers[2][16];
3104 } test_cases[] = { 3240 } test_cases[] = {
3105 // Test the case of a multi-valued cookie. When the value is delimited 3241 // Test the case of a multi-valued cookie. When the value is delimited
3106 // with NUL characters, it needs to be unfolded into multiple headers. 3242 // with NUL characters, it needs to be unfolded into multiple headers.
3107 {true, 3243 {true,
3108 {1, 3}, 3244 {1, 3},
3109 {{"cookie", "val1,val2", NULL}, 3245 {{"cookie", "val1,val2", nullptr},
3110 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(), 3246 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(),
3111 "/index.php", "vary", "cookie", NULL}}}, 3247 "/index.php", "vary", "cookie", nullptr}}},
3112 {// Multiple vary fields. 3248 {// Multiple vary fields.
3113 true, 3249 true,
3114 {2, 4}, 3250 {2, 4},
3115 {{"friend", "barney", "enemy", "snaggletooth", NULL}, 3251 {{"friend", "barney", "enemy", "snaggletooth", nullptr},
3116 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(), 3252 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(),
3117 "/index.php", "vary", "friend", "vary", "enemy", NULL}}}, 3253 "/index.php", "vary", "friend", "vary", "enemy", nullptr}}},
3118 {// Test a '*' vary field. 3254 {// Test a '*' vary field.
3119 false, 3255 false,
3120 {1, 3}, 3256 {1, 3},
3121 {{"cookie", "val1,val2", NULL}, 3257 {{"cookie", "val1,val2", nullptr},
3122 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(), 3258 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(),
3123 "/index.php", "vary", "*", NULL}}}, 3259 "/index.php", "vary", "*", nullptr}}},
3124 {// Multiple comma-separated vary fields. 3260 {// Multiple comma-separated vary fields.
3125 true, 3261 true,
3126 {2, 3}, 3262 {2, 3},
3127 {{"friend", "barney", "enemy", "snaggletooth", NULL}, 3263 {{"friend", "barney", "enemy", "snaggletooth", nullptr},
3128 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(), 3264 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(),
3129 "/index.php", "vary", "friend,enemy", NULL}}}}; 3265 "/index.php", "vary", "friend,enemy", nullptr}}}};
3130 3266
3131 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3267 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3132 SpdyTestUtil spdy_test_util; 3268 SpdyTestUtil spdy_test_util;
3133 3269
3134 // Construct the request. 3270 // Construct the request.
3135 SpdySerializedFrame frame_req(spdy_test_util.ConstructSpdyGet( 3271 SpdySerializedFrame frame_req(spdy_test_util.ConstructSpdyGet(
3136 test_cases[i].extra_headers[0], test_cases[i].num_headers[0], 1, LOWEST, 3272 test_cases[i].extra_headers[0], test_cases[i].num_headers[0], 1, LOWEST,
3137 true)); 3273 true));
3138 3274
3139 MockWrite writes[] = { 3275 MockWrite writes[] = {
(...skipping 24 matching lines...) Expand all
3164 HttpRequestInfo request = CreateGetRequest(); 3300 HttpRequestInfo request = CreateGetRequest();
3165 for (int ct = 0; ct < header_count; ct++) { 3301 for (int ct = 0; ct < header_count; ct++) {
3166 const char* header_key = test_cases[i].extra_headers[0][ct * 2]; 3302 const char* header_key = test_cases[i].extra_headers[0][ct * 2];
3167 const char* header_value = test_cases[i].extra_headers[0][ct * 2 + 1]; 3303 const char* header_value = test_cases[i].extra_headers[0][ct * 2 + 1];
3168 request.extra_headers.SetHeader(header_key, header_value); 3304 request.extra_headers.SetHeader(header_key, header_value);
3169 } 3305 }
3170 3306
3171 SequencedSocketData data(reads, arraysize(reads), writes, 3307 SequencedSocketData data(reads, arraysize(reads), writes,
3172 arraysize(writes)); 3308 arraysize(writes));
3173 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 3309 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
3174 NetLogWithSource(), NULL); 3310 NetLogWithSource(), nullptr);
3175 helper.RunToCompletion(&data); 3311 helper.RunToCompletion(&data);
3176 TransactionHelperResult out = helper.output(); 3312 TransactionHelperResult out = helper.output();
3177 3313
3178 EXPECT_EQ(OK, out.rv) << i; 3314 EXPECT_EQ(OK, out.rv) << i;
3179 EXPECT_EQ("HTTP/1.1 200", out.status_line) << i; 3315 EXPECT_EQ("HTTP/1.1 200", out.status_line) << i;
3180 EXPECT_EQ("hello!", out.response_data) << i; 3316 EXPECT_EQ("hello!", out.response_data) << i;
3181 3317
3182 // Test the response information. 3318 // Test the response information.
3183 EXPECT_EQ(out.response_info.vary_data.is_valid(), 3319 EXPECT_EQ(out.response_info.vary_data.is_valid(),
3184 test_cases[i].vary_matches) << i; 3320 test_cases[i].vary_matches) << i;
(...skipping 17 matching lines...) Expand all
3202 // Verify that we don't crash on invalid response headers. 3338 // Verify that we don't crash on invalid response headers.
3203 TEST_F(SpdyNetworkTransactionTest, InvalidResponseHeaders) { 3339 TEST_F(SpdyNetworkTransactionTest, InvalidResponseHeaders) {
3204 struct InvalidResponseHeadersTests { 3340 struct InvalidResponseHeadersTests {
3205 int num_headers; 3341 int num_headers;
3206 const char* headers[10]; 3342 const char* headers[10];
3207 } test_cases[] = { 3343 } test_cases[] = {
3208 // Response headers missing status header 3344 // Response headers missing status header
3209 { 3345 {
3210 3, 3346 3,
3211 {spdy_util_.GetPathKey(), "/index.php", "cookie", "val1", "cookie", 3347 {spdy_util_.GetPathKey(), "/index.php", "cookie", "val1", "cookie",
3212 "val2", NULL}, 3348 "val2", nullptr},
3213 }, 3349 },
3214 // Response headers missing version header 3350 // Response headers missing version header
3215 { 3351 {
3216 1, {spdy_util_.GetPathKey(), "/index.php", "status", "200", NULL}, 3352 1, {spdy_util_.GetPathKey(), "/index.php", "status", "200", nullptr},
3217 }, 3353 },
3218 // Response headers with no headers 3354 // Response headers with no headers
3219 { 3355 {
3220 0, {NULL}, 3356 0, {nullptr},
3221 }, 3357 },
3222 }; 3358 };
3223 3359
3224 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3360 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3225 SpdyTestUtil spdy_test_util; 3361 SpdyTestUtil spdy_test_util;
3226 3362
3227 SpdySerializedFrame req( 3363 SpdySerializedFrame req(
3228 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3364 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3229 SpdySerializedFrame rst( 3365 SpdySerializedFrame rst(
3230 spdy_test_util.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 3366 spdy_test_util.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
3231 MockWrite writes[] = { 3367 MockWrite writes[] = {
3232 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), 3368 CreateMockWrite(req, 0), CreateMockWrite(rst, 2),
3233 }; 3369 };
3234 3370
3235 // Construct the reply. 3371 // Construct the reply.
3236 SpdyHeaderBlock reply_headers; 3372 SpdyHeaderBlock reply_headers;
3237 AppendToHeaderBlock( 3373 AppendToHeaderBlock(
3238 test_cases[i].headers, test_cases[i].num_headers, &reply_headers); 3374 test_cases[i].headers, test_cases[i].num_headers, &reply_headers);
3239 SpdySerializedFrame resp( 3375 SpdySerializedFrame resp(
3240 spdy_test_util.ConstructSpdyReply(1, std::move(reply_headers))); 3376 spdy_test_util.ConstructSpdyReply(1, std::move(reply_headers)));
3241 MockRead reads[] = { 3377 MockRead reads[] = {
3242 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3) // EOF 3378 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3) // EOF
3243 }; 3379 };
3244 3380
3245 SequencedSocketData data(reads, arraysize(reads), writes, 3381 SequencedSocketData data(reads, arraysize(reads), writes,
3246 arraysize(writes)); 3382 arraysize(writes));
3247 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3383 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3248 NetLogWithSource(), NULL); 3384 NetLogWithSource(), nullptr);
3249 helper.RunToCompletion(&data); 3385 helper.RunToCompletion(&data);
3250 TransactionHelperResult out = helper.output(); 3386 TransactionHelperResult out = helper.output();
3251 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); 3387 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
3252 } 3388 }
3253 } 3389 }
3254 3390
3255 TEST_F(SpdyNetworkTransactionTest, CorruptFrameSessionError) { 3391 TEST_F(SpdyNetworkTransactionTest, CorruptFrameSessionError) {
3256 SpdySerializedFrame req( 3392 SpdySerializedFrame req(
3257 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3393 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3258 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 3394 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
3259 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE).")); 3395 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE)."));
3260 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; 3396 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)};
3261 3397
3262 // This is the length field that's too short. 3398 // This is the length field that's too short.
3263 SpdySerializedFrame reply_wrong_length( 3399 SpdySerializedFrame reply_wrong_length(
3264 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 3400 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3265 size_t right_size = reply_wrong_length.size() - kFrameHeaderSize; 3401 size_t right_size = reply_wrong_length.size() - kFrameHeaderSize;
3266 size_t wrong_size = right_size - 4; 3402 size_t wrong_size = right_size - 4;
3267 test::SetFrameLength(&reply_wrong_length, wrong_size); 3403 test::SetFrameLength(&reply_wrong_length, wrong_size);
3268 3404
3269 MockRead reads[] = { 3405 MockRead reads[] = {
3270 MockRead(ASYNC, reply_wrong_length.data(), reply_wrong_length.size() - 4, 3406 MockRead(ASYNC, reply_wrong_length.data(), reply_wrong_length.size() - 4,
3271 1), 3407 1),
3272 }; 3408 };
3273 3409
3274 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3410 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3275 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3411 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3276 NetLogWithSource(), NULL); 3412 NetLogWithSource(), nullptr);
3277 helper.RunToCompletion(&data); 3413 helper.RunToCompletion(&data);
3278 TransactionHelperResult out = helper.output(); 3414 TransactionHelperResult out = helper.output();
3279 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR)); 3415 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR));
3280 } 3416 }
3281 3417
3282 TEST_F(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) { 3418 TEST_F(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) {
3283 SpdySerializedFrame req( 3419 SpdySerializedFrame req(
3284 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3420 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3285 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 3421 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
3286 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE).")); 3422 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE)."));
3287 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; 3423 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)};
3288 3424
3289 // Read HEADERS with corrupted payload. 3425 // Read HEADERS with corrupted payload.
3290 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3426 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3291 memset(resp.data() + 12, 0xcf, resp.size() - 12); 3427 memset(resp.data() + 12, 0xcf, resp.size() - 12);
3292 MockRead reads[] = {CreateMockRead(resp, 1)}; 3428 MockRead reads[] = {CreateMockRead(resp, 1)};
3293 3429
3294 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3430 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3295 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3431 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3296 NetLogWithSource(), NULL); 3432 NetLogWithSource(), nullptr);
3297 helper.RunToCompletion(&data); 3433 helper.RunToCompletion(&data);
3298 TransactionHelperResult out = helper.output(); 3434 TransactionHelperResult out = helper.output();
3299 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR)); 3435 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR));
3300 } 3436 }
3301 3437
3302 TEST_F(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) { 3438 TEST_F(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) {
3303 SpdySerializedFrame req( 3439 SpdySerializedFrame req(
3304 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3440 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3305 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 3441 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
3306 0, GOAWAY_FRAME_SIZE_ERROR, 3442 0, GOAWAY_FRAME_SIZE_ERROR,
3307 "Framer error: 15 (INVALID_CONTROL_FRAME_SIZE).")); 3443 "Framer error: 15 (INVALID_CONTROL_FRAME_SIZE)."));
3308 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; 3444 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)};
3309 3445
3310 // Read WINDOW_UPDATE with incorrectly-sized payload. 3446 // Read WINDOW_UPDATE with incorrectly-sized payload.
3311 SpdySerializedFrame bad_window_update( 3447 SpdySerializedFrame bad_window_update(
3312 spdy_util_.ConstructSpdyWindowUpdate(1, 1)); 3448 spdy_util_.ConstructSpdyWindowUpdate(1, 1));
3313 test::SetFrameLength(&bad_window_update, bad_window_update.size() - 1); 3449 test::SetFrameLength(&bad_window_update, bad_window_update.size() - 1);
3314 MockRead reads[] = {CreateMockRead(bad_window_update, 1)}; 3450 MockRead reads[] = {CreateMockRead(bad_window_update, 1)};
3315 3451
3316 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3452 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3317 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3453 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3318 NetLogWithSource(), NULL); 3454 NetLogWithSource(), nullptr);
3319 helper.RunToCompletion(&data); 3455 helper.RunToCompletion(&data);
3320 TransactionHelperResult out = helper.output(); 3456 TransactionHelperResult out = helper.output();
3321 EXPECT_THAT(out.rv, IsError(ERR_SPDY_FRAME_SIZE_ERROR)); 3457 EXPECT_THAT(out.rv, IsError(ERR_SPDY_FRAME_SIZE_ERROR));
3322 } 3458 }
3323 3459
3324 // Test that we shutdown correctly on write errors. 3460 // Test that we shutdown correctly on write errors.
3325 TEST_F(SpdyNetworkTransactionTest, WriteError) { 3461 TEST_F(SpdyNetworkTransactionTest, WriteError) {
3326 SpdySerializedFrame req( 3462 SpdySerializedFrame req(
3327 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3463 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3328 MockWrite writes[] = { 3464 MockWrite writes[] = {
3329 // We'll write 10 bytes successfully 3465 // We'll write 10 bytes successfully
3330 MockWrite(ASYNC, req.data(), 10, 1), 3466 MockWrite(ASYNC, req.data(), 10, 1),
3331 // Followed by ERROR! 3467 // Followed by ERROR!
3332 MockWrite(ASYNC, ERR_FAILED, 2), 3468 MockWrite(ASYNC, ERR_FAILED, 2),
3333 // Session drains and attempts to write a GOAWAY: Another ERROR! 3469 // Session drains and attempts to write a GOAWAY: Another ERROR!
3334 MockWrite(ASYNC, ERR_FAILED, 3), 3470 MockWrite(ASYNC, ERR_FAILED, 3),
3335 }; 3471 };
3336 3472
3337 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; 3473 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3338 3474
3339 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3475 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3340 3476
3341 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3477 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3342 NetLogWithSource(), NULL); 3478 NetLogWithSource(), nullptr);
3343 helper.RunPreTestSetup(); 3479 helper.RunPreTestSetup();
3344 helper.AddData(&data); 3480 helper.AddData(&data);
3345 EXPECT_TRUE(helper.StartDefaultTest()); 3481 EXPECT_TRUE(helper.StartDefaultTest());
3346 helper.FinishDefaultTest(); 3482 helper.FinishDefaultTest();
3347 EXPECT_TRUE(data.AllWriteDataConsumed()); 3483 EXPECT_TRUE(data.AllWriteDataConsumed());
3348 EXPECT_TRUE(data.AllReadDataConsumed()); 3484 EXPECT_TRUE(data.AllReadDataConsumed());
3349 TransactionHelperResult out = helper.output(); 3485 TransactionHelperResult out = helper.output();
3350 EXPECT_THAT(out.rv, IsError(ERR_FAILED)); 3486 EXPECT_THAT(out.rv, IsError(ERR_FAILED));
3351 } 3487 }
3352 3488
3353 // Test that partial writes work. 3489 // Test that partial writes work.
3354 TEST_F(SpdyNetworkTransactionTest, PartialWrite) { 3490 TEST_F(SpdyNetworkTransactionTest, PartialWrite) {
3355 // Chop the HEADERS frame into 5 chunks. 3491 // Chop the HEADERS frame into 5 chunks.
3356 SpdySerializedFrame req( 3492 SpdySerializedFrame req(
3357 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3493 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3358 const int kChunks = 5; 3494 const int kChunks = 5;
3359 std::unique_ptr<MockWrite[]> writes(ChopWriteFrame(req, kChunks)); 3495 std::unique_ptr<MockWrite[]> writes(ChopWriteFrame(req, kChunks));
3360 for (int i = 0; i < kChunks; ++i) { 3496 for (int i = 0; i < kChunks; ++i) {
3361 writes[i].sequence_number = i; 3497 writes[i].sequence_number = i;
3362 } 3498 }
3363 3499
3364 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3500 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3365 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 3501 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
3366 MockRead reads[] = { 3502 MockRead reads[] = {
3367 CreateMockRead(resp, kChunks), CreateMockRead(body, kChunks + 1), 3503 CreateMockRead(resp, kChunks), CreateMockRead(body, kChunks + 1),
3368 MockRead(ASYNC, 0, kChunks + 2) // EOF 3504 MockRead(ASYNC, 0, kChunks + 2) // EOF
3369 }; 3505 };
3370 3506
3371 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks); 3507 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks);
3372 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3508 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3373 NetLogWithSource(), NULL); 3509 NetLogWithSource(), nullptr);
3374 helper.RunToCompletion(&data); 3510 helper.RunToCompletion(&data);
3375 TransactionHelperResult out = helper.output(); 3511 TransactionHelperResult out = helper.output();
3376 EXPECT_THAT(out.rv, IsOk()); 3512 EXPECT_THAT(out.rv, IsOk());
3377 EXPECT_EQ("HTTP/1.1 200", out.status_line); 3513 EXPECT_EQ("HTTP/1.1 200", out.status_line);
3378 EXPECT_EQ("hello!", out.response_data); 3514 EXPECT_EQ("hello!", out.response_data);
3379 } 3515 }
3380 3516
3381 // Test that the NetLog contains good data for a simple GET request. 3517 // Test that the NetLog contains good data for a simple GET request.
3382 TEST_F(SpdyNetworkTransactionTest, NetLog) { 3518 TEST_F(SpdyNetworkTransactionTest, NetLog) {
3383 static const char* const kExtraHeaders[] = { 3519 static const char* const kExtraHeaders[] = {
3384 "user-agent", "Chrome", 3520 "user-agent", "Chrome",
3385 }; 3521 };
3386 SpdySerializedFrame req( 3522 SpdySerializedFrame req(
3387 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, 1, LOWEST, true)); 3523 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, 1, LOWEST, true));
3388 MockWrite writes[] = {CreateMockWrite(req, 0)}; 3524 MockWrite writes[] = {CreateMockWrite(req, 0)};
3389 3525
3390 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3526 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3391 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 3527 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
3392 MockRead reads[] = { 3528 MockRead reads[] = {
3393 CreateMockRead(resp, 1), CreateMockRead(body, 2), 3529 CreateMockRead(resp, 1), CreateMockRead(body, 2),
3394 MockRead(ASYNC, 0, 3) // EOF 3530 MockRead(ASYNC, 0, 3) // EOF
3395 }; 3531 };
3396 3532
3397 BoundTestNetLog log; 3533 BoundTestNetLog log;
3398 3534
3399 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3535 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3400 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(), 3536 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(),
3401 DEFAULT_PRIORITY, log.bound(), NULL); 3537 DEFAULT_PRIORITY, log.bound(), nullptr);
3402 helper.RunToCompletion(&data); 3538 helper.RunToCompletion(&data);
3403 TransactionHelperResult out = helper.output(); 3539 TransactionHelperResult out = helper.output();
3404 EXPECT_THAT(out.rv, IsOk()); 3540 EXPECT_THAT(out.rv, IsOk());
3405 EXPECT_EQ("HTTP/1.1 200", out.status_line); 3541 EXPECT_EQ("HTTP/1.1 200", out.status_line);
3406 EXPECT_EQ("hello!", out.response_data); 3542 EXPECT_EQ("hello!", out.response_data);
3407 3543
3408 // Check that the NetLog was filled reasonably. 3544 // Check that the NetLog was filled reasonably.
3409 // This test is intentionally non-specific about the exact ordering of the 3545 // This test is intentionally non-specific about the exact ordering of the
3410 // log; instead we just check to make sure that certain events exist, and that 3546 // log; instead we just check to make sure that certain events exist, and that
3411 // they are in the right order. 3547 // they are in the right order.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
3477 const SpdySerializedFrame* data_frames[2] = { 3613 const SpdySerializedFrame* data_frames[2] = {
3478 &data_frame_1, &data_frame_2, 3614 &data_frame_1, &data_frame_2,
3479 }; 3615 };
3480 char combined_data_frames[100]; 3616 char combined_data_frames[100];
3481 int combined_data_frames_len = 3617 int combined_data_frames_len =
3482 CombineFrames(data_frames, arraysize(data_frames), 3618 CombineFrames(data_frames, arraysize(data_frames),
3483 combined_data_frames, arraysize(combined_data_frames)); 3619 combined_data_frames, arraysize(combined_data_frames));
3484 SpdySerializedFrame last_frame( 3620 SpdySerializedFrame last_frame(
3485 spdy_util_.ConstructSpdyDataFrame(1, "d", 1, /*fin=*/true)); 3621 spdy_util_.ConstructSpdyDataFrame(1, "d", 1, /*fin=*/true));
3486 3622
3487 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3623 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3488 MockRead reads[] = { 3624 MockRead reads[] = {
3489 CreateMockRead(resp, 1), 3625 CreateMockRead(resp, 1),
3490 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 3626 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
3491 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 3627 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3492 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 3628 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause
3493 CreateMockRead(last_frame, 5), 3629 CreateMockRead(last_frame, 5),
3494 MockRead(ASYNC, 0, 6) // EOF 3630 MockRead(ASYNC, 0, 6) // EOF
3495 }; 3631 };
3496 3632
3497 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3633 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3498 3634
3499 TestCompletionCallback callback; 3635 TestCompletionCallback callback;
3500 3636
3501 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3637 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3502 NetLogWithSource(), NULL); 3638 NetLogWithSource(), nullptr);
3503 helper.RunPreTestSetup(); 3639 helper.RunPreTestSetup();
3504 helper.AddData(&data); 3640 helper.AddData(&data);
3505 HttpNetworkTransaction* trans = helper.trans(); 3641 HttpNetworkTransaction* trans = helper.trans();
3506 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 3642 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
3507 NetLogWithSource()); 3643 NetLogWithSource());
3508 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 3644 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3509 3645
3510 TransactionHelperResult out = helper.output(); 3646 TransactionHelperResult out = helper.output();
3511 out.rv = callback.WaitForResult(); 3647 out.rv = callback.WaitForResult();
3512 EXPECT_EQ(out.rv, OK); 3648 EXPECT_EQ(out.rv, OK);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3564 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); 3700 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false));
3565 SpdySerializedFrame data_frame_fin( 3701 SpdySerializedFrame data_frame_fin(
3566 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true)); 3702 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true));
3567 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame, 3703 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame,
3568 &data_frame, &data_frame_fin}; 3704 &data_frame, &data_frame_fin};
3569 char combined_data_frames[100]; 3705 char combined_data_frames[100];
3570 int combined_data_frames_len = 3706 int combined_data_frames_len =
3571 CombineFrames(data_frames, arraysize(data_frames), 3707 CombineFrames(data_frames, arraysize(data_frames),
3572 combined_data_frames, arraysize(combined_data_frames)); 3708 combined_data_frames, arraysize(combined_data_frames));
3573 3709
3574 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3710 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3575 MockRead reads[] = { 3711 MockRead reads[] = {
3576 CreateMockRead(resp, 1), 3712 CreateMockRead(resp, 1),
3577 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 3713 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
3578 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 3714 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3579 MockRead(ASYNC, 0, 4) // EOF 3715 MockRead(ASYNC, 0, 4) // EOF
3580 }; 3716 };
3581 3717
3582 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3718 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3583 3719
3584 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3720 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3585 NetLogWithSource(), NULL); 3721 NetLogWithSource(), nullptr);
3586 helper.RunPreTestSetup(); 3722 helper.RunPreTestSetup();
3587 helper.AddData(&data); 3723 helper.AddData(&data);
3588 HttpNetworkTransaction* trans = helper.trans(); 3724 HttpNetworkTransaction* trans = helper.trans();
3589 3725
3590 TestCompletionCallback callback; 3726 TestCompletionCallback callback;
3591 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 3727 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
3592 NetLogWithSource()); 3728 NetLogWithSource());
3593 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 3729 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3594 3730
3595 TransactionHelperResult out = helper.output(); 3731 TransactionHelperResult out = helper.output();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3641 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 3777 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
3642 } 3778 }
3643 3779
3644 // Verify the case where we buffer data but read it after it has been buffered. 3780 // Verify the case where we buffer data but read it after it has been buffered.
3645 TEST_F(SpdyNetworkTransactionTest, BufferedAll) { 3781 TEST_F(SpdyNetworkTransactionTest, BufferedAll) {
3646 SpdySerializedFrame req( 3782 SpdySerializedFrame req(
3647 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3783 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3648 MockWrite writes[] = {CreateMockWrite(req, 0)}; 3784 MockWrite writes[] = {CreateMockWrite(req, 0)};
3649 3785
3650 // 5 data frames in a single read. 3786 // 5 data frames in a single read.
3651 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3787 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3652 SpdySerializedFrame data_frame( 3788 SpdySerializedFrame data_frame(
3653 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); 3789 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false));
3654 SpdySerializedFrame data_frame_fin( 3790 SpdySerializedFrame data_frame_fin(
3655 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true)); 3791 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true));
3656 const SpdySerializedFrame* frames[5] = {&reply, &data_frame, &data_frame, 3792 const SpdySerializedFrame* frames[5] = {&reply, &data_frame, &data_frame,
3657 &data_frame, &data_frame_fin}; 3793 &data_frame, &data_frame_fin};
3658 char combined_frames[200]; 3794 char combined_frames[200];
3659 int combined_frames_len = 3795 int combined_frames_len =
3660 CombineFrames(frames, arraysize(frames), 3796 CombineFrames(frames, arraysize(frames),
3661 combined_frames, arraysize(combined_frames)); 3797 combined_frames, arraysize(combined_frames));
3662 3798
3663 MockRead reads[] = { 3799 MockRead reads[] = {
3664 MockRead(ASYNC, combined_frames, combined_frames_len, 1), 3800 MockRead(ASYNC, combined_frames, combined_frames_len, 1),
3665 MockRead(ASYNC, 0, 2) // EOF 3801 MockRead(ASYNC, 0, 2) // EOF
3666 }; 3802 };
3667 3803
3668 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3804 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3669 3805
3670 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3806 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3671 NetLogWithSource(), NULL); 3807 NetLogWithSource(), nullptr);
3672 helper.RunPreTestSetup(); 3808 helper.RunPreTestSetup();
3673 helper.AddData(&data); 3809 helper.AddData(&data);
3674 HttpNetworkTransaction* trans = helper.trans(); 3810 HttpNetworkTransaction* trans = helper.trans();
3675 3811
3676 TestCompletionCallback callback; 3812 TestCompletionCallback callback;
3677 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 3813 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
3678 NetLogWithSource()); 3814 NetLogWithSource());
3679 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 3815 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3680 3816
3681 TransactionHelperResult out = helper.output(); 3817 TransactionHelperResult out = helper.output();
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
3732 // All data frames in a single read. 3868 // All data frames in a single read.
3733 // NOTE: We don't FIN the stream. 3869 // NOTE: We don't FIN the stream.
3734 SpdySerializedFrame data_frame( 3870 SpdySerializedFrame data_frame(
3735 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); 3871 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false));
3736 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame, 3872 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame,
3737 &data_frame, &data_frame}; 3873 &data_frame, &data_frame};
3738 char combined_data_frames[100]; 3874 char combined_data_frames[100];
3739 int combined_data_frames_len = 3875 int combined_data_frames_len =
3740 CombineFrames(data_frames, arraysize(data_frames), 3876 CombineFrames(data_frames, arraysize(data_frames),
3741 combined_data_frames, arraysize(combined_data_frames)); 3877 combined_data_frames, arraysize(combined_data_frames));
3742 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3878 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3743 MockRead reads[] = { 3879 MockRead reads[] = {
3744 CreateMockRead(resp, 1), 3880 CreateMockRead(resp, 1),
3745 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait 3881 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait
3746 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 3882 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3747 MockRead(ASYNC, 0, 4) // EOF 3883 MockRead(ASYNC, 0, 4) // EOF
3748 }; 3884 };
3749 3885
3750 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3886 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3751 3887
3752 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3888 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3753 NetLogWithSource(), NULL); 3889 NetLogWithSource(), nullptr);
3754 helper.RunPreTestSetup(); 3890 helper.RunPreTestSetup();
3755 helper.AddData(&data); 3891 helper.AddData(&data);
3756 HttpNetworkTransaction* trans = helper.trans(); 3892 HttpNetworkTransaction* trans = helper.trans();
3757 3893
3758 TestCompletionCallback callback; 3894 TestCompletionCallback callback;
3759 3895
3760 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 3896 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
3761 NetLogWithSource()); 3897 NetLogWithSource());
3762 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 3898 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3763 3899
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
3812 SpdySerializedFrame req( 3948 SpdySerializedFrame req(
3813 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3949 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3814 SpdySerializedFrame rst( 3950 SpdySerializedFrame rst(
3815 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 3951 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
3816 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 4)}; 3952 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 4)};
3817 3953
3818 // NOTE: We don't FIN the stream. 3954 // NOTE: We don't FIN the stream.
3819 SpdySerializedFrame data_frame( 3955 SpdySerializedFrame data_frame(
3820 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); 3956 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false));
3821 3957
3822 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 3958 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3823 MockRead reads[] = { 3959 MockRead reads[] = {
3824 CreateMockRead(resp, 1), 3960 CreateMockRead(resp, 1),
3825 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait 3961 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait
3826 CreateMockRead(data_frame, 3), MockRead(ASYNC, 0, 5) // EOF 3962 CreateMockRead(data_frame, 3), MockRead(ASYNC, 0, 5) // EOF
3827 }; 3963 };
3828 3964
3829 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3965 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3830 3966
3831 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3967 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3832 NetLogWithSource(), NULL); 3968 NetLogWithSource(), nullptr);
3833 helper.RunPreTestSetup(); 3969 helper.RunPreTestSetup();
3834 helper.AddData(&data); 3970 helper.AddData(&data);
3835 HttpNetworkTransaction* trans = helper.trans(); 3971 HttpNetworkTransaction* trans = helper.trans();
3836 TestCompletionCallback callback; 3972 TestCompletionCallback callback;
3837 3973
3838 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 3974 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
3839 NetLogWithSource()); 3975 NetLogWithSource());
3840 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 3976 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3841 3977
3842 TransactionHelperResult out = helper.output(); 3978 TransactionHelperResult out = helper.output();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3877 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4013 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3878 MockWrite writes[] = {CreateMockWrite(req, 0)}; 4014 MockWrite writes[] = {CreateMockWrite(req, 0)};
3879 4015
3880 SpdySerializedFrame go_away(spdy_util_.ConstructSpdyGoAway()); 4016 SpdySerializedFrame go_away(spdy_util_.ConstructSpdyGoAway());
3881 MockRead reads[] = { 4017 MockRead reads[] = {
3882 CreateMockRead(go_away, 1), 4018 CreateMockRead(go_away, 1),
3883 }; 4019 };
3884 4020
3885 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4021 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3886 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4022 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3887 NetLogWithSource(), NULL); 4023 NetLogWithSource(), nullptr);
3888 helper.AddData(&data); 4024 helper.AddData(&data);
3889 helper.RunToCompletion(&data); 4025 helper.RunToCompletion(&data);
3890 TransactionHelperResult out = helper.output(); 4026 TransactionHelperResult out = helper.output();
3891 EXPECT_THAT(out.rv, IsError(ERR_ABORTED)); 4027 EXPECT_THAT(out.rv, IsError(ERR_ABORTED));
3892 } 4028 }
3893 4029
3894 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { 4030 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) {
3895 SpdySerializedFrame req( 4031 SpdySerializedFrame req(
3896 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4032 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3897 MockWrite writes[] = {CreateMockWrite(req, 0)}; 4033 MockWrite writes[] = {CreateMockWrite(req, 0)};
3898 4034
3899 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 4035 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3900 MockRead reads[] = { 4036 MockRead reads[] = {
3901 CreateMockRead(resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF 4037 CreateMockRead(resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
3902 }; 4038 };
3903 4039
3904 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4040 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3905 4041
3906 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4042 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3907 NetLogWithSource(), NULL); 4043 NetLogWithSource(), nullptr);
3908 helper.RunPreTestSetup(); 4044 helper.RunPreTestSetup();
3909 helper.AddData(&data); 4045 helper.AddData(&data);
3910 helper.StartDefaultTest(); 4046 helper.StartDefaultTest();
3911 EXPECT_THAT(helper.output().rv, IsError(ERR_IO_PENDING)); 4047 EXPECT_THAT(helper.output().rv, IsError(ERR_IO_PENDING));
3912 4048
3913 helper.WaitForCallbackToComplete(); 4049 helper.WaitForCallbackToComplete();
3914 EXPECT_THAT(helper.output().rv, IsError(ERR_CONNECTION_CLOSED)); 4050 EXPECT_THAT(helper.output().rv, IsError(ERR_CONNECTION_CLOSED));
3915 4051
3916 const HttpResponseInfo* response = helper.trans()->GetResponseInfo(); 4052 const HttpResponseInfo* response = helper.trans()->GetResponseInfo();
3917 EXPECT_TRUE(response->headers); 4053 EXPECT_TRUE(response->headers);
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
4103 helper.RunPreTestSetup(); 4239 helper.RunPreTestSetup();
4104 HttpNetworkTransaction* trans = helper.trans(); 4240 HttpNetworkTransaction* trans = helper.trans();
4105 4241
4106 const char kConnect443[] = { 4242 const char kConnect443[] = {
4107 "CONNECT www.example.org:443 HTTP/1.1\r\n" 4243 "CONNECT www.example.org:443 HTTP/1.1\r\n"
4108 "Host: www.example.org:443\r\n" 4244 "Host: www.example.org:443\r\n"
4109 "Proxy-Connection: keep-alive\r\n\r\n"}; 4245 "Proxy-Connection: keep-alive\r\n\r\n"};
4110 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; 4246 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"};
4111 SpdySerializedFrame req( 4247 SpdySerializedFrame req(
4112 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4248 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4113 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 4249 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4114 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4250 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
4115 4251
4116 MockWrite writes[] = { 4252 MockWrite writes[] = {
4117 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4253 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4118 CreateMockWrite(req, 2), 4254 CreateMockWrite(req, 2),
4119 }; 4255 };
4120 MockRead reads[] = { 4256 MockRead reads[] = {
4121 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4257 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4122 CreateMockRead(resp, 3), CreateMockRead(body, 4), 4258 CreateMockRead(resp, 3), CreateMockRead(body, 4),
4123 MockRead(ASYNC, 0, 0, 5), 4259 MockRead(ASYNC, 0, 0, 5),
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4165 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4301 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4166 helper.RunPreTestSetup(); 4302 helper.RunPreTestSetup();
4167 4303
4168 // Construct and send a simple GET request. 4304 // Construct and send a simple GET request.
4169 SpdySerializedFrame req( 4305 SpdySerializedFrame req(
4170 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4306 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4171 MockWrite writes[] = { 4307 MockWrite writes[] = {
4172 CreateMockWrite(req, 0), 4308 CreateMockWrite(req, 0),
4173 }; 4309 };
4174 4310
4175 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 4311 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4176 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4312 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
4177 MockRead reads[] = { 4313 MockRead reads[] = {
4178 CreateMockRead(resp, 1), CreateMockRead(body, 2), 4314 CreateMockRead(resp, 1), CreateMockRead(body, 2),
4179 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause 4315 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause
4180 }; 4316 };
4181 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4317 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4182 helper.AddData(&data); 4318 helper.AddData(&data);
4183 HttpNetworkTransaction* trans = helper.trans(); 4319 HttpNetworkTransaction* trans = helper.trans();
4184 4320
4185 TestCompletionCallback callback; 4321 TestCompletionCallback callback;
(...skipping 29 matching lines...) Expand all
4215 SpdyTestUtil spdy_util_2; 4351 SpdyTestUtil spdy_util_2;
4216 4352
4217 // Set up data for the proxy connection. 4353 // Set up data for the proxy connection.
4218 const char kConnect443[] = { 4354 const char kConnect443[] = {
4219 "CONNECT www.example.org:443 HTTP/1.1\r\n" 4355 "CONNECT www.example.org:443 HTTP/1.1\r\n"
4220 "Host: www.example.org:443\r\n" 4356 "Host: www.example.org:443\r\n"
4221 "Proxy-Connection: keep-alive\r\n\r\n"}; 4357 "Proxy-Connection: keep-alive\r\n\r\n"};
4222 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; 4358 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"};
4223 SpdySerializedFrame req2(spdy_util_2.ConstructSpdyGet( 4359 SpdySerializedFrame req2(spdy_util_2.ConstructSpdyGet(
4224 GetDefaultUrlWithPath("/foo.dat").c_str(), 1, LOWEST)); 4360 GetDefaultUrlWithPath("/foo.dat").c_str(), 1, LOWEST));
4225 SpdySerializedFrame resp2(spdy_util_2.ConstructSpdyGetReply(NULL, 0, 1)); 4361 SpdySerializedFrame resp2(spdy_util_2.ConstructSpdyGetReply(nullptr, 0, 1));
4226 SpdySerializedFrame body2(spdy_util_2.ConstructSpdyDataFrame(1, true)); 4362 SpdySerializedFrame body2(spdy_util_2.ConstructSpdyDataFrame(1, true));
4227 4363
4228 MockWrite writes2[] = { 4364 MockWrite writes2[] = {
4229 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4365 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4230 CreateMockWrite(req2, 2), 4366 CreateMockWrite(req2, 2),
4231 }; 4367 };
4232 MockRead reads2[] = { 4368 MockRead reads2[] = {
4233 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4369 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4234 CreateMockRead(resp2, 3), CreateMockRead(body2, 4), 4370 CreateMockRead(resp2, 3), CreateMockRead(body2, 4),
4235 MockRead(ASYNC, 0, 5) // EOF 4371 MockRead(ASYNC, 0, 5) // EOF
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4268 EXPECT_EQ("hello!", response_data); 4404 EXPECT_EQ("hello!", response_data);
4269 4405
4270 helper_proxy.VerifyDataConsumed(); 4406 helper_proxy.VerifyDataConsumed();
4271 } 4407 }
4272 4408
4273 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction 4409 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction
4274 // on a new connection, if the connection was previously known to be good. 4410 // on a new connection, if the connection was previously known to be good.
4275 // This can happen when a server reboots without saying goodbye, or when 4411 // This can happen when a server reboots without saying goodbye, or when
4276 // we're behind a NAT that masked the RST. 4412 // we're behind a NAT that masked the RST.
4277 TEST_F(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) { 4413 TEST_F(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) {
4278 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 4414 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4279 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4415 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
4280 MockRead reads[] = { 4416 MockRead reads[] = {
4281 CreateMockRead(resp, 1), CreateMockRead(body, 2), 4417 CreateMockRead(resp, 1), CreateMockRead(body, 2),
4282 MockRead(ASYNC, ERR_IO_PENDING, 3), 4418 MockRead(ASYNC, ERR_IO_PENDING, 3),
4283 MockRead(ASYNC, ERR_CONNECTION_RESET, 4), 4419 MockRead(ASYNC, ERR_CONNECTION_RESET, 4),
4284 }; 4420 };
4285 4421
4286 MockRead reads2[] = { 4422 MockRead reads2[] = {
4287 CreateMockRead(resp, 1), CreateMockRead(body, 2), 4423 CreateMockRead(resp, 1), CreateMockRead(body, 2),
4288 MockRead(ASYNC, 0, 3) // EOF 4424 MockRead(ASYNC, 0, 3) // EOF
(...skipping 20 matching lines...) Expand all
4309 4445
4310 for (int variant = VARIANT_RST_DURING_SEND_COMPLETION; 4446 for (int variant = VARIANT_RST_DURING_SEND_COMPLETION;
4311 variant <= VARIANT_RST_DURING_READ_COMPLETION; 4447 variant <= VARIANT_RST_DURING_READ_COMPLETION;
4312 ++variant) { 4448 ++variant) {
4313 SequencedSocketData data1(reads, arraysize(reads), writes1, 1 + variant); 4449 SequencedSocketData data1(reads, arraysize(reads), writes1, 1 + variant);
4314 4450
4315 SequencedSocketData data2(reads2, arraysize(reads2), writes2, 4451 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
4316 arraysize(writes2)); 4452 arraysize(writes2));
4317 4453
4318 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4454 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4319 NetLogWithSource(), NULL); 4455 NetLogWithSource(), nullptr);
4320 helper.AddData(&data1); 4456 helper.AddData(&data1);
4321 helper.AddData(&data2); 4457 helper.AddData(&data2);
4322 helper.RunPreTestSetup(); 4458 helper.RunPreTestSetup();
4323 4459
4324 for (int i = 0; i < 2; ++i) { 4460 for (int i = 0; i < 2; ++i) {
4325 HttpNetworkTransaction trans(DEFAULT_PRIORITY, helper.session()); 4461 HttpNetworkTransaction trans(DEFAULT_PRIORITY, helper.session());
4326 4462
4327 TestCompletionCallback callback; 4463 TestCompletionCallback callback;
4328 int rv = trans.Start(&helper.request(), callback.callback(), 4464 int rv = trans.Start(&helper.request(), callback.callback(),
4329 NetLogWithSource()); 4465 NetLogWithSource());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4382 // Authorization header. 4518 // Authorization header.
4383 const char* const kExtraAuthenticationHeaders[] = { 4519 const char* const kExtraAuthenticationHeaders[] = {
4384 "www-authenticate", 4520 "www-authenticate",
4385 "Basic realm=\"MyRealm\"" 4521 "Basic realm=\"MyRealm\""
4386 }; 4522 };
4387 SpdySerializedFrame resp_authentication(spdy_util_.ConstructSpdyReplyError( 4523 SpdySerializedFrame resp_authentication(spdy_util_.ConstructSpdyReplyError(
4388 "401", kExtraAuthenticationHeaders, 4524 "401", kExtraAuthenticationHeaders,
4389 arraysize(kExtraAuthenticationHeaders) / 2, 1)); 4525 arraysize(kExtraAuthenticationHeaders) / 2, 1));
4390 SpdySerializedFrame body_authentication( 4526 SpdySerializedFrame body_authentication(
4391 spdy_util_.ConstructSpdyDataFrame(1, true)); 4527 spdy_util_.ConstructSpdyDataFrame(1, true));
4392 SpdySerializedFrame resp_data(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 4528 SpdySerializedFrame resp_data(
4529 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
4393 SpdySerializedFrame body_data(spdy_util_.ConstructSpdyDataFrame(3, true)); 4530 SpdySerializedFrame body_data(spdy_util_.ConstructSpdyDataFrame(3, true));
4531
4394 MockRead spdy_reads[] = { 4532 MockRead spdy_reads[] = {
4395 CreateMockRead(resp_authentication, 1), 4533 CreateMockRead(resp_authentication, 1),
4396 CreateMockRead(body_authentication, 2, SYNCHRONOUS), 4534 CreateMockRead(body_authentication, 2, SYNCHRONOUS),
4397 CreateMockRead(resp_data, 4), 4535 CreateMockRead(resp_data, 4),
4398 CreateMockRead(body_data, 5), 4536 CreateMockRead(body_data, 5),
4399 MockRead(ASYNC, 0, 6), 4537 MockRead(ASYNC, 0, 6),
4400 }; 4538 };
4401 4539
4402 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes, 4540 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
4403 arraysize(spdy_writes)); 4541 arraysize(spdy_writes));
4404 HttpRequestInfo request(CreateGetRequest()); 4542 HttpRequestInfo request(CreateGetRequest());
4405 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 4543 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
4406 NetLogWithSource(), NULL); 4544 NetLogWithSource(), nullptr);
4407 4545
4408 helper.RunPreTestSetup(); 4546 helper.RunPreTestSetup();
4409 helper.AddData(&data); 4547 helper.AddData(&data);
4410 helper.StartDefaultTest(); 4548 helper.StartDefaultTest();
4411 EXPECT_THAT(helper.output().rv, IsError(ERR_IO_PENDING)); 4549 EXPECT_THAT(helper.output().rv, IsError(ERR_IO_PENDING));
4412 4550
4413 helper.WaitForCallbackToComplete(); 4551 helper.WaitForCallbackToComplete();
4414 EXPECT_THAT(helper.output().rv, IsOk()); 4552 EXPECT_THAT(helper.output().rv, IsOk());
4415 4553
4416 // Make sure the response has an auth challenge. 4554 // Make sure the response has an auth challenge.
(...skipping 17 matching lines...) Expand all
4434 credentials, callback_restart.callback()); 4572 credentials, callback_restart.callback());
4435 EXPECT_THAT(rv_restart, IsError(ERR_IO_PENDING)); 4573 EXPECT_THAT(rv_restart, IsError(ERR_IO_PENDING));
4436 const int rv_restart_complete = callback_restart.WaitForResult(); 4574 const int rv_restart_complete = callback_restart.WaitForResult();
4437 EXPECT_THAT(rv_restart_complete, IsOk()); 4575 EXPECT_THAT(rv_restart_complete, IsOk());
4438 // TODO(cbentzel): This is actually the same response object as before, but 4576 // TODO(cbentzel): This is actually the same response object as before, but
4439 // data has changed. 4577 // data has changed.
4440 const HttpResponseInfo* const response_restart = trans->GetResponseInfo(); 4578 const HttpResponseInfo* const response_restart = trans->GetResponseInfo();
4441 ASSERT_TRUE(response_restart); 4579 ASSERT_TRUE(response_restart);
4442 ASSERT_TRUE(response_restart->headers); 4580 ASSERT_TRUE(response_restart->headers);
4443 EXPECT_EQ(200, response_restart->headers->response_code()); 4581 EXPECT_EQ(200, response_restart->headers->response_code());
4444 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL); 4582 EXPECT_TRUE(response_restart->auth_challenge.get() == nullptr);
4445 } 4583 }
4446 4584
4447 TEST_F(SpdyNetworkTransactionTest, ServerPushWithHeaders) { 4585 TEST_F(SpdyNetworkTransactionTest, ServerPushWithHeaders) {
4448 SpdySerializedFrame stream1_syn( 4586 SpdySerializedFrame stream1_syn(
4449 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4587 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4588 SpdySerializedFrame stream2_priority(
4589 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
4450 MockWrite writes[] = { 4590 MockWrite writes[] = {
4451 CreateMockWrite(stream1_syn, 0), 4591 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_priority, 3),
4452 }; 4592 };
4453 4593
4454 SpdySerializedFrame stream1_reply( 4594 SpdySerializedFrame stream1_reply(
4455 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 4595 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4456 4596
4457 SpdyHeaderBlock initial_headers; 4597 SpdyHeaderBlock initial_headers;
4458 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 4598 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
4459 &initial_headers); 4599 &initial_headers);
4460 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 4600 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
4461 std::move(initial_headers), 2, 1)); 4601 std::move(initial_headers), 2, 1));
4462 4602
4463 SpdyHeaderBlock late_headers; 4603 SpdyHeaderBlock late_headers;
4464 late_headers[spdy_util_.GetStatusKey()] = "200"; 4604 late_headers[spdy_util_.GetStatusKey()] = "200";
4465 late_headers["hello"] = "bye"; 4605 late_headers["hello"] = "bye";
4466 SpdySerializedFrame stream2_headers(spdy_util_.ConstructSpdyResponseHeaders( 4606 SpdySerializedFrame stream2_headers(spdy_util_.ConstructSpdyResponseHeaders(
4467 2, std::move(late_headers), false)); 4607 2, std::move(late_headers), false));
4468 4608
4469 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4609 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
4470 4610
4471 const char kPushedData[] = "pushed"; 4611 const char kPushedData[] = "pushed";
4472 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 4612 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
4473 2, kPushedData, strlen(kPushedData), true)); 4613 2, kPushedData, strlen(kPushedData), true));
4474 4614
4475 MockRead reads[] = { 4615 MockRead reads[] = {
4476 CreateMockRead(stream1_reply, 1), 4616 CreateMockRead(stream1_reply, 1),
4477 CreateMockRead(stream2_syn, 2), 4617 CreateMockRead(stream2_syn, 2),
4478 CreateMockRead(stream2_headers, 3), 4618 CreateMockRead(stream2_headers, 4),
4479 CreateMockRead(stream1_body, 4, SYNCHRONOUS), 4619 CreateMockRead(stream1_body, 5, SYNCHRONOUS),
4480 CreateMockRead(stream2_body, 5), 4620 CreateMockRead(stream2_body, 6),
4481 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause 4621 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause
4482 }; 4622 };
4483 4623
4484 HttpResponseInfo response; 4624 HttpResponseInfo response;
4485 HttpResponseInfo response2; 4625 HttpResponseInfo response2;
4486 std::string expected_push_result("pushed"); 4626 std::string expected_push_result("pushed");
4487 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4627 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4488 RunServerPushTest(&data, 4628 RunServerPushTest(&data,
4489 &response, 4629 &response,
4490 &response2, 4630 &response2,
4491 expected_push_result); 4631 expected_push_result);
4492 4632
4493 // Verify the response headers. 4633 // Verify the response headers.
4494 EXPECT_TRUE(response.headers); 4634 EXPECT_TRUE(response.headers);
4495 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 4635 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
4496 4636
4497 // Verify the pushed stream. 4637 // Verify the pushed stream.
4498 EXPECT_TRUE(response2.headers); 4638 EXPECT_TRUE(response2.headers);
4499 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 4639 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
4500 } 4640 }
4501 4641
4502 TEST_F(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) { 4642 TEST_F(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) {
4503 // We push a stream and attempt to claim it before the headers come down. 4643 // We push a stream and attempt to claim it before the headers come down.
4504 SpdySerializedFrame stream1_syn( 4644 SpdySerializedFrame stream1_syn(
4505 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4645 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4646 SpdySerializedFrame stream2_priority(
4647 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
4506 MockWrite writes[] = { 4648 MockWrite writes[] = {
4507 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), 4649 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS),
4650 CreateMockWrite(stream2_priority, 3),
4508 }; 4651 };
4509 4652
4510 SpdySerializedFrame stream1_reply( 4653 SpdySerializedFrame stream1_reply(
4511 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 4654 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4512 SpdyHeaderBlock initial_headers; 4655 SpdyHeaderBlock initial_headers;
4513 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 4656 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
4514 &initial_headers); 4657 &initial_headers);
4515 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 4658 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
4516 std::move(initial_headers), 2, 1)); 4659 std::move(initial_headers), 2, 1));
4517 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4660 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
4518 SpdyHeaderBlock late_headers; 4661 SpdyHeaderBlock late_headers;
4519 late_headers[spdy_util_.GetStatusKey()] = "200"; 4662 late_headers[spdy_util_.GetStatusKey()] = "200";
4520 late_headers["hello"] = "bye"; 4663 late_headers["hello"] = "bye";
4521 SpdySerializedFrame stream2_headers(spdy_util_.ConstructSpdyResponseHeaders( 4664 SpdySerializedFrame stream2_headers(spdy_util_.ConstructSpdyResponseHeaders(
4522 2, std::move(late_headers), false)); 4665 2, std::move(late_headers), false));
4523 const char kPushedData[] = "pushed"; 4666 const char kPushedData[] = "pushed";
4524 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 4667 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
4525 2, kPushedData, strlen(kPushedData), true)); 4668 2, kPushedData, strlen(kPushedData), true));
4526 MockRead reads[] = { 4669 MockRead reads[] = {
4527 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 4670 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
4528 CreateMockRead(stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), 4671 CreateMockRead(stream1_body, 4), MockRead(ASYNC, ERR_IO_PENDING, 5),
4529 CreateMockRead(stream2_headers, 5), CreateMockRead(stream2_body, 6), 4672 CreateMockRead(stream2_headers, 6), CreateMockRead(stream2_body, 7),
4530 MockRead(ASYNC, ERR_IO_PENDING, 7), MockRead(ASYNC, 0, 8), // EOF 4673 MockRead(ASYNC, ERR_IO_PENDING, 8), MockRead(ASYNC, 0, 9), // EOF
4531 }; 4674 };
4532 4675
4533 HttpResponseInfo response; 4676 HttpResponseInfo response;
4534 HttpResponseInfo response2; 4677 HttpResponseInfo response2;
4535 std::string expected_push_result("pushed"); 4678 std::string expected_push_result("pushed");
4536 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4679 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4537 4680
4538 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4681 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4539 NetLogWithSource(), NULL); 4682 NetLogWithSource(), nullptr);
4540 helper.AddData(&data); 4683 helper.AddData(&data);
4541 helper.RunPreTestSetup(); 4684 helper.RunPreTestSetup();
4542 4685
4543 HttpNetworkTransaction* trans = helper.trans(); 4686 HttpNetworkTransaction* trans = helper.trans();
4544 4687
4545 // Start the transaction. 4688 // Start the transaction.
4546 TestCompletionCallback callback; 4689 TestCompletionCallback callback;
4547 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 4690 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
4548 NetLogWithSource()); 4691 NetLogWithSource());
4549 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 4692 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
4604 TEST_F(SpdyNetworkTransactionTest, ResponseHeadersTwice) { 4747 TEST_F(SpdyNetworkTransactionTest, ResponseHeadersTwice) {
4605 SpdySerializedFrame req( 4748 SpdySerializedFrame req(
4606 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4749 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4607 SpdySerializedFrame rst( 4750 SpdySerializedFrame rst(
4608 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 4751 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
4609 MockWrite writes[] = { 4752 MockWrite writes[] = {
4610 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), 4753 CreateMockWrite(req, 0), CreateMockWrite(rst, 4),
4611 }; 4754 };
4612 4755
4613 SpdySerializedFrame stream1_reply( 4756 SpdySerializedFrame stream1_reply(
4614 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 4757 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4615 4758
4616 SpdyHeaderBlock late_headers; 4759 SpdyHeaderBlock late_headers;
4617 late_headers["hello"] = "bye"; 4760 late_headers["hello"] = "bye";
4618 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders( 4761 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders(
4619 1, std::move(late_headers), false)); 4762 1, std::move(late_headers), false));
4620 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4763 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
4621 MockRead reads[] = { 4764 MockRead reads[] = {
4622 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_headers, 2), 4765 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_headers, 2),
4623 CreateMockRead(stream1_body, 3), MockRead(ASYNC, 0, 5) // EOF 4766 CreateMockRead(stream1_body, 3), MockRead(ASYNC, 0, 5) // EOF
4624 }; 4767 };
4625 4768
4626 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4769 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4627 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4770 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4628 NetLogWithSource(), NULL); 4771 NetLogWithSource(), nullptr);
4629 helper.RunToCompletion(&data); 4772 helper.RunToCompletion(&data);
4630 TransactionHelperResult out = helper.output(); 4773 TransactionHelperResult out = helper.output();
4631 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); 4774 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
4632 } 4775 }
4633 4776
4634 // Tests that receiving HEADERS, DATA, HEADERS, and DATA in that sequence will 4777 // Tests that receiving HEADERS, DATA, HEADERS, and DATA in that sequence will
4635 // trigger a ERR_SPDY_PROTOCOL_ERROR because trailing HEADERS must not be 4778 // trigger a ERR_SPDY_PROTOCOL_ERROR because trailing HEADERS must not be
4636 // followed by any DATA frames. 4779 // followed by any DATA frames.
4637 TEST_F(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) { 4780 TEST_F(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) {
4638 SpdySerializedFrame req( 4781 SpdySerializedFrame req(
4639 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4782 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4640 SpdySerializedFrame rst( 4783 SpdySerializedFrame rst(
4641 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 4784 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
4642 MockWrite writes[] = { 4785 MockWrite writes[] = {
4643 CreateMockWrite(req, 0), CreateMockWrite(rst, 5), 4786 CreateMockWrite(req, 0), CreateMockWrite(rst, 5),
4644 }; 4787 };
4645 4788
4646 SpdySerializedFrame stream1_reply( 4789 SpdySerializedFrame stream1_reply(
4647 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 4790 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4648 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, false)); 4791 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, false));
4649 4792
4650 SpdyHeaderBlock late_headers; 4793 SpdyHeaderBlock late_headers;
4651 late_headers["hello"] = "bye"; 4794 late_headers["hello"] = "bye";
4652 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders( 4795 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders(
4653 1, std::move(late_headers), false)); 4796 1, std::move(late_headers), false));
4654 SpdySerializedFrame stream1_body2(spdy_util_.ConstructSpdyDataFrame(1, true)); 4797 SpdySerializedFrame stream1_body2(spdy_util_.ConstructSpdyDataFrame(1, true));
4655 MockRead reads[] = { 4798 MockRead reads[] = {
4656 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2), 4799 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2),
4657 CreateMockRead(stream1_headers, 3), CreateMockRead(stream1_body2, 4), 4800 CreateMockRead(stream1_headers, 3), CreateMockRead(stream1_body2, 4),
4658 MockRead(ASYNC, 0, 6) // EOF 4801 MockRead(ASYNC, 0, 6) // EOF
4659 }; 4802 };
4660 4803
4661 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4804 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4662 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4805 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4663 NetLogWithSource(), NULL); 4806 NetLogWithSource(), nullptr);
4664 helper.RunToCompletion(&data); 4807 helper.RunToCompletion(&data);
4665 TransactionHelperResult out = helper.output(); 4808 TransactionHelperResult out = helper.output();
4666 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); 4809 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
4667 } 4810 }
4668 4811
4669 TEST_F(SpdyNetworkTransactionTest, ServerPushCrossOriginCorrectness) { 4812 TEST_F(SpdyNetworkTransactionTest, ServerPushCrossOriginCorrectness) {
4670 // In this test we want to verify that we can't accidentally push content 4813 // In this test we want to verify that we can't accidentally push content
4671 // which can't be pushed by this content server. 4814 // which can't be pushed by this content server.
4672 // This test assumes that: 4815 // This test assumes that:
4673 // - if we're requesting http://www.foo.com/barbaz 4816 // - if we're requesting http://www.foo.com/barbaz
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
4776 4919
4777 // Verify that push works cross origin as long as the certificate is valid for 4920 // Verify that push works cross origin as long as the certificate is valid for
4778 // the pushed authority. 4921 // the pushed authority.
4779 TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) { 4922 TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) {
4780 // "spdy_pooling.pem" is valid for both www.example.org and mail.example.org. 4923 // "spdy_pooling.pem" is valid for both www.example.org and mail.example.org.
4781 const char* url_to_fetch = "https://www.example.org"; 4924 const char* url_to_fetch = "https://www.example.org";
4782 const char* url_to_push = "https://mail.example.org"; 4925 const char* url_to_push = "https://mail.example.org";
4783 4926
4784 SpdySerializedFrame headers( 4927 SpdySerializedFrame headers(
4785 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); 4928 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST));
4929 SpdySerializedFrame push_priority(
4930 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
4786 MockWrite writes[] = { 4931 MockWrite writes[] = {
4787 CreateMockWrite(headers, 0), 4932 CreateMockWrite(headers, 0), CreateMockWrite(push_priority, 3),
4788 }; 4933 };
4789 4934
4790 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 4935 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4791 SpdySerializedFrame push( 4936 SpdySerializedFrame push(
4792 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 4937 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
4793 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4938 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
4794 const char kPushedData[] = "pushed"; 4939 const char kPushedData[] = "pushed";
4795 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame( 4940 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame(
4796 2, kPushedData, strlen(kPushedData), true)); 4941 2, kPushedData, strlen(kPushedData), true));
4797 MockRead reads[] = { 4942 MockRead reads[] = {
4798 CreateMockRead(reply, 1), 4943 CreateMockRead(reply, 1),
4799 CreateMockRead(push, 2, SYNCHRONOUS), 4944 CreateMockRead(push, 2, SYNCHRONOUS),
4800 CreateMockRead(body, 3, SYNCHRONOUS), 4945 CreateMockRead(body, 4),
4801 CreateMockRead(pushed_body, 4, SYNCHRONOUS), 4946 CreateMockRead(pushed_body, 5, SYNCHRONOUS),
4802 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), 4947 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
4803 }; 4948 };
4804 4949
4805 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4950 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4806 4951
4807 HttpRequestInfo request; 4952 HttpRequestInfo request;
4808 request.method = "GET"; 4953 request.method = "GET";
4809 request.url = GURL(url_to_fetch); 4954 request.url = GURL(url_to_fetch);
4810 request.load_flags = 0; 4955 request.load_flags = 0;
4811 4956
4812 NetLogWithSource log; 4957 NetLogWithSource log;
(...skipping 24 matching lines...) Expand all
4837 push_request.url = GURL(url_to_push); 4982 push_request.url = GURL(url_to_push);
4838 push_request.load_flags = 0; 4983 push_request.load_flags = 0;
4839 TestCompletionCallback callback1; 4984 TestCompletionCallback callback1;
4840 rv = trans1.Start(&push_request, callback1.callback(), log); 4985 rv = trans1.Start(&push_request, callback1.callback(), log);
4841 rv = callback1.GetResult(rv); 4986 rv = callback1.GetResult(rv);
4842 EXPECT_THAT(rv, IsOk()); 4987 EXPECT_THAT(rv, IsOk());
4843 4988
4844 EXPECT_TRUE(spdy_session->unclaimed_pushed_streams_.empty()); 4989 EXPECT_TRUE(spdy_session->unclaimed_pushed_streams_.empty());
4845 EXPECT_EQ(0u, spdy_session->unclaimed_pushed_streams_.size()); 4990 EXPECT_EQ(0u, spdy_session->unclaimed_pushed_streams_.size());
4846 4991
4847 helper.VerifyDataConsumed();
4848 VerifyStreamsClosed(helper);
4849
4850 HttpResponseInfo response = *trans0->GetResponseInfo(); 4992 HttpResponseInfo response = *trans0->GetResponseInfo();
4851 EXPECT_TRUE(response.headers); 4993 EXPECT_TRUE(response.headers);
4852 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 4994 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
4853 4995
4854 std::string result0; 4996 std::string result0;
4855 ReadResult(trans0, &result0); 4997 ReadResult(trans0, &result0);
4856 EXPECT_EQ("hello!", result0); 4998 EXPECT_EQ("hello!", result0);
4857 4999
4858 HttpResponseInfo push_response = *trans1.GetResponseInfo(); 5000 HttpResponseInfo push_response = *trans1.GetResponseInfo();
4859 EXPECT_TRUE(push_response.headers); 5001 EXPECT_TRUE(push_response.headers);
4860 EXPECT_EQ("HTTP/1.1 200", push_response.headers->GetStatusLine()); 5002 EXPECT_EQ("HTTP/1.1 200", push_response.headers->GetStatusLine());
4861 5003
4862 std::string result1; 5004 std::string result1;
4863 ReadResult(&trans1, &result1); 5005 ReadResult(&trans1, &result1);
4864 EXPECT_EQ(kPushedData, result1); 5006 EXPECT_EQ(kPushedData, result1);
5007
5008 base::RunLoop().RunUntilIdle();
5009 helper.VerifyDataConsumed();
5010 VerifyStreamsClosed(helper);
4865 } 5011 }
4866 5012
4867 // Verify that push works cross origin, even if there is already a connection 5013 // Verify that push works cross origin, even if there is already a connection
4868 // open to origin of pushed resource. 5014 // open to origin of pushed resource.
4869 TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOriginWithOpenSession) { 5015 TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOriginWithOpenSession) {
4870 const char* url_to_fetch0 = "https://mail.example.org/foo"; 5016 const char* url_to_fetch0 = "https://mail.example.org/foo";
4871 const char* url_to_fetch1 = "https://docs.example.org"; 5017 const char* url_to_fetch1 = "https://docs.example.org";
4872 const char* url_to_push = "https://mail.example.org/bar"; 5018 const char* url_to_push = "https://mail.example.org/bar";
4873 5019
4874 SpdyTestUtil spdy_util_0; 5020 SpdyTestUtil spdy_util_0;
(...skipping 11 matching lines...) Expand all
4886 MockRead reads0[] = {CreateMockRead(reply0, 1), CreateMockRead(body0, 2), 5032 MockRead reads0[] = {CreateMockRead(reply0, 1), CreateMockRead(body0, 2),
4887 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)}; 5033 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)};
4888 5034
4889 SequencedSocketData data0(reads0, arraysize(reads0), writes0, 5035 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4890 arraysize(writes0)); 5036 arraysize(writes0));
4891 5037
4892 SpdyTestUtil spdy_util_1; 5038 SpdyTestUtil spdy_util_1;
4893 5039
4894 SpdySerializedFrame headers1( 5040 SpdySerializedFrame headers1(
4895 spdy_util_1.ConstructSpdyGet(url_to_fetch1, 1, LOWEST)); 5041 spdy_util_1.ConstructSpdyGet(url_to_fetch1, 1, LOWEST));
5042 SpdySerializedFrame push_priority(
5043 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
4896 MockWrite writes1[] = { 5044 MockWrite writes1[] = {
4897 CreateMockWrite(headers1, 0), 5045 CreateMockWrite(headers1, 0),
5046 CreateMockWrite(push_priority, 3, SYNCHRONOUS),
4898 }; 5047 };
4899 5048
4900 SpdySerializedFrame reply1(spdy_util_1.ConstructSpdyGetReply(nullptr, 0, 1)); 5049 SpdySerializedFrame reply1(spdy_util_1.ConstructSpdyGetReply(nullptr, 0, 1));
4901 SpdySerializedFrame push( 5050 SpdySerializedFrame push(
4902 spdy_util_1.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 5051 spdy_util_1.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
4903 const char kData1[] = "second"; 5052 const char kData1[] = "second";
4904 SpdySerializedFrame body1( 5053 SpdySerializedFrame body1(
4905 spdy_util_1.ConstructSpdyDataFrame(1, kData1, strlen(kData1), true)); 5054 spdy_util_1.ConstructSpdyDataFrame(1, kData1, strlen(kData1), true));
4906 const char kPushedData[] = "pushed"; 5055 const char kPushedData[] = "pushed";
4907 SpdySerializedFrame pushed_body(spdy_util_1.ConstructSpdyDataFrame( 5056 SpdySerializedFrame pushed_body(spdy_util_1.ConstructSpdyDataFrame(
4908 2, kPushedData, strlen(kPushedData), true)); 5057 2, kPushedData, strlen(kPushedData), true));
4909 5058
4910 MockRead reads1[] = { 5059 MockRead reads1[] = {
4911 CreateMockRead(reply1, 1), 5060 CreateMockRead(reply1, 1),
4912 CreateMockRead(push, 2, SYNCHRONOUS), 5061 CreateMockRead(push, 2, SYNCHRONOUS),
4913 CreateMockRead(body1, 3, SYNCHRONOUS), 5062 CreateMockRead(body1, 4),
4914 CreateMockRead(pushed_body, 4, SYNCHRONOUS), 5063 CreateMockRead(pushed_body, 5, SYNCHRONOUS),
4915 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), 5064 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
4916 }; 5065 };
4917 5066
4918 SequencedSocketData data1(reads1, arraysize(reads1), writes1, 5067 SequencedSocketData data1(reads1, arraysize(reads1), writes1,
4919 arraysize(writes1)); 5068 arraysize(writes1));
4920 5069
4921 // Request |url_to_fetch0| to open connection to mail.example.org. 5070 // Request |url_to_fetch0| to open connection to mail.example.org.
4922 HttpRequestInfo request0; 5071 HttpRequestInfo request0;
4923 request0.method = "GET"; 5072 request0.method = "GET";
4924 request0.url = GURL(url_to_fetch0); 5073 request0.url = GURL(url_to_fetch0);
4925 request0.load_flags = 0; 5074 request0.load_flags = 0;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
4993 rv = trans2.Start(&push_request, callback2.callback(), log); 5142 rv = trans2.Start(&push_request, callback2.callback(), log);
4994 rv = callback2.GetResult(rv); 5143 rv = callback2.GetResult(rv);
4995 EXPECT_THAT(rv, IsOk()); 5144 EXPECT_THAT(rv, IsOk());
4996 5145
4997 EXPECT_TRUE(spdy_session0->unclaimed_pushed_streams_.empty()); 5146 EXPECT_TRUE(spdy_session0->unclaimed_pushed_streams_.empty());
4998 EXPECT_EQ(0u, spdy_session0->unclaimed_pushed_streams_.size()); 5147 EXPECT_EQ(0u, spdy_session0->unclaimed_pushed_streams_.size());
4999 5148
5000 EXPECT_TRUE(spdy_session1->unclaimed_pushed_streams_.empty()); 5149 EXPECT_TRUE(spdy_session1->unclaimed_pushed_streams_.empty());
5001 EXPECT_EQ(0u, spdy_session1->unclaimed_pushed_streams_.size()); 5150 EXPECT_EQ(0u, spdy_session1->unclaimed_pushed_streams_.size());
5002 5151
5003 helper.VerifyDataConsumed();
5004 VerifyStreamsClosed(helper);
5005
5006 HttpResponseInfo response0 = *trans0->GetResponseInfo(); 5152 HttpResponseInfo response0 = *trans0->GetResponseInfo();
5007 EXPECT_TRUE(response0.headers); 5153 EXPECT_TRUE(response0.headers);
5008 EXPECT_EQ("HTTP/1.1 200", response0.headers->GetStatusLine()); 5154 EXPECT_EQ("HTTP/1.1 200", response0.headers->GetStatusLine());
5009 5155
5010 std::string result0; 5156 std::string result0;
5011 ReadResult(trans0, &result0); 5157 ReadResult(trans0, &result0);
5012 EXPECT_EQ(kData0, result0); 5158 EXPECT_EQ(kData0, result0);
5013 5159
5014 HttpResponseInfo response1 = *trans1.GetResponseInfo(); 5160 HttpResponseInfo response1 = *trans1.GetResponseInfo();
5015 EXPECT_TRUE(response1.headers); 5161 EXPECT_TRUE(response1.headers);
5016 EXPECT_EQ("HTTP/1.1 200", response1.headers->GetStatusLine()); 5162 EXPECT_EQ("HTTP/1.1 200", response1.headers->GetStatusLine());
5017 5163
5018 std::string result1; 5164 std::string result1;
5019 ReadResult(&trans1, &result1); 5165 ReadResult(&trans1, &result1);
5020 EXPECT_EQ(kData1, result1); 5166 EXPECT_EQ(kData1, result1);
5021 5167
5022 HttpResponseInfo push_response = *trans2.GetResponseInfo(); 5168 HttpResponseInfo push_response = *trans2.GetResponseInfo();
5023 EXPECT_TRUE(push_response.headers); 5169 EXPECT_TRUE(push_response.headers);
5024 EXPECT_EQ("HTTP/1.1 200", push_response.headers->GetStatusLine()); 5170 EXPECT_EQ("HTTP/1.1 200", push_response.headers->GetStatusLine());
5025 5171
5026 std::string result2; 5172 std::string result2;
5027 ReadResult(&trans2, &result2); 5173 ReadResult(&trans2, &result2);
5028 EXPECT_EQ(kPushedData, result2); 5174 EXPECT_EQ(kPushedData, result2);
5175
5176 base::RunLoop().RunUntilIdle();
5177 helper.VerifyDataConsumed();
5178 VerifyStreamsClosed(helper);
5029 } 5179 }
5030 5180
5031 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidCrossOrigin) { 5181 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidCrossOrigin) {
5032 // "spdy_pooling.pem" is valid for www.example.org, 5182 // "spdy_pooling.pem" is valid for www.example.org,
5033 // but not for invalid.example.org. 5183 // but not for invalid.example.org.
5034 const char* url_to_fetch = "https://www.example.org"; 5184 const char* url_to_fetch = "https://www.example.org";
5035 const char* url_to_push = "https://invalid.example.org"; 5185 const char* url_to_push = "https://invalid.example.org";
5036 5186
5037 SpdySerializedFrame headers( 5187 SpdySerializedFrame headers(
5038 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); 5188 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST));
5039 SpdySerializedFrame rst( 5189 SpdySerializedFrame rst(
5040 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 5190 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
5041 MockWrite writes[] = { 5191 MockWrite writes[] = {
5042 CreateMockWrite(headers, 0), CreateMockWrite(rst, 3), 5192 CreateMockWrite(headers, 0), CreateMockWrite(rst, 3),
5043 }; 5193 };
5044 5194
5045 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 5195 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
5046 SpdySerializedFrame push( 5196 SpdySerializedFrame push(
5047 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 5197 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
5048 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 5198 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
5049 const char kPushedData[] = "pushed"; 5199 const char kPushedData[] = "pushed";
5050 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame( 5200 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame(
5051 2, kPushedData, strlen(kPushedData), true)); 5201 2, kPushedData, strlen(kPushedData), true));
5052 MockRead reads[] = { 5202 MockRead reads[] = {
5053 CreateMockRead(reply, 1), 5203 CreateMockRead(reply, 1),
5054 CreateMockRead(push, 2), 5204 CreateMockRead(push, 2, SYNCHRONOUS),
5055 CreateMockRead(body, 4), 5205 CreateMockRead(body, 4),
5056 CreateMockRead(pushed_body, 5), 5206 CreateMockRead(pushed_body, 5, SYNCHRONOUS),
5057 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), 5207 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
5058 }; 5208 };
5059 5209
5060 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5210 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5061 5211
5062 HttpRequestInfo request; 5212 HttpRequestInfo request;
5063 request.method = "GET"; 5213 request.method = "GET";
5064 request.url = GURL(url_to_fetch); 5214 request.url = GURL(url_to_fetch);
5065 request.load_flags = 0; 5215 request.load_flags = 0;
5066 5216
(...skipping 12 matching lines...) Expand all
5079 // Will be destroyed by the RST before stream 3 starts. 5229 // Will be destroyed by the RST before stream 3 starts.
5080 spdy_util_.UpdateWithStreamDestruction(1); 5230 spdy_util_.UpdateWithStreamDestruction(1);
5081 SpdySerializedFrame req2( 5231 SpdySerializedFrame req2(
5082 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 5232 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
5083 MockWrite writes[] = { 5233 MockWrite writes[] = {
5084 CreateMockWrite(req, 0), CreateMockWrite(req2, 2), 5234 CreateMockWrite(req, 0), CreateMockWrite(req2, 2),
5085 }; 5235 };
5086 5236
5087 SpdySerializedFrame refused( 5237 SpdySerializedFrame refused(
5088 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); 5238 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM));
5089 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 5239 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
5090 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(3, true)); 5240 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(3, true));
5091 MockRead reads[] = { 5241 MockRead reads[] = {
5092 CreateMockRead(refused, 1), CreateMockRead(resp, 3), 5242 CreateMockRead(refused, 1), CreateMockRead(resp, 3),
5093 CreateMockRead(body, 4), MockRead(ASYNC, 0, 5) // EOF 5243 CreateMockRead(body, 4), MockRead(ASYNC, 0, 5) // EOF
5094 }; 5244 };
5095 5245
5096 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5246 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5097 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5247 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5098 NetLogWithSource(), NULL); 5248 NetLogWithSource(), nullptr);
5099 5249
5100 helper.RunPreTestSetup(); 5250 helper.RunPreTestSetup();
5101 helper.AddData(&data); 5251 helper.AddData(&data);
5102 5252
5103 HttpNetworkTransaction* trans = helper.trans(); 5253 HttpNetworkTransaction* trans = helper.trans();
5104 5254
5105 // Start the transaction with basic parameters. 5255 // Start the transaction with basic parameters.
5106 TestCompletionCallback callback; 5256 TestCompletionCallback callback;
5107 int rv = trans->Start(&CreateGetRequest(), callback.callback(), 5257 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
5108 NetLogWithSource()); 5258 NetLogWithSource());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
5145 SpdySerializedFrame req2( 5295 SpdySerializedFrame req2(
5146 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, HIGHEST, true)); 5296 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, HIGHEST, true));
5147 spdy_util_.UpdateWithStreamDestruction(1); 5297 spdy_util_.UpdateWithStreamDestruction(1);
5148 SpdySerializedFrame req3( 5298 SpdySerializedFrame req3(
5149 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true)); 5299 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true));
5150 MockWrite writes[] = { 5300 MockWrite writes[] = {
5151 MockWrite(ASYNC, ERR_IO_PENDING, 0), CreateMockWrite(req1, 1), 5301 MockWrite(ASYNC, ERR_IO_PENDING, 0), CreateMockWrite(req1, 1),
5152 CreateMockWrite(req2, 5), CreateMockWrite(req3, 6), 5302 CreateMockWrite(req2, 5), CreateMockWrite(req3, 6),
5153 }; 5303 };
5154 5304
5155 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 5305 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
5156 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true)); 5306 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true));
5157 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); 5307 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
5158 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true)); 5308 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true));
5159 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5)); 5309 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 5));
5160 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, true)); 5310 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, true));
5161 MockRead reads[] = { 5311 MockRead reads[] = {
5162 CreateMockRead(resp1, 2), MockRead(ASYNC, ERR_IO_PENDING, 3), 5312 CreateMockRead(resp1, 2), MockRead(ASYNC, ERR_IO_PENDING, 3),
5163 CreateMockRead(body1, 4), CreateMockRead(resp2, 7), 5313 CreateMockRead(body1, 4), CreateMockRead(resp2, 7),
5164 CreateMockRead(body2, 8), CreateMockRead(resp3, 9), 5314 CreateMockRead(body2, 8), CreateMockRead(resp3, 9),
5165 CreateMockRead(body3, 10), MockRead(ASYNC, 0, 11) // EOF 5315 CreateMockRead(body3, 10), MockRead(ASYNC, 0, 11) // EOF
5166 }; 5316 };
5167 5317
5168 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5318 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5169 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST, 5319 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST,
5170 NetLogWithSource(), NULL); 5320 NetLogWithSource(), nullptr);
5171 helper.RunPreTestSetup(); 5321 helper.RunPreTestSetup();
5172 helper.AddData(&data); 5322 helper.AddData(&data);
5173 5323
5174 // Start the first transaction to set up the SpdySession 5324 // Start the first transaction to set up the SpdySession
5175 HttpNetworkTransaction* trans = helper.trans(); 5325 HttpNetworkTransaction* trans = helper.trans();
5176 TestCompletionCallback callback; 5326 TestCompletionCallback callback;
5177 HttpRequestInfo info1 = CreateGetRequest(); 5327 HttpRequestInfo info1 = CreateGetRequest();
5178 int rv = trans->Start(&info1, callback.callback(), NetLogWithSource()); 5328 int rv = trans->Start(&info1, callback.callback(), NetLogWithSource());
5179 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 5329 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
5180 5330
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
5233 // TODO(agayev): develop a socket data provider where both, reads and 5383 // TODO(agayev): develop a socket data provider where both, reads and
5234 // writes are ordered so that writing tests like these are easy and rewrite 5384 // writes are ordered so that writing tests like these are easy and rewrite
5235 // all these tests using it. Right now we are working around the 5385 // all these tests using it. Right now we are working around the
5236 // limitations as described above and it's not deterministic, tests may 5386 // limitations as described above and it's not deterministic, tests may
5237 // fail under specific circumstances. 5387 // fail under specific circumstances.
5238 TEST_F(SpdyNetworkTransactionTest, WindowUpdateReceived) { 5388 TEST_F(SpdyNetworkTransactionTest, WindowUpdateReceived) {
5239 static int kFrameCount = 2; 5389 static int kFrameCount = 2;
5240 std::unique_ptr<std::string> content( 5390 std::unique_ptr<std::string> content(
5241 new std::string(kMaxSpdyFrameChunkSize, 'a')); 5391 new std::string(kMaxSpdyFrameChunkSize, 'a'));
5242 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 5392 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
5243 kDefaultUrl, 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, NULL, 0)); 5393 kDefaultUrl, 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, nullptr,
5394 0));
5244 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame( 5395 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(
5245 1, content->c_str(), content->size(), false)); 5396 1, content->c_str(), content->size(), false));
5246 SpdySerializedFrame body_end(spdy_util_.ConstructSpdyDataFrame( 5397 SpdySerializedFrame body_end(spdy_util_.ConstructSpdyDataFrame(
5247 1, content->c_str(), content->size(), true)); 5398 1, content->c_str(), content->size(), true));
5248 5399
5249 MockWrite writes[] = { 5400 MockWrite writes[] = {
5250 CreateMockWrite(req, 0), CreateMockWrite(body, 1), 5401 CreateMockWrite(req, 0), CreateMockWrite(body, 1),
5251 CreateMockWrite(body_end, 2), 5402 CreateMockWrite(body_end, 2),
5252 }; 5403 };
5253 5404
5254 static const int32_t kDeltaWindowSize = 0xff; 5405 static const int32_t kDeltaWindowSize = 0xff;
5255 static const int kDeltaCount = 4; 5406 static const int kDeltaCount = 4;
5256 SpdySerializedFrame window_update( 5407 SpdySerializedFrame window_update(
5257 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize)); 5408 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize));
5258 SpdySerializedFrame window_update_dummy( 5409 SpdySerializedFrame window_update_dummy(
5259 spdy_util_.ConstructSpdyWindowUpdate(2, kDeltaWindowSize)); 5410 spdy_util_.ConstructSpdyWindowUpdate(2, kDeltaWindowSize));
5260 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 5411 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
5261 MockRead reads[] = { 5412 MockRead reads[] = {
5262 CreateMockRead(window_update_dummy, 3), 5413 CreateMockRead(window_update_dummy, 3),
5263 CreateMockRead(window_update_dummy, 4), 5414 CreateMockRead(window_update_dummy, 4),
5264 CreateMockRead(window_update_dummy, 5), 5415 CreateMockRead(window_update_dummy, 5),
5265 CreateMockRead(window_update, 6), // Four updates, therefore window 5416 CreateMockRead(window_update, 6), // Four updates, therefore window
5266 CreateMockRead(window_update, 7), // size should increase by 5417 CreateMockRead(window_update, 7), // size should increase by
5267 CreateMockRead(window_update, 8), // kDeltaWindowSize * 4 5418 CreateMockRead(window_update, 8), // kDeltaWindowSize * 4
5268 CreateMockRead(window_update, 9), 5419 CreateMockRead(window_update, 9),
5269 CreateMockRead(resp, 10), 5420 CreateMockRead(resp, 10),
5270 MockRead(ASYNC, ERR_IO_PENDING, 11), 5421 MockRead(ASYNC, ERR_IO_PENDING, 11),
(...skipping 10 matching lines...) Expand all
5281 } 5432 }
5282 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); 5433 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0);
5283 5434
5284 // Setup the request 5435 // Setup the request
5285 HttpRequestInfo request; 5436 HttpRequestInfo request;
5286 request.method = "POST"; 5437 request.method = "POST";
5287 request.url = default_url_; 5438 request.url = default_url_;
5288 request.upload_data_stream = &upload_data_stream; 5439 request.upload_data_stream = &upload_data_stream;
5289 5440
5290 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 5441 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
5291 NetLogWithSource(), NULL); 5442 NetLogWithSource(), nullptr);
5292 helper.AddData(&data); 5443 helper.AddData(&data);
5293 helper.RunPreTestSetup(); 5444 helper.RunPreTestSetup();
5294 5445
5295 HttpNetworkTransaction* trans = helper.trans(); 5446 HttpNetworkTransaction* trans = helper.trans();
5296 5447
5297 TestCompletionCallback callback; 5448 TestCompletionCallback callback;
5298 int rv = 5449 int rv =
5299 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); 5450 trans->Start(&helper.request(), callback.callback(), NetLogWithSource());
5300 5451
5301 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 5452 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
5369 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta)); 5520 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta));
5370 5521
5371 std::vector<MockWrite> writes; 5522 std::vector<MockWrite> writes;
5372 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, 5523 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix,
5373 kHttp2ConnectionHeaderPrefixSize, 0)); 5524 kHttp2ConnectionHeaderPrefixSize, 0));
5374 writes.push_back(CreateMockWrite(initial_settings_frame, writes.size())); 5525 writes.push_back(CreateMockWrite(initial_settings_frame, writes.size()));
5375 writes.push_back(CreateMockWrite(initial_window_update, writes.size())); 5526 writes.push_back(CreateMockWrite(initial_window_update, writes.size()));
5376 writes.push_back(CreateMockWrite(req, writes.size())); 5527 writes.push_back(CreateMockWrite(req, writes.size()));
5377 5528
5378 std::vector<MockRead> reads; 5529 std::vector<MockRead> reads;
5379 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); 5530 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
5380 reads.push_back(CreateMockRead(resp, writes.size() + reads.size())); 5531 reads.push_back(CreateMockRead(resp, writes.size() + reads.size()));
5381 5532
5382 std::vector<SpdySerializedFrame> body_frames; 5533 std::vector<SpdySerializedFrame> body_frames;
5383 const std::string body_data(kChunkSize, 'x'); 5534 const std::string body_data(kChunkSize, 'x');
5384 for (size_t remaining = kTargetSize; remaining != 0;) { 5535 for (size_t remaining = kTargetSize; remaining != 0;) {
5385 size_t frame_size = std::min(remaining, body_data.size()); 5536 size_t frame_size = std::min(remaining, body_data.size());
5386 body_frames.push_back(spdy_util_.ConstructSpdyDataFrame(1, body_data.data(), 5537 body_frames.push_back(spdy_util_.ConstructSpdyDataFrame(1, body_data.data(),
5387 frame_size, false)); 5538 frame_size, false));
5388 reads.push_back( 5539 reads.push_back(
5389 CreateMockRead(body_frames.back(), writes.size() + reads.size())); 5540 CreateMockRead(body_frames.back(), writes.size() + reads.size()));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
5459 5610
5460 // Test that WINDOW_UPDATE frame causing overflow is handled correctly. 5611 // Test that WINDOW_UPDATE frame causing overflow is handled correctly.
5461 TEST_F(SpdyNetworkTransactionTest, WindowUpdateOverflow) { 5612 TEST_F(SpdyNetworkTransactionTest, WindowUpdateOverflow) {
5462 // Number of full frames we hope to write (but will not, used to 5613 // Number of full frames we hope to write (but will not, used to
5463 // set content-length header correctly) 5614 // set content-length header correctly)
5464 static int kFrameCount = 3; 5615 static int kFrameCount = 3;
5465 5616
5466 std::unique_ptr<std::string> content( 5617 std::unique_ptr<std::string> content(
5467 new std::string(kMaxSpdyFrameChunkSize, 'a')); 5618 new std::string(kMaxSpdyFrameChunkSize, 'a'));
5468 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 5619 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
5469 kDefaultUrl, 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, NULL, 0)); 5620 kDefaultUrl, 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, nullptr,
5621 0));
5470 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame( 5622 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(
5471 1, content->c_str(), content->size(), false)); 5623 1, content->c_str(), content->size(), false));
5472 SpdySerializedFrame rst( 5624 SpdySerializedFrame rst(
5473 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); 5625 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR));
5474 5626
5475 // We're not going to write a data frame with FIN, we'll receive a bad 5627 // We're not going to write a data frame with FIN, we'll receive a bad
5476 // WINDOW_UPDATE while sending a request and will send a RST_STREAM frame. 5628 // WINDOW_UPDATE while sending a request and will send a RST_STREAM frame.
5477 MockWrite writes[] = { 5629 MockWrite writes[] = {
5478 CreateMockWrite(req, 0), CreateMockWrite(body, 2), 5630 CreateMockWrite(req, 0), CreateMockWrite(body, 2),
5479 CreateMockWrite(rst, 3), 5631 CreateMockWrite(rst, 3),
(...skipping 15 matching lines...) Expand all
5495 } 5647 }
5496 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); 5648 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0);
5497 5649
5498 // Setup the request 5650 // Setup the request
5499 HttpRequestInfo request; 5651 HttpRequestInfo request;
5500 request.method = "POST"; 5652 request.method = "POST";
5501 request.url = default_url_; 5653 request.url = default_url_;
5502 request.upload_data_stream = &upload_data_stream; 5654 request.upload_data_stream = &upload_data_stream;
5503 5655
5504 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 5656 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
5505 NetLogWithSource(), NULL); 5657 NetLogWithSource(), nullptr);
5506 helper.RunPreTestSetup(); 5658 helper.RunPreTestSetup();
5507 helper.AddData(&data); 5659 helper.AddData(&data);
5508 HttpNetworkTransaction* trans = helper.trans(); 5660 HttpNetworkTransaction* trans = helper.trans();
5509 5661
5510 TestCompletionCallback callback; 5662 TestCompletionCallback callback;
5511 int rv = 5663 int rv =
5512 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); 5664 trans->Start(&helper.request(), callback.callback(), NetLogWithSource());
5513 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); 5665 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
5514 5666
5515 base::RunLoop().RunUntilIdle(); 5667 base::RunLoop().RunUntilIdle();
(...skipping 29 matching lines...) Expand all
5545 // which has kBufferSize % kMaxSpdyChunkSize bytes. 5697 // which has kBufferSize % kMaxSpdyChunkSize bytes.
5546 size_t num_frames_in_one_upload_buffer = 5698 size_t num_frames_in_one_upload_buffer =
5547 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); 5699 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize);
5548 5700
5549 // Construct content for a data frame of maximum size. 5701 // Construct content for a data frame of maximum size.
5550 std::string content(kMaxSpdyFrameChunkSize, 'a'); 5702 std::string content(kMaxSpdyFrameChunkSize, 'a');
5551 5703
5552 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 5704 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
5553 kDefaultUrl, 1, 5705 kDefaultUrl, 1,
5554 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, 5706 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize,
5555 LOWEST, NULL, 0)); 5707 LOWEST, nullptr, 0));
5556 5708
5557 // Full frames. 5709 // Full frames.
5558 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( 5710 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(
5559 1, content.c_str(), content.size(), false)); 5711 1, content.c_str(), content.size(), false));
5560 5712
5561 // Last frame in each upload data buffer. 5713 // Last frame in each upload data buffer.
5562 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( 5714 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(
5563 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); 5715 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false));
5564 5716
5565 // The very last frame before the stalled frames. 5717 // The very last frame before the stalled frames.
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5612 1, kUploadDataSize + last_body.size())); 5764 1, kUploadDataSize + last_body.size()));
5613 5765
5614 reads.push_back(CreateMockRead(session_window_update, i++)); 5766 reads.push_back(CreateMockRead(session_window_update, i++));
5615 reads.push_back(CreateMockRead(window_update, i++)); 5767 reads.push_back(CreateMockRead(window_update, i++));
5616 5768
5617 // Stalled frames which can be sent after receiving window updates. 5769 // Stalled frames which can be sent after receiving window updates.
5618 if (last_body.size() > 0) 5770 if (last_body.size() > 0)
5619 writes.push_back(CreateMockWrite(body4, i++)); 5771 writes.push_back(CreateMockWrite(body4, i++));
5620 writes.push_back(CreateMockWrite(body5, i++)); 5772 writes.push_back(CreateMockWrite(body5, i++));
5621 5773
5622 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 5774 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
5623 reads.push_back(CreateMockRead(reply, i++)); 5775 reads.push_back(CreateMockRead(reply, i++));
5624 reads.push_back(CreateMockRead(body2, i++)); 5776 reads.push_back(CreateMockRead(body2, i++));
5625 reads.push_back(CreateMockRead(body5, i++)); 5777 reads.push_back(CreateMockRead(body5, i++));
5626 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF 5778 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
5627 5779
5628 SequencedSocketData data(reads.data(), reads.size(), writes.data(), 5780 SequencedSocketData data(reads.data(), reads.size(), writes.data(),
5629 writes.size()); 5781 writes.size());
5630 5782
5631 std::vector<std::unique_ptr<UploadElementReader>> element_readers; 5783 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
5632 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); 5784 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a');
5633 upload_data_string.append(kUploadData, kUploadDataSize); 5785 upload_data_string.append(kUploadData, kUploadDataSize);
5634 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( 5786 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader(
5635 upload_data_string.c_str(), upload_data_string.size()))); 5787 upload_data_string.c_str(), upload_data_string.size())));
5636 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); 5788 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0);
5637 5789
5638 HttpRequestInfo request; 5790 HttpRequestInfo request;
5639 request.method = "POST"; 5791 request.method = "POST";
5640 request.url = default_url_; 5792 request.url = default_url_;
5641 request.upload_data_stream = &upload_data_stream; 5793 request.upload_data_stream = &upload_data_stream;
5642 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 5794 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
5643 NetLogWithSource(), NULL); 5795 NetLogWithSource(), nullptr);
5644 helper.AddData(&data); 5796 helper.AddData(&data);
5645 helper.RunPreTestSetup(); 5797 helper.RunPreTestSetup();
5646 5798
5647 HttpNetworkTransaction* trans = helper.trans(); 5799 HttpNetworkTransaction* trans = helper.trans();
5648 5800
5649 TestCompletionCallback callback; 5801 TestCompletionCallback callback;
5650 int rv = 5802 int rv =
5651 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); 5803 trans->Start(&helper.request(), callback.callback(), NetLogWithSource());
5652 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 5804 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
5653 5805
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
5695 // which has kBufferSize % kMaxSpdyChunkSize bytes. 5847 // which has kBufferSize % kMaxSpdyChunkSize bytes.
5696 size_t num_frames_in_one_upload_buffer = 5848 size_t num_frames_in_one_upload_buffer =
5697 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); 5849 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize);
5698 5850
5699 // Construct content for a data frame of maximum size. 5851 // Construct content for a data frame of maximum size.
5700 std::string content(kMaxSpdyFrameChunkSize, 'a'); 5852 std::string content(kMaxSpdyFrameChunkSize, 'a');
5701 5853
5702 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 5854 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
5703 kDefaultUrl, 1, 5855 kDefaultUrl, 1,
5704 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, 5856 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize,
5705 LOWEST, NULL, 0)); 5857 LOWEST, nullptr, 0));
5706 5858
5707 // Full frames. 5859 // Full frames.
5708 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( 5860 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(
5709 1, content.c_str(), content.size(), false)); 5861 1, content.c_str(), content.size(), false));
5710 5862
5711 // Last frame in each upload data buffer. 5863 // Last frame in each upload data buffer.
5712 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( 5864 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(
5713 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); 5865 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false));
5714 5866
5715 // The very last frame before the stalled frames. 5867 // The very last frame before the stalled frames.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
5769 reads.push_back(CreateMockRead(session_window_update, i++)); 5921 reads.push_back(CreateMockRead(session_window_update, i++));
5770 5922
5771 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 5923 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
5772 writes.push_back(CreateMockWrite(settings_ack, i++)); 5924 writes.push_back(CreateMockWrite(settings_ack, i++));
5773 5925
5774 // Stalled frames which can be sent after |settings_ack|. 5926 // Stalled frames which can be sent after |settings_ack|.
5775 if (last_body.size() > 0) 5927 if (last_body.size() > 0)
5776 writes.push_back(CreateMockWrite(body4, i++)); 5928 writes.push_back(CreateMockWrite(body4, i++));
5777 writes.push_back(CreateMockWrite(body5, i++)); 5929 writes.push_back(CreateMockWrite(body5, i++));
5778 5930
5779 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 5931 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
5780 reads.push_back(CreateMockRead(reply, i++)); 5932 reads.push_back(CreateMockRead(reply, i++));
5781 reads.push_back(CreateMockRead(body2, i++)); 5933 reads.push_back(CreateMockRead(body2, i++));
5782 reads.push_back(CreateMockRead(body5, i++)); 5934 reads.push_back(CreateMockRead(body5, i++));
5783 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF 5935 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
5784 5936
5785 // Force all writes to happen before any read, last write will not 5937 // Force all writes to happen before any read, last write will not
5786 // actually queue a frame, due to window size being 0. 5938 // actually queue a frame, due to window size being 0.
5787 SequencedSocketData data(reads.data(), reads.size(), writes.data(), 5939 SequencedSocketData data(reads.data(), reads.size(), writes.data(),
5788 writes.size()); 5940 writes.size());
5789 5941
5790 std::vector<std::unique_ptr<UploadElementReader>> element_readers; 5942 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
5791 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); 5943 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a');
5792 upload_data_string.append(kUploadData, kUploadDataSize); 5944 upload_data_string.append(kUploadData, kUploadDataSize);
5793 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( 5945 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader(
5794 upload_data_string.c_str(), upload_data_string.size()))); 5946 upload_data_string.c_str(), upload_data_string.size())));
5795 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); 5947 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0);
5796 5948
5797 HttpRequestInfo request; 5949 HttpRequestInfo request;
5798 request.method = "POST"; 5950 request.method = "POST";
5799 request.url = default_url_; 5951 request.url = default_url_;
5800 request.upload_data_stream = &upload_data_stream; 5952 request.upload_data_stream = &upload_data_stream;
5801 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 5953 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
5802 NetLogWithSource(), NULL); 5954 NetLogWithSource(), nullptr);
5803 helper.RunPreTestSetup(); 5955 helper.RunPreTestSetup();
5804 helper.AddData(&data); 5956 helper.AddData(&data);
5805 5957
5806 HttpNetworkTransaction* trans = helper.trans(); 5958 HttpNetworkTransaction* trans = helper.trans();
5807 5959
5808 TestCompletionCallback callback; 5960 TestCompletionCallback callback;
5809 int rv = 5961 int rv =
5810 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); 5962 trans->Start(&helper.request(), callback.callback(), NetLogWithSource());
5811 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 5963 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
5812 5964
(...skipping 19 matching lines...) Expand all
5832 // But the body is not yet fully sent (kUploadData is not yet sent) 5984 // But the body is not yet fully sent (kUploadData is not yet sent)
5833 // since we're send-stalled. 5985 // since we're send-stalled.
5834 EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control()); 5986 EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control());
5835 5987
5836 // Read in SETTINGS frame to unstall. 5988 // Read in SETTINGS frame to unstall.
5837 data.Resume(); 5989 data.Resume();
5838 base::RunLoop().RunUntilIdle(); 5990 base::RunLoop().RunUntilIdle();
5839 5991
5840 rv = callback.WaitForResult(); 5992 rv = callback.WaitForResult();
5841 helper.VerifyDataConsumed(); 5993 helper.VerifyDataConsumed();
5842 // If stream is NULL, that means it was unstalled and closed. 5994 // If stream is nullptr, that means it was unstalled and closed.
5843 EXPECT_TRUE(stream->stream() == NULL); 5995 EXPECT_TRUE(stream->stream() == nullptr);
5844 } 5996 }
5845 5997
5846 // Test we correctly handle the case where the SETTINGS frame results in a 5998 // Test we correctly handle the case where the SETTINGS frame results in a
5847 // negative send window size. 5999 // negative send window size.
5848 TEST_F(SpdyNetworkTransactionTest, FlowControlNegativeSendWindowSize) { 6000 TEST_F(SpdyNetworkTransactionTest, FlowControlNegativeSendWindowSize) {
5849 const int32_t initial_window_size = kDefaultInitialWindowSize; 6001 const int32_t initial_window_size = kDefaultInitialWindowSize;
5850 // Number of upload data buffers we need to send to zero out the window size 6002 // Number of upload data buffers we need to send to zero out the window size
5851 // is the minimal number of upload buffers takes to be bigger than 6003 // is the minimal number of upload buffers takes to be bigger than
5852 // |initial_window_size|. 6004 // |initial_window_size|.
5853 size_t num_upload_buffers = 6005 size_t num_upload_buffers =
5854 ceil(static_cast<double>(initial_window_size) / kBufferSize); 6006 ceil(static_cast<double>(initial_window_size) / kBufferSize);
5855 // Each upload data buffer consists of |num_frames_in_one_upload_buffer| 6007 // Each upload data buffer consists of |num_frames_in_one_upload_buffer|
5856 // frames, each with |kMaxSpdyFrameChunkSize| bytes except the last frame, 6008 // frames, each with |kMaxSpdyFrameChunkSize| bytes except the last frame,
5857 // which has kBufferSize % kMaxSpdyChunkSize bytes. 6009 // which has kBufferSize % kMaxSpdyChunkSize bytes.
5858 size_t num_frames_in_one_upload_buffer = 6010 size_t num_frames_in_one_upload_buffer =
5859 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); 6011 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize);
5860 6012
5861 // Construct content for a data frame of maximum size. 6013 // Construct content for a data frame of maximum size.
5862 std::string content(kMaxSpdyFrameChunkSize, 'a'); 6014 std::string content(kMaxSpdyFrameChunkSize, 'a');
5863 6015
5864 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 6016 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
5865 kDefaultUrl, 1, 6017 kDefaultUrl, 1,
5866 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, 6018 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize,
5867 LOWEST, NULL, 0)); 6019 LOWEST, nullptr, 0));
5868 6020
5869 // Full frames. 6021 // Full frames.
5870 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( 6022 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(
5871 1, content.c_str(), content.size(), false)); 6023 1, content.c_str(), content.size(), false));
5872 6024
5873 // Last frame in each upload data buffer. 6025 // Last frame in each upload data buffer.
5874 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( 6026 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(
5875 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); 6027 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false));
5876 6028
5877 // The very last frame before the stalled frames. 6029 // The very last frame before the stalled frames.
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
5933 reads.push_back(CreateMockRead(window_update_init_size, i++)); 6085 reads.push_back(CreateMockRead(window_update_init_size, i++));
5934 6086
5935 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 6087 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
5936 writes.push_back(CreateMockWrite(settings_ack, i++)); 6088 writes.push_back(CreateMockWrite(settings_ack, i++));
5937 6089
5938 // Stalled frames which can be sent after |settings_ack|. 6090 // Stalled frames which can be sent after |settings_ack|.
5939 if (last_body.size() > 0) 6091 if (last_body.size() > 0)
5940 writes.push_back(CreateMockWrite(body4, i++)); 6092 writes.push_back(CreateMockWrite(body4, i++));
5941 writes.push_back(CreateMockWrite(body5, i++)); 6093 writes.push_back(CreateMockWrite(body5, i++));
5942 6094
5943 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0)); 6095 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(nullptr, 0));
5944 reads.push_back(CreateMockRead(reply, i++)); 6096 reads.push_back(CreateMockRead(reply, i++));
5945 reads.push_back(CreateMockRead(body2, i++)); 6097 reads.push_back(CreateMockRead(body2, i++));
5946 reads.push_back(CreateMockRead(body5, i++)); 6098 reads.push_back(CreateMockRead(body5, i++));
5947 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF 6099 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
5948 6100
5949 // Force all writes to happen before any read, last write will not 6101 // Force all writes to happen before any read, last write will not
5950 // actually queue a frame, due to window size being 0. 6102 // actually queue a frame, due to window size being 0.
5951 SequencedSocketData data(reads.data(), reads.size(), writes.data(), 6103 SequencedSocketData data(reads.data(), reads.size(), writes.data(),
5952 writes.size()); 6104 writes.size());
5953 6105
5954 std::vector<std::unique_ptr<UploadElementReader>> element_readers; 6106 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
5955 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); 6107 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a');
5956 upload_data_string.append(kUploadData, kUploadDataSize); 6108 upload_data_string.append(kUploadData, kUploadDataSize);
5957 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( 6109 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader(
5958 upload_data_string.c_str(), upload_data_string.size()))); 6110 upload_data_string.c_str(), upload_data_string.size())));
5959 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); 6111 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0);
5960 6112
5961 HttpRequestInfo request; 6113 HttpRequestInfo request;
5962 request.method = "POST"; 6114 request.method = "POST";
5963 request.url = default_url_; 6115 request.url = default_url_;
5964 request.upload_data_stream = &upload_data_stream; 6116 request.upload_data_stream = &upload_data_stream;
5965 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 6117 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
5966 NetLogWithSource(), NULL); 6118 NetLogWithSource(), nullptr);
5967 helper.RunPreTestSetup(); 6119 helper.RunPreTestSetup();
5968 helper.AddData(&data); 6120 helper.AddData(&data);
5969 6121
5970 HttpNetworkTransaction* trans = helper.trans(); 6122 HttpNetworkTransaction* trans = helper.trans();
5971 6123
5972 TestCompletionCallback callback; 6124 TestCompletionCallback callback;
5973 int rv = 6125 int rv =
5974 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); 6126 trans->Start(&helper.request(), callback.callback(), NetLogWithSource());
5975 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 6127 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
5976 6128
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
6011 SpdySerializedFrame req( 6163 SpdySerializedFrame req(
6012 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 6164 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
6013 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 6165 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
6014 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id.")); 6166 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id."));
6015 MockWrite writes[] = { 6167 MockWrite writes[] = {
6016 CreateMockWrite(req, 0), CreateMockWrite(goaway, 2), 6168 CreateMockWrite(req, 0), CreateMockWrite(goaway, 2),
6017 }; 6169 };
6018 6170
6019 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6171 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6020 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 6172 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
6021 NetLogWithSource(), NULL); 6173 NetLogWithSource(), nullptr);
6022 helper.RunToCompletion(&data); 6174 helper.RunToCompletion(&data);
6023 TransactionHelperResult out = helper.output(); 6175 TransactionHelperResult out = helper.output();
6024 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); 6176 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
6025 } 6177 }
6026 6178
6027 TEST_F(SpdyNetworkTransactionTest, 6179 TEST_F(SpdyNetworkTransactionTest,
6028 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) { 6180 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) {
6029 SpdySerializedFrame push_a(spdy_util_.ConstructSpdyPush( 6181 SpdySerializedFrame push_a(spdy_util_.ConstructSpdyPush(
6030 NULL, 0, 4, 1, GetDefaultUrlWithPath("/a.dat").c_str())); 6182 nullptr, 0, 4, 1, GetDefaultUrlWithPath("/a.dat").c_str()));
6031 SpdyHeaderBlock push_b_headers; 6183 SpdyHeaderBlock push_b_headers;
6032 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/b.dat"), 6184 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/b.dat"),
6033 &push_b_headers); 6185 &push_b_headers);
6034 SpdySerializedFrame push_b(spdy_util_.ConstructInitialSpdyPushFrame( 6186 SpdySerializedFrame push_b(spdy_util_.ConstructInitialSpdyPushFrame(
6035 std::move(push_b_headers), 2, 1)); 6187 std::move(push_b_headers), 2, 1));
6036 MockRead reads[] = { 6188 MockRead reads[] = {
6037 CreateMockRead(push_a, 1), CreateMockRead(push_b, 2), 6189 CreateMockRead(push_a, 1), CreateMockRead(push_b, 3),
6038 }; 6190 };
6039 6191
6040 SpdySerializedFrame req( 6192 SpdySerializedFrame req(
6041 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 6193 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
6194 SpdySerializedFrame priority_a(
6195 spdy_util_.ConstructSpdyPriority(4, 1, IDLE, true));
6042 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 6196 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
6043 4, GOAWAY_PROTOCOL_ERROR, 6197 4, GOAWAY_PROTOCOL_ERROR,
6044 "New push stream id must be greater than the last accepted.")); 6198 "New push stream id must be greater than the last accepted."));
6045 MockWrite writes[] = { 6199 MockWrite writes[] = {
6046 CreateMockWrite(req, 0), CreateMockWrite(goaway, 3), 6200 CreateMockWrite(req, 0), CreateMockWrite(priority_a, 2),
6201 CreateMockWrite(goaway, 4),
6047 }; 6202 };
6048 6203
6049 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6204 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6050 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 6205 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
6051 NetLogWithSource(), NULL); 6206 NetLogWithSource(), nullptr);
6052 helper.RunToCompletion(&data); 6207 helper.RunToCompletion(&data);
6053 TransactionHelperResult out = helper.output(); 6208 TransactionHelperResult out = helper.output();
6054 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); 6209 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
6055 } 6210 }
6056 6211
6057 // Regression test for https://crbug.com/493348: request header exceeds 16 kB 6212 // Regression test for https://crbug.com/493348: request header exceeds 16 kB
6058 // and thus sent in multiple frames when using HTTP/2. 6213 // and thus sent in multiple frames when using HTTP/2.
6059 TEST_F(SpdyNetworkTransactionTest, LargeRequest) { 6214 TEST_F(SpdyNetworkTransactionTest, LargeRequest) {
6060 const std::string kKey("foo"); 6215 const std::string kKey("foo");
6061 const std::string kValue(1 << 15, 'z'); 6216 const std::string kValue(1 << 15, 'z');
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
6280 6435
6281 class SpdyNetworkTransactionTLSUsageCheckTest 6436 class SpdyNetworkTransactionTLSUsageCheckTest
6282 : public SpdyNetworkTransactionTest { 6437 : public SpdyNetworkTransactionTest {
6283 protected: 6438 protected:
6284 void RunTLSUsageCheckTest( 6439 void RunTLSUsageCheckTest(
6285 std::unique_ptr<SSLSocketDataProvider> ssl_provider) { 6440 std::unique_ptr<SSLSocketDataProvider> ssl_provider) {
6286 SpdySerializedFrame goaway( 6441 SpdySerializedFrame goaway(
6287 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, "")); 6442 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, ""));
6288 MockWrite writes[] = {CreateMockWrite(goaway)}; 6443 MockWrite writes[] = {CreateMockWrite(goaway)};
6289 6444
6290 StaticSocketDataProvider data(NULL, 0, writes, arraysize(writes)); 6445 StaticSocketDataProvider data(nullptr, 0, writes, arraysize(writes));
6291 HttpRequestInfo request; 6446 HttpRequestInfo request;
6292 request.method = "GET"; 6447 request.method = "GET";
6293 request.url = default_url_; 6448 request.url = default_url_;
6294 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 6449 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
6295 NetLogWithSource(), NULL); 6450 NetLogWithSource(), nullptr);
6296 helper.RunToCompletionWithSSLData(&data, std::move(ssl_provider)); 6451 helper.RunToCompletionWithSSLData(&data, std::move(ssl_provider));
6297 TransactionHelperResult out = helper.output(); 6452 TransactionHelperResult out = helper.output();
6298 EXPECT_THAT(out.rv, IsError(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY)); 6453 EXPECT_THAT(out.rv, IsError(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY));
6299 } 6454 }
6300 }; 6455 };
6301 6456
6302 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSVersionTooOld) { 6457 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSVersionTooOld) {
6303 std::unique_ptr<SSLSocketDataProvider> ssl_provider( 6458 std::unique_ptr<SSLSocketDataProvider> ssl_provider(
6304 new SSLSocketDataProvider(ASYNC, OK)); 6459 new SSLSocketDataProvider(ASYNC, OK));
6305 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3, 6460 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3,
6306 &ssl_provider->connection_status); 6461 &ssl_provider->connection_status);
6307 6462
6308 RunTLSUsageCheckTest(std::move(ssl_provider)); 6463 RunTLSUsageCheckTest(std::move(ssl_provider));
6309 } 6464 }
6310 6465
6311 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { 6466 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) {
6312 std::unique_ptr<SSLSocketDataProvider> ssl_provider( 6467 std::unique_ptr<SSLSocketDataProvider> ssl_provider(
6313 new SSLSocketDataProvider(ASYNC, OK)); 6468 new SSLSocketDataProvider(ASYNC, OK));
6314 // Set to TLS_RSA_WITH_NULL_MD5 6469 // Set to TLS_RSA_WITH_NULL_MD5
6315 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); 6470 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
6316 6471
6317 RunTLSUsageCheckTest(std::move(ssl_provider)); 6472 RunTLSUsageCheckTest(std::move(ssl_provider));
6318 } 6473 }
6319 6474
6320 } // namespace net 6475 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_http_stream.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698