| 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/core/quic_stream.h" | 5 #include "net/quic/core/quic_stream.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "net/quic/core/quic_connection.h" | 9 #include "net/quic/core/quic_connection.h" |
| 10 #include "net/quic/core/quic_flags.h" | 10 #include "net/quic/core/quic_flags.h" |
| 11 #include "net/quic/core/quic_utils.h" | 11 #include "net/quic/core/quic_utils.h" |
| 12 #include "net/quic/core/quic_write_blocked_list.h" | 12 #include "net/quic/core/quic_write_blocked_list.h" |
| 13 #include "net/quic/core/spdy_utils.h" | 13 #include "net/quic/core/spdy_utils.h" |
| 14 #include "net/quic/platform/api/quic_logging.h" | 14 #include "net/quic/platform/api/quic_logging.h" |
| 15 #include "net/quic/platform/api/quic_ptr_util.h" | 15 #include "net/quic/platform/api/quic_ptr_util.h" |
| 16 #include "net/quic/test_tools/quic_config_peer.h" | 16 #include "net/quic/test_tools/quic_config_peer.h" |
| 17 #include "net/quic/test_tools/quic_connection_peer.h" | 17 #include "net/quic/test_tools/quic_connection_peer.h" |
| 18 #include "net/quic/test_tools/quic_flow_controller_peer.h" | 18 #include "net/quic/test_tools/quic_flow_controller_peer.h" |
| 19 #include "net/quic/test_tools/quic_session_peer.h" | 19 #include "net/quic/test_tools/quic_session_peer.h" |
| 20 #include "net/quic/test_tools/quic_stream_peer.h" | 20 #include "net/quic/test_tools/quic_stream_peer.h" |
| 21 #include "net/quic/test_tools/quic_test_utils.h" | 21 #include "net/quic/test_tools/quic_test_utils.h" |
| 22 #include "net/test/gtest_util.h" | 22 #include "net/test/gtest_util.h" |
| 23 #include "testing/gmock/include/gmock/gmock.h" | 23 #include "testing/gmock/include/gmock/gmock.h" |
| 24 #include "testing/gmock_mutant.h" | 24 #include "testing/gmock_mutant.h" |
| 25 | 25 |
| 26 using base::StringPiece; | |
| 27 using std::string; | 26 using std::string; |
| 28 using testing::AnyNumber; | 27 using testing::AnyNumber; |
| 29 using testing::AtLeast; | 28 using testing::AtLeast; |
| 30 using testing::CreateFunctor; | 29 using testing::CreateFunctor; |
| 31 using testing::InSequence; | 30 using testing::InSequence; |
| 32 using testing::Invoke; | 31 using testing::Invoke; |
| 33 using testing::DoAll; | 32 using testing::DoAll; |
| 34 using testing::Return; | 33 using testing::Return; |
| 35 using testing::StrictMock; | 34 using testing::StrictMock; |
| 36 using testing::WithArgs; | 35 using testing::WithArgs; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 .WillOnce(Return(QuicConsumedData(kDataLen, true))); | 176 .WillOnce(Return(QuicConsumedData(kDataLen, true))); |
| 178 stream_->WriteOrBufferData(kData1, false, nullptr); | 177 stream_->WriteOrBufferData(kData1, false, nullptr); |
| 179 EXPECT_FALSE(HasWriteBlockedStreams()); | 178 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 180 } | 179 } |
| 181 | 180 |
| 182 TEST_F(QuicStreamTest, NoBlockingIfNoDataOrFin) { | 181 TEST_F(QuicStreamTest, NoBlockingIfNoDataOrFin) { |
| 183 Initialize(kShouldProcessData); | 182 Initialize(kShouldProcessData); |
| 184 | 183 |
| 185 // Write no data and no fin. If we consume nothing we should not be write | 184 // Write no data and no fin. If we consume nothing we should not be write |
| 186 // blocked. | 185 // blocked. |
| 187 EXPECT_QUIC_BUG(stream_->WriteOrBufferData(StringPiece(), false, nullptr), | 186 EXPECT_QUIC_BUG(stream_->WriteOrBufferData(QuicStringPiece(), false, nullptr), |
| 188 ""); | 187 ""); |
| 189 EXPECT_FALSE(HasWriteBlockedStreams()); | 188 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 190 } | 189 } |
| 191 | 190 |
| 192 TEST_F(QuicStreamTest, BlockIfOnlySomeDataConsumed) { | 191 TEST_F(QuicStreamTest, BlockIfOnlySomeDataConsumed) { |
| 193 Initialize(kShouldProcessData); | 192 Initialize(kShouldProcessData); |
| 194 | 193 |
| 195 // Write some data and no fin. If we consume some but not all of the data, | 194 // Write some data and no fin. If we consume some but not all of the data, |
| 196 // we should be write blocked a not all the data was consumed. | 195 // we should be write blocked a not all the data was consumed. |
| 197 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 196 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 198 .WillOnce(Return(QuicConsumedData(1, false))); | 197 .WillOnce(Return(QuicConsumedData(1, false))); |
| 199 stream_->WriteOrBufferData(StringPiece(kData1, 2), false, nullptr); | 198 stream_->WriteOrBufferData(QuicStringPiece(kData1, 2), false, nullptr); |
| 200 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); | 199 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); |
| 201 EXPECT_EQ(1u, stream_->queued_data_bytes()); | 200 EXPECT_EQ(1u, stream_->queued_data_bytes()); |
| 202 } | 201 } |
| 203 | 202 |
| 204 TEST_F(QuicStreamTest, BlockIfFinNotConsumedWithData) { | 203 TEST_F(QuicStreamTest, BlockIfFinNotConsumedWithData) { |
| 205 Initialize(kShouldProcessData); | 204 Initialize(kShouldProcessData); |
| 206 | 205 |
| 207 // Write some data and no fin. If we consume all the data but not the fin, | 206 // Write some data and no fin. If we consume all the data but not the fin, |
| 208 // we should be write blocked because the fin was not consumed. | 207 // we should be write blocked because the fin was not consumed. |
| 209 // (This should never actually happen as the fin should be sent out with the | 208 // (This should never actually happen as the fin should be sent out with the |
| 210 // last data) | 209 // last data) |
| 211 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 210 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 212 .WillOnce(Return(QuicConsumedData(2, false))); | 211 .WillOnce(Return(QuicConsumedData(2, false))); |
| 213 stream_->WriteOrBufferData(StringPiece(kData1, 2), true, nullptr); | 212 stream_->WriteOrBufferData(QuicStringPiece(kData1, 2), true, nullptr); |
| 214 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); | 213 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); |
| 215 } | 214 } |
| 216 | 215 |
| 217 TEST_F(QuicStreamTest, BlockIfSoloFinNotConsumed) { | 216 TEST_F(QuicStreamTest, BlockIfSoloFinNotConsumed) { |
| 218 Initialize(kShouldProcessData); | 217 Initialize(kShouldProcessData); |
| 219 | 218 |
| 220 // Write no data and a fin. If we consume nothing we should be write blocked, | 219 // Write no data and a fin. If we consume nothing we should be write blocked, |
| 221 // as the fin was not consumed. | 220 // as the fin was not consumed. |
| 222 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 221 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 223 .WillOnce(Return(QuicConsumedData(0, false))); | 222 .WillOnce(Return(QuicConsumedData(0, false))); |
| 224 stream_->WriteOrBufferData(StringPiece(), true, nullptr); | 223 stream_->WriteOrBufferData(QuicStringPiece(), true, nullptr); |
| 225 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); | 224 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); |
| 226 } | 225 } |
| 227 | 226 |
| 228 TEST_F(QuicStreamTest, CloseOnPartialWrite) { | 227 TEST_F(QuicStreamTest, CloseOnPartialWrite) { |
| 229 Initialize(kShouldProcessData); | 228 Initialize(kShouldProcessData); |
| 230 | 229 |
| 231 // Write some data and no fin. However, while writing the data | 230 // Write some data and no fin. However, while writing the data |
| 232 // close the stream and verify that MarkConnectionLevelWriteBlocked does not | 231 // close the stream and verify that MarkConnectionLevelWriteBlocked does not |
| 233 // crash with an unknown stream. | 232 // crash with an unknown stream. |
| 234 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 233 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 235 .WillOnce(Invoke(this, &QuicStreamTest::CloseStreamOnWriteError)); | 234 .WillOnce(Invoke(this, &QuicStreamTest::CloseStreamOnWriteError)); |
| 236 stream_->WriteOrBufferData(StringPiece(kData1, 2), false, nullptr); | 235 stream_->WriteOrBufferData(QuicStringPiece(kData1, 2), false, nullptr); |
| 237 ASSERT_EQ(0u, write_blocked_list_->NumBlockedStreams()); | 236 ASSERT_EQ(0u, write_blocked_list_->NumBlockedStreams()); |
| 238 } | 237 } |
| 239 | 238 |
| 240 TEST_F(QuicStreamTest, WriteOrBufferData) { | 239 TEST_F(QuicStreamTest, WriteOrBufferData) { |
| 241 Initialize(kShouldProcessData); | 240 Initialize(kShouldProcessData); |
| 242 | 241 |
| 243 EXPECT_FALSE(HasWriteBlockedStreams()); | 242 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 244 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( | 243 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( |
| 245 connection_->version(), PACKET_8BYTE_CONNECTION_ID, | 244 connection_->version(), PACKET_8BYTE_CONNECTION_ID, |
| 246 !kIncludeVersion, !kIncludeDiversificationNonce, | 245 !kIncludeVersion, !kIncludeDiversificationNonce, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 // before termination. | 286 // before termination. |
| 288 // Test that if no FIN has been sent, we send a RST. | 287 // Test that if no FIN has been sent, we send a RST. |
| 289 | 288 |
| 290 Initialize(kShouldProcessData); | 289 Initialize(kShouldProcessData); |
| 291 EXPECT_FALSE(fin_sent()); | 290 EXPECT_FALSE(fin_sent()); |
| 292 EXPECT_FALSE(rst_sent()); | 291 EXPECT_FALSE(rst_sent()); |
| 293 | 292 |
| 294 // Write some data, with no FIN. | 293 // Write some data, with no FIN. |
| 295 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 294 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 296 .WillOnce(Return(QuicConsumedData(1, false))); | 295 .WillOnce(Return(QuicConsumedData(1, false))); |
| 297 stream_->WriteOrBufferData(StringPiece(kData1, 1), false, nullptr); | 296 stream_->WriteOrBufferData(QuicStringPiece(kData1, 1), false, nullptr); |
| 298 EXPECT_FALSE(fin_sent()); | 297 EXPECT_FALSE(fin_sent()); |
| 299 EXPECT_FALSE(rst_sent()); | 298 EXPECT_FALSE(rst_sent()); |
| 300 | 299 |
| 301 // Now close the stream, and expect that we send a RST. | 300 // Now close the stream, and expect that we send a RST. |
| 302 EXPECT_CALL(*session_, SendRstStream(_, _, _)); | 301 EXPECT_CALL(*session_, SendRstStream(_, _, _)); |
| 303 stream_->OnClose(); | 302 stream_->OnClose(); |
| 304 EXPECT_FALSE(fin_sent()); | 303 EXPECT_FALSE(fin_sent()); |
| 305 EXPECT_TRUE(rst_sent()); | 304 EXPECT_TRUE(rst_sent()); |
| 306 } | 305 } |
| 307 | 306 |
| 308 TEST_F(QuicStreamTest, RstNotSentIfFinSent) { | 307 TEST_F(QuicStreamTest, RstNotSentIfFinSent) { |
| 309 // For flow control accounting, a stream must send either a FIN or a RST frame | 308 // For flow control accounting, a stream must send either a FIN or a RST frame |
| 310 // before termination. | 309 // before termination. |
| 311 // Test that if a FIN has been sent, we don't also send a RST. | 310 // Test that if a FIN has been sent, we don't also send a RST. |
| 312 | 311 |
| 313 Initialize(kShouldProcessData); | 312 Initialize(kShouldProcessData); |
| 314 EXPECT_FALSE(fin_sent()); | 313 EXPECT_FALSE(fin_sent()); |
| 315 EXPECT_FALSE(rst_sent()); | 314 EXPECT_FALSE(rst_sent()); |
| 316 | 315 |
| 317 // Write some data, with FIN. | 316 // Write some data, with FIN. |
| 318 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 317 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 319 .WillOnce(Return(QuicConsumedData(1, true))); | 318 .WillOnce(Return(QuicConsumedData(1, true))); |
| 320 stream_->WriteOrBufferData(StringPiece(kData1, 1), true, nullptr); | 319 stream_->WriteOrBufferData(QuicStringPiece(kData1, 1), true, nullptr); |
| 321 EXPECT_TRUE(fin_sent()); | 320 EXPECT_TRUE(fin_sent()); |
| 322 EXPECT_FALSE(rst_sent()); | 321 EXPECT_FALSE(rst_sent()); |
| 323 | 322 |
| 324 // Now close the stream, and expect that we do not send a RST. | 323 // Now close the stream, and expect that we do not send a RST. |
| 325 stream_->OnClose(); | 324 stream_->OnClose(); |
| 326 EXPECT_TRUE(fin_sent()); | 325 EXPECT_TRUE(fin_sent()); |
| 327 EXPECT_FALSE(rst_sent()); | 326 EXPECT_FALSE(rst_sent()); |
| 328 } | 327 } |
| 329 | 328 |
| 330 TEST_F(QuicStreamTest, OnlySendOneRst) { | 329 TEST_F(QuicStreamTest, OnlySendOneRst) { |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 // Verify that when we receive a packet which violates flow control (i.e. sends | 532 // Verify that when we receive a packet which violates flow control (i.e. sends |
| 534 // too much data on the stream) that the stream sequencer never sees this frame, | 533 // too much data on the stream) that the stream sequencer never sees this frame, |
| 535 // as we check for violation and close the connection early. | 534 // as we check for violation and close the connection early. |
| 536 TEST_F(QuicStreamTest, StreamSequencerNeverSeesPacketsViolatingFlowControl) { | 535 TEST_F(QuicStreamTest, StreamSequencerNeverSeesPacketsViolatingFlowControl) { |
| 537 Initialize(kShouldProcessData); | 536 Initialize(kShouldProcessData); |
| 538 | 537 |
| 539 // Receive a stream frame that violates flow control: the byte offset is | 538 // Receive a stream frame that violates flow control: the byte offset is |
| 540 // higher than the receive window offset. | 539 // higher than the receive window offset. |
| 541 QuicStreamFrame frame(stream_->id(), false, | 540 QuicStreamFrame frame(stream_->id(), false, |
| 542 kInitialSessionFlowControlWindowForTest + 1, | 541 kInitialSessionFlowControlWindowForTest + 1, |
| 543 StringPiece(".")); | 542 QuicStringPiece(".")); |
| 544 EXPECT_GT(frame.offset, QuicFlowControllerPeer::ReceiveWindowOffset( | 543 EXPECT_GT(frame.offset, QuicFlowControllerPeer::ReceiveWindowOffset( |
| 545 stream_->flow_controller())); | 544 stream_->flow_controller())); |
| 546 | 545 |
| 547 // Stream should not accept the frame, and the connection should be closed. | 546 // Stream should not accept the frame, and the connection should be closed. |
| 548 EXPECT_CALL(*connection_, | 547 EXPECT_CALL(*connection_, |
| 549 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); | 548 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); |
| 550 stream_->OnStreamFrame(frame); | 549 stream_->OnStreamFrame(frame); |
| 551 } | 550 } |
| 552 | 551 |
| 553 // Verify that after the consumer calls StopReading(), the stream still sends | 552 // Verify that after the consumer calls StopReading(), the stream still sends |
| (...skipping 20 matching lines...) Expand all Loading... |
| 574 kInitialStreamFlowControlWindowForTest, | 573 kInitialStreamFlowControlWindowForTest, |
| 575 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller())); | 574 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller())); |
| 576 } | 575 } |
| 577 | 576 |
| 578 TEST_F(QuicStreamTest, FinalByteOffsetFromFin) { | 577 TEST_F(QuicStreamTest, FinalByteOffsetFromFin) { |
| 579 Initialize(kShouldProcessData); | 578 Initialize(kShouldProcessData); |
| 580 | 579 |
| 581 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); | 580 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); |
| 582 | 581 |
| 583 QuicStreamFrame stream_frame_no_fin(stream_->id(), false, 1234, | 582 QuicStreamFrame stream_frame_no_fin(stream_->id(), false, 1234, |
| 584 StringPiece(".")); | 583 QuicStringPiece(".")); |
| 585 stream_->OnStreamFrame(stream_frame_no_fin); | 584 stream_->OnStreamFrame(stream_frame_no_fin); |
| 586 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); | 585 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); |
| 587 | 586 |
| 588 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, | 587 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, |
| 589 StringPiece(".")); | 588 QuicStringPiece(".")); |
| 590 stream_->OnStreamFrame(stream_frame_with_fin); | 589 stream_->OnStreamFrame(stream_frame_with_fin); |
| 591 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 590 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 592 } | 591 } |
| 593 | 592 |
| 594 TEST_F(QuicStreamTest, FinalByteOffsetFromRst) { | 593 TEST_F(QuicStreamTest, FinalByteOffsetFromRst) { |
| 595 Initialize(kShouldProcessData); | 594 Initialize(kShouldProcessData); |
| 596 | 595 |
| 597 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); | 596 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); |
| 598 QuicRstStreamFrame rst_frame(stream_->id(), QUIC_STREAM_CANCELLED, 1234); | 597 QuicRstStreamFrame rst_frame(stream_->id(), QUIC_STREAM_CANCELLED, 1234); |
| 599 stream_->OnStreamReset(rst_frame); | 598 stream_->OnStreamReset(rst_frame); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 615 const QuicStreamOffset current_stream_flow_control_offset = | 614 const QuicStreamOffset current_stream_flow_control_offset = |
| 616 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller()); | 615 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller()); |
| 617 const QuicStreamOffset current_connection_flow_control_offset = | 616 const QuicStreamOffset current_connection_flow_control_offset = |
| 618 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller()); | 617 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller()); |
| 619 ASSERT_GT(kByteOffsetExceedingFlowControlWindow, | 618 ASSERT_GT(kByteOffsetExceedingFlowControlWindow, |
| 620 current_stream_flow_control_offset); | 619 current_stream_flow_control_offset); |
| 621 ASSERT_GT(kByteOffsetExceedingFlowControlWindow, | 620 ASSERT_GT(kByteOffsetExceedingFlowControlWindow, |
| 622 current_connection_flow_control_offset); | 621 current_connection_flow_control_offset); |
| 623 QuicStreamFrame zero_length_stream_frame_with_fin( | 622 QuicStreamFrame zero_length_stream_frame_with_fin( |
| 624 stream_->id(), /*fin=*/true, kByteOffsetExceedingFlowControlWindow, | 623 stream_->id(), /*fin=*/true, kByteOffsetExceedingFlowControlWindow, |
| 625 StringPiece()); | 624 QuicStringPiece()); |
| 626 EXPECT_EQ(0, zero_length_stream_frame_with_fin.data_length); | 625 EXPECT_EQ(0, zero_length_stream_frame_with_fin.data_length); |
| 627 | 626 |
| 628 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0); | 627 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0); |
| 629 stream_->OnStreamFrame(zero_length_stream_frame_with_fin); | 628 stream_->OnStreamFrame(zero_length_stream_frame_with_fin); |
| 630 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 629 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 631 | 630 |
| 632 // The flow control receive offset values should not have changed. | 631 // The flow control receive offset values should not have changed. |
| 633 EXPECT_EQ( | 632 EXPECT_EQ( |
| 634 current_stream_flow_control_offset, | 633 current_stream_flow_control_offset, |
| 635 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller())); | 634 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller())); |
| 636 EXPECT_EQ( | 635 EXPECT_EQ( |
| 637 current_connection_flow_control_offset, | 636 current_connection_flow_control_offset, |
| 638 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller())); | 637 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller())); |
| 639 } | 638 } |
| 640 | 639 |
| 641 TEST_F(QuicStreamTest, SetDrainingIncomingOutgoing) { | 640 TEST_F(QuicStreamTest, SetDrainingIncomingOutgoing) { |
| 642 // Don't have incoming data consumed. | 641 // Don't have incoming data consumed. |
| 643 Initialize(kShouldNotProcessData); | 642 Initialize(kShouldNotProcessData); |
| 644 | 643 |
| 645 // Incoming data with FIN. | 644 // Incoming data with FIN. |
| 646 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, | 645 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, |
| 647 StringPiece(".")); | 646 QuicStringPiece(".")); |
| 648 stream_->OnStreamFrame(stream_frame_with_fin); | 647 stream_->OnStreamFrame(stream_frame_with_fin); |
| 649 // The FIN has been received but not consumed. | 648 // The FIN has been received but not consumed. |
| 650 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 649 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 651 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); | 650 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); |
| 652 EXPECT_FALSE(stream_->reading_stopped()); | 651 EXPECT_FALSE(stream_->reading_stopped()); |
| 653 | 652 |
| 654 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams()); | 653 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams()); |
| 655 | 654 |
| 656 // Outgoing data with FIN. | 655 // Outgoing data with FIN. |
| 657 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 656 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 658 .WillOnce(Return(QuicConsumedData(2, true))); | 657 .WillOnce(Return(QuicConsumedData(2, true))); |
| 659 stream_->WriteOrBufferData(StringPiece(kData1, 2), true, nullptr); | 658 stream_->WriteOrBufferData(QuicStringPiece(kData1, 2), true, nullptr); |
| 660 EXPECT_TRUE(stream_->write_side_closed()); | 659 EXPECT_TRUE(stream_->write_side_closed()); |
| 661 | 660 |
| 662 EXPECT_EQ(1u, QuicSessionPeer::GetDrainingStreams(session_.get()) | 661 EXPECT_EQ(1u, QuicSessionPeer::GetDrainingStreams(session_.get()) |
| 663 ->count(kTestStreamId)); | 662 ->count(kTestStreamId)); |
| 664 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); | 663 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); |
| 665 } | 664 } |
| 666 | 665 |
| 667 TEST_F(QuicStreamTest, SetDrainingOutgoingIncoming) { | 666 TEST_F(QuicStreamTest, SetDrainingOutgoingIncoming) { |
| 668 // Don't have incoming data consumed. | 667 // Don't have incoming data consumed. |
| 669 Initialize(kShouldNotProcessData); | 668 Initialize(kShouldNotProcessData); |
| 670 | 669 |
| 671 // Outgoing data with FIN. | 670 // Outgoing data with FIN. |
| 672 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 671 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 673 .WillOnce(Return(QuicConsumedData(2, true))); | 672 .WillOnce(Return(QuicConsumedData(2, true))); |
| 674 stream_->WriteOrBufferData(StringPiece(kData1, 2), true, nullptr); | 673 stream_->WriteOrBufferData(QuicStringPiece(kData1, 2), true, nullptr); |
| 675 EXPECT_TRUE(stream_->write_side_closed()); | 674 EXPECT_TRUE(stream_->write_side_closed()); |
| 676 | 675 |
| 677 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams()); | 676 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams()); |
| 678 | 677 |
| 679 // Incoming data with FIN. | 678 // Incoming data with FIN. |
| 680 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, | 679 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, |
| 681 StringPiece(".")); | 680 QuicStringPiece(".")); |
| 682 stream_->OnStreamFrame(stream_frame_with_fin); | 681 stream_->OnStreamFrame(stream_frame_with_fin); |
| 683 // The FIN has been received but not consumed. | 682 // The FIN has been received but not consumed. |
| 684 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 683 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 685 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); | 684 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); |
| 686 EXPECT_FALSE(stream_->reading_stopped()); | 685 EXPECT_FALSE(stream_->reading_stopped()); |
| 687 | 686 |
| 688 EXPECT_EQ(1u, QuicSessionPeer::GetDrainingStreams(session_.get()) | 687 EXPECT_EQ(1u, QuicSessionPeer::GetDrainingStreams(session_.get()) |
| 689 ->count(kTestStreamId)); | 688 ->count(kTestStreamId)); |
| 690 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); | 689 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); |
| 691 } | 690 } |
| 692 | 691 |
| 693 TEST_F(QuicStreamTest, EarlyResponseFinHandling) { | 692 TEST_F(QuicStreamTest, EarlyResponseFinHandling) { |
| 694 // Verify that if the server completes the response before reading the end of | 693 // Verify that if the server completes the response before reading the end of |
| 695 // the request, the received FIN is recorded. | 694 // the request, the received FIN is recorded. |
| 696 | 695 |
| 697 Initialize(kShouldProcessData); | 696 Initialize(kShouldProcessData); |
| 698 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0); | 697 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0); |
| 699 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) | 698 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) |
| 700 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 699 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
| 701 | 700 |
| 702 // Receive data for the request. | 701 // Receive data for the request. |
| 703 QuicStreamFrame frame1(stream_->id(), false, 0, StringPiece("Start")); | 702 QuicStreamFrame frame1(stream_->id(), false, 0, QuicStringPiece("Start")); |
| 704 stream_->OnStreamFrame(frame1); | 703 stream_->OnStreamFrame(frame1); |
| 705 // When QuicSimpleServerStream sends the response, it calls | 704 // When QuicSimpleServerStream sends the response, it calls |
| 706 // QuicStream::CloseReadSide() first. | 705 // QuicStream::CloseReadSide() first. |
| 707 QuicStreamPeer::CloseReadSide(stream_); | 706 QuicStreamPeer::CloseReadSide(stream_); |
| 708 // Send data and FIN for the response. | 707 // Send data and FIN for the response. |
| 709 stream_->WriteOrBufferData(kData1, false, nullptr); | 708 stream_->WriteOrBufferData(kData1, false, nullptr); |
| 710 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_)); | 709 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_)); |
| 711 // Receive remaining data and FIN for the request. | 710 // Receive remaining data and FIN for the request. |
| 712 QuicStreamFrame frame2(stream_->id(), true, 0, StringPiece("End")); | 711 QuicStreamFrame frame2(stream_->id(), true, 0, QuicStringPiece("End")); |
| 713 stream_->OnStreamFrame(frame2); | 712 stream_->OnStreamFrame(frame2); |
| 714 EXPECT_TRUE(stream_->fin_received()); | 713 EXPECT_TRUE(stream_->fin_received()); |
| 715 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 714 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 716 } | 715 } |
| 717 | 716 |
| 718 } // namespace | 717 } // namespace |
| 719 } // namespace test | 718 } // namespace test |
| 720 } // namespace net | 719 } // namespace net |
| OLD | NEW |