diff options
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/core/quic_stream_test.cc')
-rw-r--r-- | chromium/net/third_party/quiche/src/quic/core/quic_stream_test.cc | 170 |
1 files changed, 69 insertions, 101 deletions
diff --git a/chromium/net/third_party/quiche/src/quic/core/quic_stream_test.cc b/chromium/net/third_party/quiche/src/quic/core/quic_stream_test.cc index d241dac9098..46c4b4af3f6 100644 --- a/chromium/net/third_party/quiche/src/quic/core/quic_stream_test.cc +++ b/chromium/net/third_party/quiche/src/quic/core/quic_stream_test.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "net/third_party/quiche/src/quic/core/quic_stream.h" +#include "quic/core/quic_stream.h" #include <memory> #include <string> @@ -11,29 +11,29 @@ #include "absl/base/macros.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" -#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h" -#include "net/third_party/quiche/src/quic/core/frames/quic_rst_stream_frame.h" -#include "net/third_party/quiche/src/quic/core/quic_connection.h" -#include "net/third_party/quiche/src/quic/core/quic_constants.h" -#include "net/third_party/quiche/src/quic/core/quic_error_codes.h" -#include "net/third_party/quiche/src/quic/core/quic_types.h" -#include "net/third_party/quiche/src/quic/core/quic_utils.h" -#include "net/third_party/quiche/src/quic/core/quic_versions.h" -#include "net/third_party/quiche/src/quic/core/quic_write_blocked_list.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_storage.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_test.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_test_mem_slice_vector.h" -#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h" -#include "net/third_party/quiche/src/quic/test_tools/quic_connection_peer.h" -#include "net/third_party/quiche/src/quic/test_tools/quic_flow_controller_peer.h" -#include "net/third_party/quiche/src/quic/test_tools/quic_session_peer.h" -#include "net/third_party/quiche/src/quic/test_tools/quic_stream_peer.h" -#include "net/third_party/quiche/src/quic/test_tools/quic_stream_sequencer_peer.h" -#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h" +#include "quic/core/crypto/null_encrypter.h" +#include "quic/core/frames/quic_rst_stream_frame.h" +#include "quic/core/quic_connection.h" +#include "quic/core/quic_constants.h" +#include "quic/core/quic_error_codes.h" +#include "quic/core/quic_types.h" +#include "quic/core/quic_utils.h" +#include "quic/core/quic_versions.h" +#include "quic/core/quic_write_blocked_list.h" +#include "quic/platform/api/quic_expect_bug.h" +#include "quic/platform/api/quic_flags.h" +#include "quic/platform/api/quic_logging.h" +#include "quic/platform/api/quic_mem_slice_storage.h" +#include "quic/platform/api/quic_ptr_util.h" +#include "quic/platform/api/quic_test.h" +#include "quic/platform/api/quic_test_mem_slice_vector.h" +#include "quic/test_tools/quic_config_peer.h" +#include "quic/test_tools/quic_connection_peer.h" +#include "quic/test_tools/quic_flow_controller_peer.h" +#include "quic/test_tools/quic_session_peer.h" +#include "quic/test_tools/quic_stream_peer.h" +#include "quic/test_tools/quic_stream_sequencer_peer.h" +#include "quic/test_tools/quic_test_utils.h" using testing::_; using testing::AnyNumber; @@ -116,15 +116,10 @@ class QuicStreamTest : public QuicTestWithParam<ParsedQuicVersion> { // session_ now owns stream_. session_->ActivateStream(QuicWrapUnique(stream_)); // Ignore resetting when session_ is terminated. - if (!session_->split_up_send_rst()) { - EXPECT_CALL(*session_, SendRstStream(kTestStreamId, _, _, _)) - .Times(AnyNumber()); - } else { - EXPECT_CALL(*session_, MaybeSendStopSendingFrame(kTestStreamId, _)) - .Times(AnyNumber()); - EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _)) - .Times(AnyNumber()); - } + EXPECT_CALL(*session_, MaybeSendStopSendingFrame(kTestStreamId, _)) + .Times(AnyNumber()); + EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _)) + .Times(AnyNumber()); write_blocked_list_ = QuicSessionPeer::GetWriteBlockedStreams(session_.get()); } @@ -471,11 +466,7 @@ TEST_P(QuicStreamTest, RstAlwaysSentIfNoFinSent) { EXPECT_FALSE(rst_sent()); // Now close the stream, and expect that we send a RST. - if (!session_->split_up_send_rst()) { - EXPECT_CALL(*session_, SendRstStream(kTestStreamId, _, _, _)); - } else { - EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _)); - } + EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _)); QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(), QUIC_STREAM_CANCELLED, 1234); stream_->OnStreamReset(rst_frame); @@ -528,12 +519,7 @@ TEST_P(QuicStreamTest, OnlySendOneRst) { EXPECT_FALSE(rst_sent()); // Reset the stream. - if (!session_->split_up_send_rst()) { - EXPECT_CALL(*session_, SendRstStream(kTestStreamId, _, _, _)).Times(1); - } else { - EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _)) - .Times(1); - } + EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _)).Times(1); stream_->Reset(QUIC_STREAM_CANCELLED); EXPECT_FALSE(fin_sent()); EXPECT_TRUE(rst_sent()); @@ -747,8 +733,8 @@ TEST_P(QuicStreamTest, StreamTooLong) { QuicStreamFrame stream_frame(stream_->id(), false, kMaxStreamLength, "."); EXPECT_QUIC_PEER_BUG( stream_->OnStreamFrame(stream_frame), - quiche::QuicheStrCat("Receive stream frame on stream ", stream_->id(), - " reaches max stream length")); + absl::StrCat("Receive stream frame on stream ", stream_->id(), + " reaches max stream length")); } TEST_P(QuicStreamTest, SetDrainingIncomingOutgoing) { @@ -943,11 +929,7 @@ TEST_P(QuicStreamTest, CancelStream) { EXPECT_TRUE(session_->HasUnackedStreamData()); EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size()); // Cancel stream. - if (session_->split_up_send_rst()) { - stream_->MaybeSendStopSending(QUIC_STREAM_NO_ERROR); - } else { - stream_->Reset(QUIC_STREAM_NO_ERROR); - } + stream_->MaybeSendStopSending(QUIC_STREAM_NO_ERROR); // stream still waits for acks as the error code is QUIC_STREAM_NO_ERROR, and // data is going to be retransmitted. EXPECT_TRUE(stream_->IsWaitingForAcks()); @@ -957,21 +939,13 @@ TEST_P(QuicStreamTest, CancelStream) { EXPECT_CALL(*session_, WriteControlFrame(_, _)) .Times(AtLeast(1)) .WillRepeatedly(Invoke(&ClearControlFrameWithTransmissionType)); - if (!session_->split_up_send_rst()) { - EXPECT_CALL(*session_, - SendRstStream(stream_->id(), QUIC_STREAM_CANCELLED, 9, _)) - .WillOnce(InvokeWithoutArgs([this]() { - session_->ReallySendRstStream(stream_->id(), QUIC_STREAM_CANCELLED, - stream_->stream_bytes_written(), false); - })); - } else { - EXPECT_CALL(*session_, MaybeSendRstStreamFrame(_, _, _)) - .WillOnce(InvokeWithoutArgs([this]() { - session_->ReallyMaybeSendRstStreamFrame( - stream_->id(), QUIC_STREAM_CANCELLED, - stream_->stream_bytes_written()); - })); - } + + EXPECT_CALL(*session_, MaybeSendRstStreamFrame(_, _, _)) + .WillOnce(InvokeWithoutArgs([this]() { + session_->ReallyMaybeSendRstStreamFrame( + stream_->id(), QUIC_STREAM_CANCELLED, + stream_->stream_bytes_written()); + })); stream_->Reset(QUIC_STREAM_CANCELLED); EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size()); @@ -1003,13 +977,8 @@ TEST_P(QuicStreamTest, RstFrameReceivedStreamNotFinishSending) { QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(), QUIC_STREAM_CANCELLED, 9); - if (!session_->split_up_send_rst()) { - EXPECT_CALL(*session_, - SendRstStream(stream_->id(), QUIC_RST_ACKNOWLEDGEMENT, 9, _)); - } else { - EXPECT_CALL(*session_, MaybeSendRstStreamFrame( - stream_->id(), QUIC_RST_ACKNOWLEDGEMENT, 9)); - } + EXPECT_CALL(*session_, MaybeSendRstStreamFrame(stream_->id(), + QUIC_RST_ACKNOWLEDGEMENT, 9)); stream_->OnStreamReset(rst_frame); EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size()); // Stream stops waiting for acks as it does not finish sending and rst is @@ -1031,7 +1000,6 @@ TEST_P(QuicStreamTest, RstFrameReceivedStreamFinishSending) { EXPECT_TRUE(session_->HasUnackedStreamData()); // RST_STREAM received. - EXPECT_CALL(*session_, SendRstStream(_, _, _, _)).Times(0); QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(), QUIC_STREAM_CANCELLED, 1234); stream_->OnStreamReset(rst_frame); @@ -1052,13 +1020,8 @@ TEST_P(QuicStreamTest, ConnectionClosed) { stream_->WriteOrBufferData(kData1, false, nullptr); EXPECT_TRUE(stream_->IsWaitingForAcks()); EXPECT_TRUE(session_->HasUnackedStreamData()); - if (!session_->split_up_send_rst()) { - EXPECT_CALL(*session_, - SendRstStream(stream_->id(), QUIC_RST_ACKNOWLEDGEMENT, 9, _)); - } else { - EXPECT_CALL(*session_, MaybeSendRstStreamFrame( - stream_->id(), QUIC_RST_ACKNOWLEDGEMENT, 9)); - } + EXPECT_CALL(*session_, MaybeSendRstStreamFrame(stream_->id(), + QUIC_RST_ACKNOWLEDGEMENT, 9)); QuicConnectionPeer::SetConnectionClose(connection_); stream_->OnConnectionClosed(QUIC_INTERNAL_ERROR, ConnectionCloseSource::FROM_SELF); @@ -1583,19 +1546,13 @@ TEST_P(QuicStreamTest, ResetStreamOnTtlExpiresRetransmitLostData) { connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); // Verify stream gets reset because TTL expires. - if (!session_->split_up_send_rst()) { - EXPECT_CALL(*session_, SendRstStream(_, QUIC_STREAM_TTL_EXPIRED, _, _)) - .Times(1); - } else { - if (session_->version().UsesHttp3()) { - EXPECT_CALL(*session_, - MaybeSendStopSendingFrame(_, QUIC_STREAM_TTL_EXPIRED)) - .Times(1); - } + if (session_->version().UsesHttp3()) { EXPECT_CALL(*session_, - MaybeSendRstStreamFrame(_, QUIC_STREAM_TTL_EXPIRED, _)) + MaybeSendStopSendingFrame(_, QUIC_STREAM_TTL_EXPIRED)) .Times(1); } + EXPECT_CALL(*session_, MaybeSendRstStreamFrame(_, QUIC_STREAM_TTL_EXPIRED, _)) + .Times(1); stream_->OnCanWrite(); } @@ -1613,19 +1570,13 @@ TEST_P(QuicStreamTest, ResetStreamOnTtlExpiresEarlyRetransmitData) { connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); // Verify stream gets reset because TTL expires. - if (!session_->split_up_send_rst()) { - EXPECT_CALL(*session_, SendRstStream(_, QUIC_STREAM_TTL_EXPIRED, _, _)) - .Times(1); - } else { - if (session_->version().UsesHttp3()) { - EXPECT_CALL(*session_, - MaybeSendStopSendingFrame(_, QUIC_STREAM_TTL_EXPIRED)) - .Times(1); - } + if (session_->version().UsesHttp3()) { EXPECT_CALL(*session_, - MaybeSendRstStreamFrame(_, QUIC_STREAM_TTL_EXPIRED, _)) + MaybeSendStopSendingFrame(_, QUIC_STREAM_TTL_EXPIRED)) .Times(1); } + EXPECT_CALL(*session_, MaybeSendRstStreamFrame(_, QUIC_STREAM_TTL_EXPIRED, _)) + .Times(1); stream_->RetransmitStreamData(0, 100, false, PTO_RETRANSMISSION); } @@ -1679,6 +1630,23 @@ TEST_P(QuicStreamTest, RstStreamFrameChangesCloseOffset) { stream_->OnStreamReset(rst); } +// Regression test for b/176073284. +TEST_P(QuicStreamTest, EmptyStreamFrameWithNoFin) { + Initialize(); + QuicStreamFrame empty_stream_frame(stream_->id(), false, 0, ""); + if (GetQuicReloadableFlag(quic_accept_empty_stream_frame_with_no_fin) && + stream_->version().HasIetfQuicFrames()) { + EXPECT_CALL(*connection_, + CloseConnection(QUIC_EMPTY_STREAM_FRAME_NO_FIN, _, _)) + .Times(0); + } else { + EXPECT_CALL(*connection_, + CloseConnection(QUIC_EMPTY_STREAM_FRAME_NO_FIN, _, _)); + } + EXPECT_CALL(*stream_, OnDataAvailable()).Times(0); + stream_->OnStreamFrame(empty_stream_frame); +} + } // namespace } // namespace test } // namespace quic |