| 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 "net/quic/reliable_quic_stream.h" | 5 #include "net/quic/reliable_quic_stream.h" |
| 6 | 6 |
| 7 #include "net/quic/quic_connection.h" | 7 #include "net/quic/quic_connection.h" |
| 8 #include "net/quic/quic_flags.h" | 8 #include "net/quic/quic_flags.h" |
| 9 #include "net/quic/quic_utils.h" | 9 #include "net/quic/quic_utils.h" |
| 10 #include "net/quic/quic_write_blocked_list.h" | 10 #include "net/quic/quic_write_blocked_list.h" |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 | 597 |
| 598 // Receive a stream frame that violates flow control: the byte offset is | 598 // Receive a stream frame that violates flow control: the byte offset is |
| 599 // higher than the receive window offset. | 599 // higher than the receive window offset. |
| 600 QuicStreamFrame frame(stream_->id(), false, | 600 QuicStreamFrame frame(stream_->id(), false, |
| 601 kInitialSessionFlowControlWindowForTest + 1, | 601 kInitialSessionFlowControlWindowForTest + 1, |
| 602 StringPiece(".")); | 602 StringPiece(".")); |
| 603 EXPECT_GT(frame.offset, QuicFlowControllerPeer::ReceiveWindowOffset( | 603 EXPECT_GT(frame.offset, QuicFlowControllerPeer::ReceiveWindowOffset( |
| 604 stream_->flow_controller())); | 604 stream_->flow_controller())); |
| 605 | 605 |
| 606 // Stream should not accept the frame, and the connection should be closed. | 606 // Stream should not accept the frame, and the connection should be closed. |
| 607 EXPECT_CALL(*connection_, | 607 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( |
| 608 SendConnectionClose(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA)); | 608 QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _)); |
| 609 stream_->OnStreamFrame(frame); | 609 stream_->OnStreamFrame(frame); |
| 610 } | 610 } |
| 611 | 611 |
| 612 // Verify that after the consumer calls StopReading(), the stream still sends | 612 // Verify that after the consumer calls StopReading(), the stream still sends |
| 613 // flow control updates. | 613 // flow control updates. |
| 614 TEST_F(ReliableQuicStreamTest, StopReadingSendsFlowControl) { | 614 TEST_F(ReliableQuicStreamTest, StopReadingSendsFlowControl) { |
| 615 Initialize(kShouldProcessData); | 615 Initialize(kShouldProcessData); |
| 616 | 616 |
| 617 stream_->StopReading(); | 617 stream_->StopReading(); |
| 618 | 618 |
| 619 // Connection should not get terminated due to flow control errors. | 619 // Connection should not get terminated due to flow control errors. |
| 620 EXPECT_CALL(*connection_, | 620 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( |
| 621 SendConnectionClose(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA)) | 621 QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _)) |
| 622 .Times(0); | 622 .Times(0); |
| 623 EXPECT_CALL(*connection_, SendWindowUpdate(_, _)).Times(AtLeast(1)); | 623 EXPECT_CALL(*connection_, SendWindowUpdate(_, _)).Times(AtLeast(1)); |
| 624 | 624 |
| 625 string data(1000, 'x'); | 625 string data(1000, 'x'); |
| 626 for (QuicStreamOffset offset = 0; | 626 for (QuicStreamOffset offset = 0; |
| 627 offset < 2 * kInitialStreamFlowControlWindowForTest; | 627 offset < 2 * kInitialStreamFlowControlWindowForTest; |
| 628 offset += data.length()) { | 628 offset += data.length()) { |
| 629 QuicStreamFrame frame(stream_->id(), false, offset, data); | 629 QuicStreamFrame frame(stream_->id(), false, offset, data); |
| 630 stream_->OnStreamFrame(frame); | 630 stream_->OnStreamFrame(frame); |
| 631 } | 631 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 EXPECT_EQ(FEC_PROTECT_OPTIONAL, stream_->fec_policy()); | 722 EXPECT_EQ(FEC_PROTECT_OPTIONAL, stream_->fec_policy()); |
| 723 stream_->SetFromConfig(); | 723 stream_->SetFromConfig(); |
| 724 EXPECT_EQ(FEC_PROTECT_ALWAYS, stream_->fec_policy()); | 724 EXPECT_EQ(FEC_PROTECT_ALWAYS, stream_->fec_policy()); |
| 725 } | 725 } |
| 726 | 726 |
| 727 TEST_F(ReliableQuicStreamTest, EarlyResponseFinHandling) { | 727 TEST_F(ReliableQuicStreamTest, EarlyResponseFinHandling) { |
| 728 // Verify that if the server completes the response before reading the end of | 728 // Verify that if the server completes the response before reading the end of |
| 729 // the request, the received FIN is recorded. | 729 // the request, the received FIN is recorded. |
| 730 | 730 |
| 731 Initialize(kShouldProcessData); | 731 Initialize(kShouldProcessData); |
| 732 EXPECT_CALL(*connection_, SendConnectionClose(_)).Times(0); | 732 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails(_, _)).Times(0); |
| 733 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) | 733 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) |
| 734 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); | 734 .WillRepeatedly(Invoke(MockQuicSpdySession::ConsumeAllData)); |
| 735 | 735 |
| 736 // Receive data for the request. | 736 // Receive data for the request. |
| 737 QuicStreamFrame frame1(stream_->id(), false, 0, StringPiece("Start")); | 737 QuicStreamFrame frame1(stream_->id(), false, 0, StringPiece("Start")); |
| 738 stream_->OnStreamFrame(frame1); | 738 stream_->OnStreamFrame(frame1); |
| 739 // When QuicSimpleServerStream sends the response, it calls | 739 // When QuicSimpleServerStream sends the response, it calls |
| 740 // ReliableQuicStream::CloseReadSide() first. | 740 // ReliableQuicStream::CloseReadSide() first. |
| 741 ReliableQuicStreamPeer::CloseReadSide(stream_); | 741 ReliableQuicStreamPeer::CloseReadSide(stream_); |
| 742 // Send data and FIN for the response. | 742 // Send data and FIN for the response. |
| 743 stream_->WriteOrBufferData(kData1, false, nullptr); | 743 stream_->WriteOrBufferData(kData1, false, nullptr); |
| 744 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 744 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
| 745 // Receive remaining data and FIN for the request. | 745 // Receive remaining data and FIN for the request. |
| 746 QuicStreamFrame frame2(stream_->id(), true, 0, StringPiece("End")); | 746 QuicStreamFrame frame2(stream_->id(), true, 0, StringPiece("End")); |
| 747 stream_->OnStreamFrame(frame2); | 747 stream_->OnStreamFrame(frame2); |
| 748 EXPECT_TRUE(stream_->fin_received()); | 748 EXPECT_TRUE(stream_->fin_received()); |
| 749 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 749 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 750 } | 750 } |
| 751 | 751 |
| 752 } // namespace | 752 } // namespace |
| 753 } // namespace test | 753 } // namespace test |
| 754 } // namespace net | 754 } // namespace net |
| OLD | NEW |