| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "net/http/bidirectional_stream.h" | 5 #include "net/http/bidirectional_stream.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 delegate->Start(std::move(request_info), session.get()); | 416 delegate->Start(std::move(request_info), session.get()); |
| 417 // Reset stream right before the OnFailed task is executed. | 417 // Reset stream right before the OnFailed task is executed. |
| 418 delegate.reset(); | 418 delegate.reset(); |
| 419 | 419 |
| 420 base::RunLoop().RunUntilIdle(); | 420 base::RunLoop().RunUntilIdle(); |
| 421 } | 421 } |
| 422 | 422 |
| 423 // Simulates user calling ReadData after END_STREAM has been received in | 423 // Simulates user calling ReadData after END_STREAM has been received in |
| 424 // BidirectionalStreamSpdyImpl. | 424 // BidirectionalStreamSpdyImpl. |
| 425 TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { | 425 TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { |
| 426 std::unique_ptr<SpdySerializedFrame> req( | 426 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 427 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 428 // Empty DATA frame with an END_STREAM flag. | 427 // Empty DATA frame with an END_STREAM flag. |
| 429 std::unique_ptr<SpdySerializedFrame> end_stream( | 428 SpdySerializedFrame end_stream( |
| 430 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 429 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); |
| 431 MockWrite writes[] = { | 430 MockWrite writes[] = { |
| 432 CreateMockWrite(*req.get(), 0), | 431 CreateMockWrite(req, 0), |
| 433 }; | 432 }; |
| 434 | 433 |
| 435 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 434 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 436 | 435 |
| 437 std::unique_ptr<SpdySerializedFrame> resp( | 436 SpdySerializedFrame resp( |
| 438 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 437 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
| 439 | 438 |
| 440 std::unique_ptr<SpdySerializedFrame> body_frame( | 439 SpdySerializedFrame body_frame(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 441 spdy_util_.ConstructSpdyBodyFrame(1, false)); | |
| 442 // Last body frame has END_STREAM flag set. | 440 // Last body frame has END_STREAM flag set. |
| 443 std::unique_ptr<SpdySerializedFrame> last_body_frame( | 441 SpdySerializedFrame last_body_frame( |
| 444 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 442 spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 445 | 443 |
| 446 MockRead reads[] = { | 444 MockRead reads[] = { |
| 447 CreateMockRead(*resp, 1), | 445 CreateMockRead(resp, 1), |
| 448 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 446 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
| 449 CreateMockRead(*body_frame, 3), | 447 CreateMockRead(body_frame, 3), |
| 450 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. | 448 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. |
| 451 CreateMockRead(*body_frame, 5), | 449 CreateMockRead(body_frame, 5), |
| 452 CreateMockRead(*last_body_frame, 6), | 450 CreateMockRead(last_body_frame, 6), |
| 453 MockRead(SYNCHRONOUS, 0, 7), | 451 MockRead(SYNCHRONOUS, 0, 7), |
| 454 }; | 452 }; |
| 455 | 453 |
| 456 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 454 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 457 | 455 |
| 458 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 456 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 459 new BidirectionalStreamRequestInfo); | 457 new BidirectionalStreamRequestInfo); |
| 460 request_info->method = "GET"; | 458 request_info->method = "GET"; |
| 461 request_info->url = default_url_; | 459 request_info->url = default_url_; |
| 462 request_info->end_stream_on_headers = true; | 460 request_info->end_stream_on_headers = true; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 EXPECT_EQ(0, delegate->on_data_sent_count()); | 501 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 504 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 502 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 505 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 503 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
| 506 delegate->GetTotalSentBytes()); | 504 delegate->GetTotalSentBytes()); |
| 507 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 505 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 508 delegate->GetTotalReceivedBytes()); | 506 delegate->GetTotalReceivedBytes()); |
| 509 } | 507 } |
| 510 | 508 |
| 511 // Tests that the NetLog contains correct entries. | 509 // Tests that the NetLog contains correct entries. |
| 512 TEST_F(BidirectionalStreamTest, TestNetLogContainEntries) { | 510 TEST_F(BidirectionalStreamTest, TestNetLogContainEntries) { |
| 513 BufferedSpdyFramer framer; | 511 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 514 | |
| 515 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | |
| 516 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 512 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
| 517 std::unique_ptr<SpdySerializedFrame> data_frame( | 513 SpdySerializedFrame data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 518 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_FIN)); | 514 1, kBodyData, kBodyDataSize, /*fin=*/true)); |
| 519 MockWrite writes[] = { | 515 MockWrite writes[] = { |
| 520 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), | 516 CreateMockWrite(req, 0), CreateMockWrite(data_frame, 3), |
| 521 }; | 517 }; |
| 522 | 518 |
| 523 std::unique_ptr<SpdySerializedFrame> resp( | 519 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 524 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 520 SpdySerializedFrame response_body_frame1( |
| 525 std::unique_ptr<SpdySerializedFrame> response_body_frame1( | 521 spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 526 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 522 SpdySerializedFrame response_body_frame2( |
| 527 std::unique_ptr<SpdySerializedFrame> response_body_frame2( | 523 spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 528 spdy_util_.ConstructSpdyBodyFrame(1, false)); | |
| 529 | 524 |
| 530 SpdyHeaderBlock trailers; | 525 SpdyHeaderBlock trailers; |
| 531 trailers["foo"] = "bar"; | 526 trailers["foo"] = "bar"; |
| 532 std::unique_ptr<SpdySerializedFrame> response_trailers( | 527 SpdySerializedFrame response_trailers( |
| 533 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); | 528 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); |
| 534 | 529 |
| 535 MockRead reads[] = { | 530 MockRead reads[] = { |
| 536 CreateMockRead(*resp, 1), | 531 CreateMockRead(resp, 1), |
| 537 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 532 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
| 538 CreateMockRead(*response_body_frame1, 4), | 533 CreateMockRead(response_body_frame1, 4), |
| 539 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. | 534 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. |
| 540 CreateMockRead(*response_body_frame2, 6), | 535 CreateMockRead(response_body_frame2, 6), |
| 541 CreateMockRead(*response_trailers, 7), | 536 CreateMockRead(response_trailers, 7), |
| 542 MockRead(ASYNC, 0, 8), | 537 MockRead(ASYNC, 0, 8), |
| 543 }; | 538 }; |
| 544 | 539 |
| 545 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 540 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 546 | 541 |
| 547 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 542 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 548 new BidirectionalStreamRequestInfo); | 543 new BidirectionalStreamRequestInfo); |
| 549 request_info->method = "POST"; | 544 request_info->method = "POST"; |
| 550 request_info->url = default_url_; | 545 request_info->url = default_url_; |
| 551 request_info->priority = LOWEST; | 546 request_info->priority = LOWEST; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_RECEIVED, | 641 entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_RECEIVED, |
| 647 NetLog::PHASE_NONE); | 642 NetLog::PHASE_NONE); |
| 648 entry = entries[index]; | 643 entry = entries[index]; |
| 649 EXPECT_EQ(NetLog::SOURCE_BIDIRECTIONAL_STREAM, entry.source.type); | 644 EXPECT_EQ(NetLog::SOURCE_BIDIRECTIONAL_STREAM, entry.source.type); |
| 650 ExpectLogContainsSomewhere(entries, index, | 645 ExpectLogContainsSomewhere(entries, index, |
| 651 NetLog::TYPE_BIDIRECTIONAL_STREAM_ALIVE, | 646 NetLog::TYPE_BIDIRECTIONAL_STREAM_ALIVE, |
| 652 NetLog::PHASE_END); | 647 NetLog::PHASE_END); |
| 653 } | 648 } |
| 654 | 649 |
| 655 TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { | 650 TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { |
| 656 BufferedSpdyFramer framer; | 651 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 657 | |
| 658 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | |
| 659 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 652 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
| 660 std::unique_ptr<SpdySerializedFrame> data_frame1( | 653 SpdySerializedFrame data_frame1(spdy_util_.ConstructSpdyDataFrame( |
| 661 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | 654 1, kBodyData, kBodyDataSize, /*fin=*/false)); |
| 662 std::unique_ptr<SpdySerializedFrame> data_frame2( | 655 SpdySerializedFrame data_frame2(spdy_util_.ConstructSpdyDataFrame( |
| 663 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | 656 1, kBodyData, kBodyDataSize, /*fin=*/false)); |
| 664 std::unique_ptr<SpdySerializedFrame> data_frame3( | 657 SpdySerializedFrame data_frame3(spdy_util_.ConstructSpdyDataFrame( |
| 665 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_FIN)); | 658 1, kBodyData, kBodyDataSize, /*fin=*/true)); |
| 666 MockWrite writes[] = { | 659 MockWrite writes[] = { |
| 667 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame1, 3), | 660 CreateMockWrite(req, 0), CreateMockWrite(data_frame1, 3), |
| 668 CreateMockWrite(*data_frame2, 6), CreateMockWrite(*data_frame3, 9), | 661 CreateMockWrite(data_frame2, 6), CreateMockWrite(data_frame3, 9), |
| 669 }; | 662 }; |
| 670 | 663 |
| 671 std::unique_ptr<SpdySerializedFrame> resp( | 664 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 672 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 665 SpdySerializedFrame response_body_frame1( |
| 673 std::unique_ptr<SpdySerializedFrame> response_body_frame1( | 666 spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 674 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 667 SpdySerializedFrame response_body_frame2( |
| 675 std::unique_ptr<SpdySerializedFrame> response_body_frame2( | 668 spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 676 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 677 | 669 |
| 678 MockRead reads[] = { | 670 MockRead reads[] = { |
| 679 CreateMockRead(*resp, 1), | 671 CreateMockRead(resp, 1), |
| 680 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 672 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
| 681 CreateMockRead(*response_body_frame1, 4), | 673 CreateMockRead(response_body_frame1, 4), |
| 682 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. | 674 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. |
| 683 CreateMockRead(*response_body_frame2, 7), | 675 CreateMockRead(response_body_frame2, 7), |
| 684 MockRead(ASYNC, ERR_IO_PENDING, 8), // Force a pause. | 676 MockRead(ASYNC, ERR_IO_PENDING, 8), // Force a pause. |
| 685 MockRead(ASYNC, 0, 10), | 677 MockRead(ASYNC, 0, 10), |
| 686 }; | 678 }; |
| 687 | 679 |
| 688 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 680 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 689 | 681 |
| 690 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 682 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 691 new BidirectionalStreamRequestInfo); | 683 new BidirectionalStreamRequestInfo); |
| 692 request_info->method = "POST"; | 684 request_info->method = "POST"; |
| 693 request_info->url = default_url_; | 685 request_info->url = default_url_; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 EXPECT_EQ(2, delegate->on_data_read_count()); | 742 EXPECT_EQ(2, delegate->on_data_read_count()); |
| 751 EXPECT_EQ(3, delegate->on_data_sent_count()); | 743 EXPECT_EQ(3, delegate->on_data_sent_count()); |
| 752 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 744 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 753 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 745 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
| 754 delegate->GetTotalSentBytes()); | 746 delegate->GetTotalSentBytes()); |
| 755 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 747 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 756 delegate->GetTotalReceivedBytes()); | 748 delegate->GetTotalReceivedBytes()); |
| 757 } | 749 } |
| 758 | 750 |
| 759 TEST_F(BidirectionalStreamTest, TestCoalesceSmallDataBuffers) { | 751 TEST_F(BidirectionalStreamTest, TestCoalesceSmallDataBuffers) { |
| 760 BufferedSpdyFramer framer; | 752 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 761 | |
| 762 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | |
| 763 kDefaultUrl, 1, kBodyDataSize * 1, LOWEST, nullptr, 0)); | 753 kDefaultUrl, 1, kBodyDataSize * 1, LOWEST, nullptr, 0)); |
| 764 std::string body_data = "some really long piece of data"; | 754 std::string body_data = "some really long piece of data"; |
| 765 std::unique_ptr<SpdySerializedFrame> data_frame1(framer.CreateDataFrame( | 755 SpdySerializedFrame data_frame1(spdy_util_.ConstructSpdyDataFrame( |
| 766 1, body_data.c_str(), body_data.size(), DATA_FLAG_FIN)); | 756 1, body_data.c_str(), body_data.size(), /*fin=*/true)); |
| 767 MockWrite writes[] = { | 757 MockWrite writes[] = { |
| 768 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame1, 1), | 758 CreateMockWrite(req, 0), CreateMockWrite(data_frame1, 1), |
| 769 }; | 759 }; |
| 770 | 760 |
| 771 std::unique_ptr<SpdySerializedFrame> resp( | 761 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 772 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 762 SpdySerializedFrame response_body_frame1( |
| 773 std::unique_ptr<SpdySerializedFrame> response_body_frame1( | 763 spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 774 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 775 MockRead reads[] = { | 764 MockRead reads[] = { |
| 776 CreateMockRead(*resp, 2), | 765 CreateMockRead(resp, 2), |
| 777 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause. | 766 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause. |
| 778 CreateMockRead(*response_body_frame1, 4), MockRead(ASYNC, 0, 5), | 767 CreateMockRead(response_body_frame1, 4), MockRead(ASYNC, 0, 5), |
| 779 }; | 768 }; |
| 780 | 769 |
| 781 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 770 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 782 | 771 |
| 783 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 772 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 784 new BidirectionalStreamRequestInfo); | 773 new BidirectionalStreamRequestInfo); |
| 785 request_info->method = "POST"; | 774 request_info->method = "POST"; |
| 786 request_info->url = default_url_; | 775 request_info->url = default_url_; |
| 787 request_info->priority = LOWEST; | 776 request_info->priority = LOWEST; |
| 788 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 777 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 EXPECT_EQ(buf2->size(), byte_count); | 845 EXPECT_EQ(buf2->size(), byte_count); |
| 857 | 846 |
| 858 ExpectLogContainsSomewhere( | 847 ExpectLogContainsSomewhere( |
| 859 entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_SENT_COALESCED, | 848 entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_SENT_COALESCED, |
| 860 NetLog::PHASE_END); | 849 NetLog::PHASE_END); |
| 861 } | 850 } |
| 862 | 851 |
| 863 // Tests that BidirectionalStreamSpdyImpl::OnClose will complete any remaining | 852 // Tests that BidirectionalStreamSpdyImpl::OnClose will complete any remaining |
| 864 // read even if the read queue is empty. | 853 // read even if the read queue is empty. |
| 865 TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) { | 854 TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) { |
| 866 std::unique_ptr<SpdySerializedFrame> req( | 855 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 867 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 868 // Empty DATA frame with an END_STREAM flag. | 856 // Empty DATA frame with an END_STREAM flag. |
| 869 std::unique_ptr<SpdySerializedFrame> end_stream( | 857 SpdySerializedFrame end_stream( |
| 870 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 858 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); |
| 871 | 859 |
| 872 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; | 860 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 873 | 861 |
| 874 std::unique_ptr<SpdySerializedFrame> resp( | 862 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 875 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 876 | 863 |
| 877 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 864 SpdySerializedFrame response_body_frame( |
| 878 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 865 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); |
| 879 | 866 |
| 880 MockRead reads[] = { | 867 MockRead reads[] = { |
| 881 CreateMockRead(*resp, 1), | 868 CreateMockRead(resp, 1), |
| 882 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 869 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
| 883 CreateMockRead(*response_body_frame, 3), MockRead(SYNCHRONOUS, 0, 4), | 870 CreateMockRead(response_body_frame, 3), MockRead(SYNCHRONOUS, 0, 4), |
| 884 }; | 871 }; |
| 885 | 872 |
| 886 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 873 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 887 | 874 |
| 888 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 875 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 889 new BidirectionalStreamRequestInfo); | 876 new BidirectionalStreamRequestInfo); |
| 890 request_info->method = "GET"; | 877 request_info->method = "GET"; |
| 891 request_info->url = default_url_; | 878 request_info->url = default_url_; |
| 892 request_info->priority = LOWEST; | 879 request_info->priority = LOWEST; |
| 893 request_info->end_stream_on_headers = true; | 880 request_info->end_stream_on_headers = true; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 915 EXPECT_EQ(0u, delegate->data_received().size()); | 902 EXPECT_EQ(0u, delegate->data_received().size()); |
| 916 EXPECT_EQ(0, delegate->on_data_sent_count()); | 903 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 917 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 904 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 918 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 905 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
| 919 delegate->GetTotalSentBytes()); | 906 delegate->GetTotalSentBytes()); |
| 920 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 907 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 921 delegate->GetTotalReceivedBytes()); | 908 delegate->GetTotalReceivedBytes()); |
| 922 } | 909 } |
| 923 | 910 |
| 924 TEST_F(BidirectionalStreamTest, TestBuffering) { | 911 TEST_F(BidirectionalStreamTest, TestBuffering) { |
| 925 std::unique_ptr<SpdySerializedFrame> req( | 912 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 926 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 927 // Empty DATA frame with an END_STREAM flag. | 913 // Empty DATA frame with an END_STREAM flag. |
| 928 std::unique_ptr<SpdySerializedFrame> end_stream( | 914 SpdySerializedFrame end_stream( |
| 929 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 915 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); |
| 930 | 916 |
| 931 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; | 917 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 932 | 918 |
| 933 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 919 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 934 | 920 |
| 935 std::unique_ptr<SpdySerializedFrame> resp( | 921 SpdySerializedFrame resp( |
| 936 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 922 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
| 937 | 923 |
| 938 std::unique_ptr<SpdySerializedFrame> body_frame( | 924 SpdySerializedFrame body_frame(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 939 spdy_util_.ConstructSpdyBodyFrame(1, false)); | |
| 940 // Last body frame has END_STREAM flag set. | 925 // Last body frame has END_STREAM flag set. |
| 941 std::unique_ptr<SpdySerializedFrame> last_body_frame( | 926 SpdySerializedFrame last_body_frame( |
| 942 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 927 spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 943 | 928 |
| 944 MockRead reads[] = { | 929 MockRead reads[] = { |
| 945 CreateMockRead(*resp, 1), | 930 CreateMockRead(resp, 1), |
| 946 CreateMockRead(*body_frame, 2), | 931 CreateMockRead(body_frame, 2), |
| 947 CreateMockRead(*body_frame, 3), | 932 CreateMockRead(body_frame, 3), |
| 948 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. | 933 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. |
| 949 CreateMockRead(*last_body_frame, 5), | 934 CreateMockRead(last_body_frame, 5), |
| 950 MockRead(SYNCHRONOUS, 0, 6), | 935 MockRead(SYNCHRONOUS, 0, 6), |
| 951 }; | 936 }; |
| 952 | 937 |
| 953 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 938 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 954 | 939 |
| 955 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 940 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 956 new BidirectionalStreamRequestInfo); | 941 new BidirectionalStreamRequestInfo); |
| 957 request_info->method = "GET"; | 942 request_info->method = "GET"; |
| 958 request_info->url = default_url_; | 943 request_info->url = default_url_; |
| 959 request_info->priority = LOWEST; | 944 request_info->priority = LOWEST; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 996 EXPECT_EQ("header-value", response_headers.find("header-name")->second); | 981 EXPECT_EQ("header-value", response_headers.find("header-name")->second); |
| 997 EXPECT_EQ(0, delegate->on_data_sent_count()); | 982 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 998 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 983 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 999 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 984 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
| 1000 delegate->GetTotalSentBytes()); | 985 delegate->GetTotalSentBytes()); |
| 1001 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 986 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 1002 delegate->GetTotalReceivedBytes()); | 987 delegate->GetTotalReceivedBytes()); |
| 1003 } | 988 } |
| 1004 | 989 |
| 1005 TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) { | 990 TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) { |
| 1006 std::unique_ptr<SpdySerializedFrame> req( | 991 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1007 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 1008 // Empty DATA frame with an END_STREAM flag. | 992 // Empty DATA frame with an END_STREAM flag. |
| 1009 std::unique_ptr<SpdySerializedFrame> end_stream( | 993 SpdySerializedFrame end_stream( |
| 1010 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 994 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); |
| 1011 | 995 |
| 1012 MockWrite writes[] = { | 996 MockWrite writes[] = { |
| 1013 CreateMockWrite(*req.get(), 0), | 997 CreateMockWrite(req, 0), |
| 1014 }; | 998 }; |
| 1015 | 999 |
| 1016 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1000 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 1017 | 1001 |
| 1018 std::unique_ptr<SpdySerializedFrame> resp( | 1002 SpdySerializedFrame resp( |
| 1019 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1003 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
| 1020 | 1004 |
| 1021 std::unique_ptr<SpdySerializedFrame> body_frame( | 1005 SpdySerializedFrame body_frame(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1022 spdy_util_.ConstructSpdyBodyFrame(1, false)); | |
| 1023 | 1006 |
| 1024 SpdyHeaderBlock trailers; | 1007 SpdyHeaderBlock trailers; |
| 1025 trailers["foo"] = "bar"; | 1008 trailers["foo"] = "bar"; |
| 1026 std::unique_ptr<SpdySerializedFrame> response_trailers( | 1009 SpdySerializedFrame response_trailers( |
| 1027 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); | 1010 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); |
| 1028 | 1011 |
| 1029 MockRead reads[] = { | 1012 MockRead reads[] = { |
| 1030 CreateMockRead(*resp, 1), | 1013 CreateMockRead(resp, 1), |
| 1031 CreateMockRead(*body_frame, 2), | 1014 CreateMockRead(body_frame, 2), |
| 1032 CreateMockRead(*body_frame, 3), | 1015 CreateMockRead(body_frame, 3), |
| 1033 CreateMockRead(*body_frame, 4), | 1016 CreateMockRead(body_frame, 4), |
| 1034 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. | 1017 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. |
| 1035 CreateMockRead(*response_trailers, 6), | 1018 CreateMockRead(response_trailers, 6), |
| 1036 MockRead(SYNCHRONOUS, 0, 7), | 1019 MockRead(SYNCHRONOUS, 0, 7), |
| 1037 }; | 1020 }; |
| 1038 | 1021 |
| 1039 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1022 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1040 | 1023 |
| 1041 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1024 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 1042 MockTimer* timer = new MockTimer(); | 1025 MockTimer* timer = new MockTimer(); |
| 1043 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 1026 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
| 1044 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 1027 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
| 1045 | 1028 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1076 EXPECT_EQ("bar", delegate->trailers().find("foo")->second); | 1059 EXPECT_EQ("bar", delegate->trailers().find("foo")->second); |
| 1077 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1060 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1078 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 1061 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1079 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 1062 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
| 1080 delegate->GetTotalSentBytes()); | 1063 delegate->GetTotalSentBytes()); |
| 1081 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 1064 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 1082 delegate->GetTotalReceivedBytes()); | 1065 delegate->GetTotalReceivedBytes()); |
| 1083 } | 1066 } |
| 1084 | 1067 |
| 1085 TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { | 1068 TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { |
| 1086 BufferedSpdyFramer framer; | 1069 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1087 | |
| 1088 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | |
| 1089 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 1070 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
| 1090 std::unique_ptr<SpdySerializedFrame> data_frame( | 1071 SpdySerializedFrame data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 1091 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | 1072 1, kBodyData, kBodyDataSize, /*fin=*/false)); |
| 1092 std::unique_ptr<SpdySerializedFrame> rst( | 1073 SpdySerializedFrame rst( |
| 1093 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1074 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1094 | 1075 |
| 1095 MockWrite writes[] = { | 1076 MockWrite writes[] = { |
| 1096 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), | 1077 CreateMockWrite(req, 0), CreateMockWrite(data_frame, 3), |
| 1097 CreateMockWrite(*rst, 5), | 1078 CreateMockWrite(rst, 5), |
| 1098 }; | 1079 }; |
| 1099 | 1080 |
| 1100 std::unique_ptr<SpdySerializedFrame> resp( | 1081 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 1101 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1082 SpdySerializedFrame response_body_frame( |
| 1102 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 1083 spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1103 spdy_util_.ConstructSpdyBodyFrame(1, false)); | |
| 1104 | 1084 |
| 1105 MockRead reads[] = { | 1085 MockRead reads[] = { |
| 1106 CreateMockRead(*resp, 1), | 1086 CreateMockRead(resp, 1), |
| 1107 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 1087 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
| 1108 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. | 1088 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. |
| 1109 MockRead(ASYNC, 0, 6), | 1089 MockRead(ASYNC, 0, 6), |
| 1110 }; | 1090 }; |
| 1111 | 1091 |
| 1112 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1092 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1113 | 1093 |
| 1114 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1094 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1115 new BidirectionalStreamRequestInfo); | 1095 new BidirectionalStreamRequestInfo); |
| 1116 request_info->method = "POST"; | 1096 request_info->method = "POST"; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1143 EXPECT_EQ(0, delegate->on_data_read_count()); | 1123 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 1144 // EXPECT_EQ(1, delegate->on_data_send_count()); | 1124 // EXPECT_EQ(1, delegate->on_data_send_count()); |
| 1145 // OnDataSent may or may not have been invoked. | 1125 // OnDataSent may or may not have been invoked. |
| 1146 // Calling after stream is canceled gives kProtoUnknown. | 1126 // Calling after stream is canceled gives kProtoUnknown. |
| 1147 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1127 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
| 1148 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1128 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
| 1149 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1129 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
| 1150 } | 1130 } |
| 1151 | 1131 |
| 1152 TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { | 1132 TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { |
| 1153 BufferedSpdyFramer framer; | 1133 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1154 | |
| 1155 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | |
| 1156 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 1134 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
| 1157 std::unique_ptr<SpdySerializedFrame> data_frame( | 1135 SpdySerializedFrame rst( |
| 1158 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | |
| 1159 std::unique_ptr<SpdySerializedFrame> rst( | |
| 1160 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1136 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1161 | 1137 |
| 1162 MockWrite writes[] = { | 1138 MockWrite writes[] = { |
| 1163 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), | 1139 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), |
| 1164 }; | 1140 }; |
| 1165 | 1141 |
| 1166 std::unique_ptr<SpdySerializedFrame> resp( | 1142 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 1167 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1143 SpdySerializedFrame response_body_frame( |
| 1168 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 1144 spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1169 spdy_util_.ConstructSpdyBodyFrame(1, false)); | |
| 1170 | 1145 |
| 1171 MockRead reads[] = { | 1146 MockRead reads[] = { |
| 1172 CreateMockRead(*resp, 1), | 1147 CreateMockRead(resp, 1), |
| 1173 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 1148 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
| 1174 CreateMockRead(*response_body_frame, 3), MockRead(ASYNC, 0, 5), | 1149 CreateMockRead(response_body_frame, 3), MockRead(ASYNC, 0, 5), |
| 1175 }; | 1150 }; |
| 1176 | 1151 |
| 1177 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1152 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1178 | 1153 |
| 1179 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1154 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1180 new BidirectionalStreamRequestInfo); | 1155 new BidirectionalStreamRequestInfo); |
| 1181 request_info->method = "POST"; | 1156 request_info->method = "POST"; |
| 1182 request_info->url = default_url_; | 1157 request_info->url = default_url_; |
| 1183 request_info->priority = LOWEST; | 1158 request_info->priority = LOWEST; |
| 1184 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 1159 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1205 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1180 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1206 // Calling after stream is canceled gives kProtoUnknown. | 1181 // Calling after stream is canceled gives kProtoUnknown. |
| 1207 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1182 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
| 1208 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1183 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
| 1209 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1184 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
| 1210 } | 1185 } |
| 1211 | 1186 |
| 1212 // Receiving a header with uppercase ASCII will result in a protocol error, | 1187 // Receiving a header with uppercase ASCII will result in a protocol error, |
| 1213 // which should be propagated via Delegate::OnFailed. | 1188 // which should be propagated via Delegate::OnFailed. |
| 1214 TEST_F(BidirectionalStreamTest, PropagateProtocolError) { | 1189 TEST_F(BidirectionalStreamTest, PropagateProtocolError) { |
| 1215 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 1190 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1216 kDefaultUrl, 1, kBodyDataSize * 3, LOW, nullptr, 0)); | 1191 kDefaultUrl, 1, kBodyDataSize * 3, LOW, nullptr, 0)); |
| 1217 std::unique_ptr<SpdySerializedFrame> rst( | 1192 SpdySerializedFrame rst( |
| 1218 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1193 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 1219 | 1194 |
| 1220 MockWrite writes[] = { | 1195 MockWrite writes[] = { |
| 1221 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), | 1196 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), |
| 1222 }; | 1197 }; |
| 1223 | 1198 |
| 1224 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 1199 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| 1225 std::unique_ptr<SpdySerializedFrame> resp( | 1200 SpdySerializedFrame resp( |
| 1226 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); | 1201 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); |
| 1227 | 1202 |
| 1228 MockRead reads[] = { | 1203 MockRead reads[] = { |
| 1229 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), | 1204 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), |
| 1230 }; | 1205 }; |
| 1231 | 1206 |
| 1232 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1207 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1233 | 1208 |
| 1234 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1209 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1235 new BidirectionalStreamRequestInfo); | 1210 new BidirectionalStreamRequestInfo); |
| 1236 request_info->method = "POST"; | 1211 request_info->method = "POST"; |
| 1237 request_info->url = default_url_; | 1212 request_info->url = default_url_; |
| 1238 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 1213 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
| 1239 base::SizeTToString(kBodyDataSize * 3)); | 1214 base::SizeTToString(kBodyDataSize * 3)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1275 int net_error = OK; | 1250 int net_error = OK; |
| 1276 EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error)); | 1251 EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error)); |
| 1277 EXPECT_THAT(net_error, IsError(ERR_SPDY_PROTOCOL_ERROR)); | 1252 EXPECT_THAT(net_error, IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 1278 } | 1253 } |
| 1279 | 1254 |
| 1280 INSTANTIATE_TEST_CASE_P(CancelOrDeleteTests, | 1255 INSTANTIATE_TEST_CASE_P(CancelOrDeleteTests, |
| 1281 BidirectionalStreamTest, | 1256 BidirectionalStreamTest, |
| 1282 ::testing::Values(true, false)); | 1257 ::testing::Values(true, false)); |
| 1283 | 1258 |
| 1284 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { | 1259 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { |
| 1285 std::unique_ptr<SpdySerializedFrame> req( | 1260 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1286 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 1287 | 1261 |
| 1288 std::unique_ptr<SpdySerializedFrame> rst( | 1262 SpdySerializedFrame rst( |
| 1289 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1263 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1290 MockWrite writes[] = { | 1264 MockWrite writes[] = { |
| 1291 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), | 1265 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), |
| 1292 }; | 1266 }; |
| 1293 | 1267 |
| 1294 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1268 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 1295 | 1269 |
| 1296 std::unique_ptr<SpdySerializedFrame> resp( | 1270 SpdySerializedFrame resp( |
| 1297 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1271 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
| 1298 | 1272 |
| 1299 MockRead reads[] = { | 1273 MockRead reads[] = { |
| 1300 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), | 1274 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), |
| 1301 }; | 1275 }; |
| 1302 | 1276 |
| 1303 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1277 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1304 | 1278 |
| 1305 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1279 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1306 new BidirectionalStreamRequestInfo); | 1280 new BidirectionalStreamRequestInfo); |
| 1307 request_info->method = "GET"; | 1281 request_info->method = "GET"; |
| 1308 request_info->url = default_url_; | 1282 request_info->url = default_url_; |
| 1309 request_info->priority = LOWEST; | 1283 request_info->priority = LOWEST; |
| 1310 request_info->end_stream_on_headers = true; | 1284 request_info->end_stream_on_headers = true; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1328 | 1302 |
| 1329 // If stream is destroyed, do not call into stream. | 1303 // If stream is destroyed, do not call into stream. |
| 1330 if (!GetParam()) | 1304 if (!GetParam()) |
| 1331 return; | 1305 return; |
| 1332 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1306 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
| 1333 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1307 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
| 1334 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1308 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
| 1335 } | 1309 } |
| 1336 | 1310 |
| 1337 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { | 1311 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { |
| 1338 std::unique_ptr<SpdySerializedFrame> req( | 1312 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1339 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 1340 | 1313 |
| 1341 std::unique_ptr<SpdySerializedFrame> rst( | 1314 SpdySerializedFrame rst( |
| 1342 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1315 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1343 MockWrite writes[] = { | 1316 MockWrite writes[] = { |
| 1344 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3), | 1317 CreateMockWrite(req, 0), CreateMockWrite(rst, 3), |
| 1345 }; | 1318 }; |
| 1346 | 1319 |
| 1347 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1320 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 1348 | 1321 |
| 1349 std::unique_ptr<SpdySerializedFrame> resp( | 1322 SpdySerializedFrame resp( |
| 1350 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1323 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
| 1351 | 1324 |
| 1352 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 1325 SpdySerializedFrame response_body_frame( |
| 1353 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 1326 spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1354 | 1327 |
| 1355 MockRead reads[] = { | 1328 MockRead reads[] = { |
| 1356 CreateMockRead(*resp, 1), CreateMockRead(*response_body_frame, 2), | 1329 CreateMockRead(resp, 1), CreateMockRead(response_body_frame, 2), |
| 1357 MockRead(ASYNC, 0, 4), | 1330 MockRead(ASYNC, 0, 4), |
| 1358 }; | 1331 }; |
| 1359 | 1332 |
| 1360 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1333 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1361 | 1334 |
| 1362 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1335 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1363 new BidirectionalStreamRequestInfo); | 1336 new BidirectionalStreamRequestInfo); |
| 1364 request_info->method = "GET"; | 1337 request_info->method = "GET"; |
| 1365 request_info->url = default_url_; | 1338 request_info->url = default_url_; |
| 1366 request_info->priority = LOWEST; | 1339 request_info->priority = LOWEST; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1384 | 1357 |
| 1385 // If stream is destroyed, do not call into stream. | 1358 // If stream is destroyed, do not call into stream. |
| 1386 if (!GetParam()) | 1359 if (!GetParam()) |
| 1387 return; | 1360 return; |
| 1388 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1361 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
| 1389 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1362 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
| 1390 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1363 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
| 1391 } | 1364 } |
| 1392 | 1365 |
| 1393 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { | 1366 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { |
| 1394 std::unique_ptr<SpdySerializedFrame> req( | 1367 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1395 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 1396 | 1368 |
| 1397 std::unique_ptr<SpdySerializedFrame> rst( | 1369 SpdySerializedFrame rst( |
| 1398 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1370 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1399 MockWrite writes[] = { | 1371 MockWrite writes[] = { |
| 1400 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), | 1372 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), |
| 1401 }; | 1373 }; |
| 1402 | 1374 |
| 1403 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1375 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 1404 | 1376 |
| 1405 std::unique_ptr<SpdySerializedFrame> resp( | 1377 SpdySerializedFrame resp( |
| 1406 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1378 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
| 1407 | 1379 |
| 1408 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 1380 SpdySerializedFrame response_body_frame( |
| 1409 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 1381 spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1410 | 1382 |
| 1411 SpdyHeaderBlock trailers; | 1383 SpdyHeaderBlock trailers; |
| 1412 trailers["foo"] = "bar"; | 1384 trailers["foo"] = "bar"; |
| 1413 std::unique_ptr<SpdySerializedFrame> response_trailers( | 1385 SpdySerializedFrame response_trailers( |
| 1414 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); | 1386 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); |
| 1415 | 1387 |
| 1416 MockRead reads[] = { | 1388 MockRead reads[] = { |
| 1417 CreateMockRead(*resp, 1), CreateMockRead(*response_body_frame, 2), | 1389 CreateMockRead(resp, 1), CreateMockRead(response_body_frame, 2), |
| 1418 CreateMockRead(*response_trailers, 3), MockRead(ASYNC, 0, 5), | 1390 CreateMockRead(response_trailers, 3), MockRead(ASYNC, 0, 5), |
| 1419 }; | 1391 }; |
| 1420 | 1392 |
| 1421 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1393 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1422 | 1394 |
| 1423 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1395 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1424 new BidirectionalStreamRequestInfo); | 1396 new BidirectionalStreamRequestInfo); |
| 1425 request_info->method = "GET"; | 1397 request_info->method = "GET"; |
| 1426 request_info->url = default_url_; | 1398 request_info->url = default_url_; |
| 1427 request_info->priority = LOWEST; | 1399 request_info->priority = LOWEST; |
| 1428 request_info->end_stream_on_headers = true; | 1400 request_info->end_stream_on_headers = true; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1447 | 1419 |
| 1448 // If stream is destroyed, do not call into stream. | 1420 // If stream is destroyed, do not call into stream. |
| 1449 if (!GetParam()) | 1421 if (!GetParam()) |
| 1450 return; | 1422 return; |
| 1451 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1423 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
| 1452 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1424 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
| 1453 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1425 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
| 1454 } | 1426 } |
| 1455 | 1427 |
| 1456 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { | 1428 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { |
| 1457 std::unique_ptr<SpdySerializedFrame> req( | 1429 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1458 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 1459 | 1430 |
| 1460 std::unique_ptr<SpdySerializedFrame> rst( | 1431 SpdySerializedFrame rst( |
| 1461 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1432 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 1462 | 1433 |
| 1463 MockWrite writes[] = { | 1434 MockWrite writes[] = { |
| 1464 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), | 1435 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), |
| 1465 }; | 1436 }; |
| 1466 | 1437 |
| 1467 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 1438 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| 1468 std::unique_ptr<SpdySerializedFrame> resp( | 1439 SpdySerializedFrame resp( |
| 1469 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); | 1440 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); |
| 1470 | 1441 |
| 1471 MockRead reads[] = { | 1442 MockRead reads[] = { |
| 1472 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), | 1443 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), |
| 1473 }; | 1444 }; |
| 1474 | 1445 |
| 1475 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1446 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1476 | 1447 |
| 1477 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1448 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1478 new BidirectionalStreamRequestInfo); | 1449 new BidirectionalStreamRequestInfo); |
| 1479 request_info->method = "GET"; | 1450 request_info->method = "GET"; |
| 1480 request_info->url = default_url_; | 1451 request_info->url = default_url_; |
| 1481 request_info->priority = LOWEST; | 1452 request_info->priority = LOWEST; |
| 1482 request_info->end_stream_on_headers = true; | 1453 request_info->end_stream_on_headers = true; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1498 | 1469 |
| 1499 // If stream is destroyed, do not call into stream. | 1470 // If stream is destroyed, do not call into stream. |
| 1500 if (!GetParam()) | 1471 if (!GetParam()) |
| 1501 return; | 1472 return; |
| 1502 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1473 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
| 1503 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1474 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
| 1504 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1475 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
| 1505 } | 1476 } |
| 1506 | 1477 |
| 1507 TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { | 1478 TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { |
| 1508 std::unique_ptr<SpdySerializedFrame> req( | 1479 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1509 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | |
| 1510 // Empty DATA frame with an END_STREAM flag. | 1480 // Empty DATA frame with an END_STREAM flag. |
| 1511 std::unique_ptr<SpdySerializedFrame> end_stream( | 1481 SpdySerializedFrame end_stream( |
| 1512 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 1482 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); |
| 1513 | 1483 |
| 1514 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; | 1484 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 1515 | 1485 |
| 1516 std::string alt_svc_header_value = AlternateProtocolToString(QUIC); | 1486 std::string alt_svc_header_value = AlternateProtocolToString(QUIC); |
| 1517 alt_svc_header_value.append("=\"www.example.org:443\""); | 1487 alt_svc_header_value.append("=\"www.example.org:443\""); |
| 1518 const char* const kExtraResponseHeaders[] = {"alt-svc", | 1488 const char* const kExtraResponseHeaders[] = {"alt-svc", |
| 1519 alt_svc_header_value.c_str()}; | 1489 alt_svc_header_value.c_str()}; |
| 1520 | 1490 |
| 1521 std::unique_ptr<SpdySerializedFrame> resp( | 1491 SpdySerializedFrame resp( |
| 1522 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1492 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
| 1523 std::unique_ptr<SpdySerializedFrame> body_frame( | 1493 SpdySerializedFrame body_frame(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1524 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 1525 | 1494 |
| 1526 MockRead reads[] = { | 1495 MockRead reads[] = { |
| 1527 CreateMockRead(*resp, 1), CreateMockRead(*body_frame, 2), | 1496 CreateMockRead(resp, 1), CreateMockRead(body_frame, 2), |
| 1528 MockRead(SYNCHRONOUS, 0, 3), | 1497 MockRead(SYNCHRONOUS, 0, 3), |
| 1529 }; | 1498 }; |
| 1530 | 1499 |
| 1531 // Enable QUIC so that the alternative service header can be added to | 1500 // Enable QUIC so that the alternative service header can be added to |
| 1532 // HttpServerProperties. | 1501 // HttpServerProperties. |
| 1533 session_deps_.enable_quic = true; | 1502 session_deps_.enable_quic = true; |
| 1534 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1503 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1535 | 1504 |
| 1536 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1505 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1537 new BidirectionalStreamRequestInfo); | 1506 new BidirectionalStreamRequestInfo); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1562 http_session_->http_server_properties()->GetAlternativeServices( | 1531 http_session_->http_server_properties()->GetAlternativeServices( |
| 1563 url::SchemeHostPort(default_url_)); | 1532 url::SchemeHostPort(default_url_)); |
| 1564 ASSERT_EQ(1u, alternative_service_vector.size()); | 1533 ASSERT_EQ(1u, alternative_service_vector.size()); |
| 1565 EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3), | 1534 EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3), |
| 1566 alternative_service_vector[0].protocol); | 1535 alternative_service_vector[0].protocol); |
| 1567 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); | 1536 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); |
| 1568 EXPECT_EQ(443, alternative_service_vector[0].port); | 1537 EXPECT_EQ(443, alternative_service_vector[0].port); |
| 1569 } | 1538 } |
| 1570 | 1539 |
| 1571 } // namespace net | 1540 } // namespace net |
| OLD | NEW |