OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |