| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/quic/quic_spdy_stream.h" | 5 #include "net/quic/quic_spdy_stream.h" |
| 6 | 6 |
| 7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
| 8 | 8 |
| 9 #include "net/quic/quic_connection.h" | 9 #include "net/quic/quic_connection.h" |
| 10 #include "net/quic/quic_utils.h" | 10 #include "net/quic/quic_utils.h" |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 EXPECT_EQ(kWindow, QuicFlowControllerPeer::SendWindowOffset( | 356 EXPECT_EQ(kWindow, QuicFlowControllerPeer::SendWindowOffset( |
| 357 stream_->flow_controller())); | 357 stream_->flow_controller())); |
| 358 | 358 |
| 359 // Try to send more data than the flow control limit allows. | 359 // Try to send more data than the flow control limit allows. |
| 360 string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 360 string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); |
| 361 string body; | 361 string body; |
| 362 const uint64_t kOverflow = 15; | 362 const uint64_t kOverflow = 15; |
| 363 GenerateBody(&body, kWindow + kOverflow); | 363 GenerateBody(&body, kWindow + kOverflow); |
| 364 | 364 |
| 365 EXPECT_CALL(*connection_, SendBlocked(kClientDataStreamId1)); | 365 EXPECT_CALL(*connection_, SendBlocked(kClientDataStreamId1)); |
| 366 EXPECT_CALL(*session_, WritevData(kClientDataStreamId1, _, _, _, _, _)) | 366 EXPECT_CALL(*session_, WritevData(kClientDataStreamId1, _, _, _, _)) |
| 367 .WillOnce(Return(QuicConsumedData(kWindow, true))); | 367 .WillOnce(Return(QuicConsumedData(kWindow, true))); |
| 368 stream_->WriteOrBufferData(body, false, nullptr); | 368 stream_->WriteOrBufferData(body, false, nullptr); |
| 369 | 369 |
| 370 // Should have sent as much as possible, resulting in no send window left. | 370 // Should have sent as much as possible, resulting in no send window left. |
| 371 EXPECT_EQ(0u, | 371 EXPECT_EQ(0u, |
| 372 QuicFlowControllerPeer::SendWindowSize(stream_->flow_controller())); | 372 QuicFlowControllerPeer::SendWindowSize(stream_->flow_controller())); |
| 373 | 373 |
| 374 // And we should have queued the overflowed data. | 374 // And we should have queued the overflowed data. |
| 375 EXPECT_EQ(kOverflow, ReliableQuicStreamPeer::SizeOfQueuedData(stream_)); | 375 EXPECT_EQ(kOverflow, ReliableQuicStreamPeer::SizeOfQueuedData(stream_)); |
| 376 } | 376 } |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 // Set a flow control limit of zero. | 602 // Set a flow control limit of zero. |
| 603 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 0); | 603 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 0); |
| 604 EXPECT_EQ(0u, QuicFlowControllerPeer::ReceiveWindowOffset( | 604 EXPECT_EQ(0u, QuicFlowControllerPeer::ReceiveWindowOffset( |
| 605 stream_->flow_controller())); | 605 stream_->flow_controller())); |
| 606 | 606 |
| 607 // Send a frame with a FIN but no data. This should not be blocked. | 607 // Send a frame with a FIN but no data. This should not be blocked. |
| 608 string body = ""; | 608 string body = ""; |
| 609 bool fin = true; | 609 bool fin = true; |
| 610 | 610 |
| 611 EXPECT_CALL(*connection_, SendBlocked(kClientDataStreamId1)).Times(0); | 611 EXPECT_CALL(*connection_, SendBlocked(kClientDataStreamId1)).Times(0); |
| 612 EXPECT_CALL(*session_, WritevData(kClientDataStreamId1, _, _, _, _, _)) | 612 EXPECT_CALL(*session_, WritevData(kClientDataStreamId1, _, _, _, _)) |
| 613 .WillOnce(Return(QuicConsumedData(0, fin))); | 613 .WillOnce(Return(QuicConsumedData(0, fin))); |
| 614 | 614 |
| 615 stream_->WriteOrBufferData(body, fin, nullptr); | 615 stream_->WriteOrBufferData(body, fin, nullptr); |
| 616 } | 616 } |
| 617 | 617 |
| 618 TEST_P(QuicSpdyStreamTest, ReceivingTrailers) { | 618 TEST_P(QuicSpdyStreamTest, ReceivingTrailers) { |
| 619 // Test that receiving trailing headers from the peer works, and can be read | 619 // Test that receiving trailing headers from the peer works, and can be read |
| 620 // from the stream and consumed. | 620 // from the stream and consumed. |
| 621 Initialize(kShouldProcessData); | 621 Initialize(kShouldProcessData); |
| 622 | 622 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 QuicStreamFrame frame(kClientDataStreamId1, /*fin=*/true, 0, kBody); | 725 QuicStreamFrame frame(kClientDataStreamId1, /*fin=*/true, 0, kBody); |
| 726 stream_->OnStreamFrame(frame); | 726 stream_->OnStreamFrame(frame); |
| 727 | 727 |
| 728 EXPECT_TRUE(stream_->IsDoneReading()); | 728 EXPECT_TRUE(stream_->IsDoneReading()); |
| 729 } | 729 } |
| 730 | 730 |
| 731 TEST_P(QuicSpdyStreamTest, WritingTrailersSendsAFin) { | 731 TEST_P(QuicSpdyStreamTest, WritingTrailersSendsAFin) { |
| 732 // Test that writing trailers will send a FIN, as Trailers are the last thing | 732 // Test that writing trailers will send a FIN, as Trailers are the last thing |
| 733 // to be sent on a stream. | 733 // to be sent on a stream. |
| 734 Initialize(kShouldProcessData); | 734 Initialize(kShouldProcessData); |
| 735 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) | 735 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)) |
| 736 .Times(AnyNumber()) | 736 .Times(AnyNumber()) |
| 737 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); | 737 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); |
| 738 | 738 |
| 739 // Write the initial headers, without a FIN. | 739 // Write the initial headers, without a FIN. |
| 740 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); | 740 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); |
| 741 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr); | 741 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr); |
| 742 | 742 |
| 743 // Writing trailers implicitly sends a FIN. | 743 // Writing trailers implicitly sends a FIN. |
| 744 SpdyHeaderBlock trailers; | 744 SpdyHeaderBlock trailers; |
| 745 trailers["trailer key"] = "trailer value"; | 745 trailers["trailer key"] = "trailer value"; |
| 746 EXPECT_CALL(*session_, WriteHeaders(_, _, | 746 EXPECT_CALL(*session_, WriteHeaders(_, _, |
| 747 /*fin=*/true, _, _)); | 747 /*fin=*/true, _, _)); |
| 748 stream_->WriteTrailers(trailers, nullptr); | 748 stream_->WriteTrailers(trailers, nullptr); |
| 749 EXPECT_TRUE(stream_->fin_sent()); | 749 EXPECT_TRUE(stream_->fin_sent()); |
| 750 } | 750 } |
| 751 | 751 |
| 752 TEST_P(QuicSpdyStreamTest, WritingTrailersFinalOffset) { | 752 TEST_P(QuicSpdyStreamTest, WritingTrailersFinalOffset) { |
| 753 // Test that when writing trailers, the trailers that are actually sent to the | 753 // Test that when writing trailers, the trailers that are actually sent to the |
| 754 // peer contain the final offset field indicating last byte of data. | 754 // peer contain the final offset field indicating last byte of data. |
| 755 Initialize(kShouldProcessData); | 755 Initialize(kShouldProcessData); |
| 756 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) | 756 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)) |
| 757 .Times(AnyNumber()) | 757 .Times(AnyNumber()) |
| 758 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); | 758 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); |
| 759 | 759 |
| 760 // Write the initial headers. | 760 // Write the initial headers. |
| 761 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); | 761 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); |
| 762 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr); | 762 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr); |
| 763 | 763 |
| 764 // Write non-zero body data to force a non-zero final offset. | 764 // Write non-zero body data to force a non-zero final offset. |
| 765 const int kBodySize = 1 * 1024; // 1 MB | 765 const int kBodySize = 1 * 1024; // 1 MB |
| 766 stream_->WriteOrBufferData(string(kBodySize, 'x'), false, nullptr); | 766 stream_->WriteOrBufferData(string(kBodySize, 'x'), false, nullptr); |
| 767 | 767 |
| 768 // The final offset field in the trailing headers is populated with the | 768 // The final offset field in the trailing headers is populated with the |
| 769 // number of body bytes written (including queued bytes). | 769 // number of body bytes written (including queued bytes). |
| 770 SpdyHeaderBlock trailers; | 770 SpdyHeaderBlock trailers; |
| 771 trailers["trailer key"] = "trailer value"; | 771 trailers["trailer key"] = "trailer value"; |
| 772 SpdyHeaderBlock trailers_with_offset = trailers; | 772 SpdyHeaderBlock trailers_with_offset = trailers; |
| 773 trailers_with_offset[kFinalOffsetHeaderKey] = base::IntToString(kBodySize); | 773 trailers_with_offset[kFinalOffsetHeaderKey] = base::IntToString(kBodySize); |
| 774 EXPECT_CALL(*session_, WriteHeaders(_, testing::Eq(trailers_with_offset), | 774 EXPECT_CALL(*session_, WriteHeaders(_, testing::Eq(trailers_with_offset), |
| 775 /*fin=*/true, _, _)); | 775 /*fin=*/true, _, _)); |
| 776 stream_->WriteTrailers(trailers, nullptr); | 776 stream_->WriteTrailers(trailers, nullptr); |
| 777 } | 777 } |
| 778 | 778 |
| 779 TEST_P(QuicSpdyStreamTest, WritingTrailersClosesWriteSide) { | 779 TEST_P(QuicSpdyStreamTest, WritingTrailersClosesWriteSide) { |
| 780 // Test that if trailers are written after all other data has been written | 780 // Test that if trailers are written after all other data has been written |
| 781 // (headers and body), that this closes the stream for writing. | 781 // (headers and body), that this closes the stream for writing. |
| 782 Initialize(kShouldProcessData); | 782 Initialize(kShouldProcessData); |
| 783 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) | 783 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)) |
| 784 .Times(AnyNumber()) | 784 .Times(AnyNumber()) |
| 785 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); | 785 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); |
| 786 | 786 |
| 787 // Write the initial headers. | 787 // Write the initial headers. |
| 788 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); | 788 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); |
| 789 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr); | 789 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr); |
| 790 | 790 |
| 791 // Write non-zero body data. | 791 // Write non-zero body data. |
| 792 const int kBodySize = 1 * 1024; // 1 MB | 792 const int kBodySize = 1 * 1024; // 1 MB |
| 793 stream_->WriteOrBufferData(string(kBodySize, 'x'), false, nullptr); | 793 stream_->WriteOrBufferData(string(kBodySize, 'x'), false, nullptr); |
| 794 EXPECT_EQ(0u, stream_->queued_data_bytes()); | 794 EXPECT_EQ(0u, stream_->queued_data_bytes()); |
| 795 | 795 |
| 796 // Headers and body have been fully written, there is no queued data. Writing | 796 // Headers and body have been fully written, there is no queued data. Writing |
| 797 // trailers marks the end of this stream, and thus the write side is closed. | 797 // trailers marks the end of this stream, and thus the write side is closed. |
| 798 EXPECT_CALL(*session_, WriteHeaders(_, _, | 798 EXPECT_CALL(*session_, WriteHeaders(_, _, |
| 799 /*fin=*/true, _, _)); | 799 /*fin=*/true, _, _)); |
| 800 stream_->WriteTrailers(SpdyHeaderBlock(), nullptr); | 800 stream_->WriteTrailers(SpdyHeaderBlock(), nullptr); |
| 801 EXPECT_TRUE(stream_->write_side_closed()); | 801 EXPECT_TRUE(stream_->write_side_closed()); |
| 802 } | 802 } |
| 803 | 803 |
| 804 TEST_P(QuicSpdyStreamTest, WritingTrailersWithQueuedBytes) { | 804 TEST_P(QuicSpdyStreamTest, WritingTrailersWithQueuedBytes) { |
| 805 // Test that the stream is not closed for writing when trailers are sent | 805 // Test that the stream is not closed for writing when trailers are sent |
| 806 // while there are still body bytes queued. | 806 // while there are still body bytes queued. |
| 807 Initialize(kShouldProcessData); | 807 Initialize(kShouldProcessData); |
| 808 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) | 808 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)) |
| 809 .Times(AnyNumber()) | 809 .Times(AnyNumber()) |
| 810 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); | 810 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); |
| 811 | 811 |
| 812 // Write the initial headers. | 812 // Write the initial headers. |
| 813 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); | 813 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); |
| 814 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr); | 814 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr); |
| 815 | 815 |
| 816 // Write non-zero body data, but only consume partially, ensuring queueing. | 816 // Write non-zero body data, but only consume partially, ensuring queueing. |
| 817 const int kBodySize = 1 * 1024; // 1 MB | 817 const int kBodySize = 1 * 1024; // 1 MB |
| 818 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) | 818 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)) |
| 819 .WillOnce(Return(QuicConsumedData(kBodySize - 1, false))); | 819 .WillOnce(Return(QuicConsumedData(kBodySize - 1, false))); |
| 820 stream_->WriteOrBufferData(string(kBodySize, 'x'), false, nullptr); | 820 stream_->WriteOrBufferData(string(kBodySize, 'x'), false, nullptr); |
| 821 EXPECT_EQ(1u, stream_->queued_data_bytes()); | 821 EXPECT_EQ(1u, stream_->queued_data_bytes()); |
| 822 | 822 |
| 823 // Writing trailers will send a FIN, but not close the write side of the | 823 // Writing trailers will send a FIN, but not close the write side of the |
| 824 // stream as there are queued bytes. | 824 // stream as there are queued bytes. |
| 825 EXPECT_CALL(*session_, WriteHeaders(_, _, | 825 EXPECT_CALL(*session_, WriteHeaders(_, _, |
| 826 /*fin=*/true, _, _)); | 826 /*fin=*/true, _, _)); |
| 827 stream_->WriteTrailers(SpdyHeaderBlock(), nullptr); | 827 stream_->WriteTrailers(SpdyHeaderBlock(), nullptr); |
| 828 EXPECT_TRUE(stream_->fin_sent()); | 828 EXPECT_TRUE(stream_->fin_sent()); |
| 829 EXPECT_FALSE(stream_->write_side_closed()); | 829 EXPECT_FALSE(stream_->write_side_closed()); |
| 830 } | 830 } |
| 831 | 831 |
| 832 TEST_P(QuicSpdyStreamTest, WritingTrailersAfterFIN) { | 832 TEST_P(QuicSpdyStreamTest, WritingTrailersAfterFIN) { |
| 833 // Test that it is not possible to write Trailers after a FIN has been sent. | 833 // Test that it is not possible to write Trailers after a FIN has been sent. |
| 834 Initialize(kShouldProcessData); | 834 Initialize(kShouldProcessData); |
| 835 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) | 835 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)) |
| 836 .Times(AnyNumber()) | 836 .Times(AnyNumber()) |
| 837 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); | 837 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); |
| 838 | 838 |
| 839 // Write the initial headers, with a FIN. | 839 // Write the initial headers, with a FIN. |
| 840 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); | 840 EXPECT_CALL(*session_, WriteHeaders(_, _, _, _, _)); |
| 841 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/true, nullptr); | 841 stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/true, nullptr); |
| 842 EXPECT_TRUE(stream_->fin_sent()); | 842 EXPECT_TRUE(stream_->fin_sent()); |
| 843 | 843 |
| 844 // Writing Trailers should fail, as the FIN has already been sent. | 844 // Writing Trailers should fail, as the FIN has already been sent. |
| 845 // populated with the number of body bytes written. | 845 // populated with the number of body bytes written. |
| 846 EXPECT_DFATAL(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr), | 846 EXPECT_DFATAL(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr), |
| 847 "Trailers cannot be sent after a FIN"); | 847 "Trailers cannot be sent after a FIN"); |
| 848 } | 848 } |
| 849 | 849 |
| 850 } // namespace | 850 } // namespace |
| 851 } // namespace test | 851 } // namespace test |
| 852 } // namespace net | 852 } // namespace net |
| OLD | NEW |