| 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 |