blob: 4232ccb1c2a670d372e72fb4a7f23e30fac66e96 [file] [log] [blame]
Bence Békybac04052022-04-07 15:44:29 -04001// 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
3// found in the LICENSE file.
4
5#include "quiche/quic/core/quic_stream.h"
6
martinduke4bc013a2024-12-10 10:19:27 -08007#include <cmath>
martinduke890a21c2024-09-18 07:46:32 -07008#include <cstddef>
Bence Békybac04052022-04-07 15:44:29 -04009#include <memory>
vasilvv243b2622023-11-07 17:01:30 -080010#include <optional>
Bence Békybac04052022-04-07 15:44:29 -040011#include <string>
12#include <utility>
QUICHE team7baee702024-05-21 11:18:15 -070013#include <vector>
Bence Békybac04052022-04-07 15:44:29 -040014
15#include "absl/base/macros.h"
16#include "absl/memory/memory.h"
17#include "absl/strings/string_view.h"
Bence Békybac04052022-04-07 15:44:29 -040018#include "quiche/quic/core/crypto/null_encrypter.h"
renjietang20dbb382024-06-20 14:31:32 -070019#include "quiche/quic/core/frames/quic_connection_close_frame.h"
martinduke890a21c2024-09-18 07:46:32 -070020#include "quiche/quic/core/frames/quic_reset_stream_at_frame.h"
Bence Békybac04052022-04-07 15:44:29 -040021#include "quiche/quic/core/frames/quic_rst_stream_frame.h"
22#include "quiche/quic/core/quic_connection.h"
23#include "quiche/quic/core/quic_constants.h"
24#include "quiche/quic/core/quic_error_codes.h"
martinduke4bc013a2024-12-10 10:19:27 -080025#include "quiche/quic/core/quic_stream_sequencer.h"
Bence Békybac04052022-04-07 15:44:29 -040026#include "quiche/quic/core/quic_types.h"
27#include "quiche/quic/core/quic_utils.h"
28#include "quiche/quic/core/quic_versions.h"
29#include "quiche/quic/core/quic_write_blocked_list.h"
30#include "quiche/quic/platform/api/quic_expect_bug.h"
31#include "quiche/quic/platform/api/quic_flags.h"
32#include "quiche/quic/platform/api/quic_logging.h"
33#include "quiche/quic/platform/api/quic_test.h"
34#include "quiche/quic/test_tools/quic_config_peer.h"
35#include "quiche/quic/test_tools/quic_connection_peer.h"
36#include "quiche/quic/test_tools/quic_flow_controller_peer.h"
37#include "quiche/quic/test_tools/quic_session_peer.h"
38#include "quiche/quic/test_tools/quic_stream_peer.h"
39#include "quiche/quic/test_tools/quic_stream_sequencer_peer.h"
40#include "quiche/quic/test_tools/quic_test_utils.h"
41#include "quiche/common/quiche_mem_slice_storage.h"
42
43using testing::_;
44using testing::AnyNumber;
45using testing::AtLeast;
46using testing::InSequence;
47using testing::Invoke;
48using testing::InvokeWithoutArgs;
49using testing::Return;
50using testing::StrictMock;
51
52namespace quic {
53namespace test {
54namespace {
55
56const char kData1[] = "FooAndBar";
57const char kData2[] = "EepAndBaz";
58const QuicByteCount kDataLen = 9;
martindukea12ff5d2022-10-12 17:25:51 -070059const uint8_t kPacket0ByteConnectionId = 0;
60const uint8_t kPacket8ByteConnectionId = 8;
Bence Békybac04052022-04-07 15:44:29 -040061
62class TestStream : public QuicStream {
63 public:
64 TestStream(QuicStreamId id, QuicSession* session, StreamType type)
65 : QuicStream(id, session, /*is_static=*/false, type) {
66 sequencer()->set_level_triggered(true);
67 }
68
69 TestStream(PendingStream* pending, QuicSession* session, bool is_static)
70 : QuicStream(pending, session, is_static) {}
71
72 MOCK_METHOD(void, OnDataAvailable, (), (override));
73
74 MOCK_METHOD(void, OnCanWriteNewData, (), (override));
75
76 MOCK_METHOD(void, OnWriteSideInDataRecvdState, (), (override));
77
78 using QuicStream::CanWriteNewData;
79 using QuicStream::CanWriteNewDataAfterData;
80 using QuicStream::CloseWriteSide;
81 using QuicStream::fin_buffered;
82 using QuicStream::MaybeSendStopSending;
83 using QuicStream::OnClose;
84 using QuicStream::WriteMemSlices;
85 using QuicStream::WriteOrBufferData;
86
martinduke890a21c2024-09-18 07:46:32 -070087 void ConsumeData(size_t num_bytes) {
88 char buffer[1024];
89 ASSERT_GT(ABSL_ARRAYSIZE(buffer), num_bytes);
90 struct iovec iov;
91 iov.iov_base = buffer;
92 iov.iov_len = num_bytes;
93 ASSERT_EQ(num_bytes, QuicStreamPeer::sequencer(this)->Readv(&iov, 1));
94 }
95
martinduke4bc013a2024-12-10 10:19:27 -080096 QuicStreamSequencer* sequencer() { return QuicStream::sequencer(); }
97
Bence Békybac04052022-04-07 15:44:29 -040098 private:
99 std::string data_;
100};
101
102class QuicStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
103 public:
104 QuicStreamTest()
105 : zero_(QuicTime::Delta::Zero()),
106 supported_versions_(AllSupportedVersions()) {}
107
108 void Initialize(Perspective perspective = Perspective::IS_SERVER) {
109 ParsedQuicVersionVector version_vector;
110 version_vector.push_back(GetParam());
111 connection_ = new StrictMock<MockQuicConnection>(
112 &helper_, &alarm_factory_, perspective, version_vector);
113 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
114 session_ = std::make_unique<StrictMock<MockQuicSession>>(connection_);
115 session_->Initialize();
116 connection_->SetEncrypter(
117 ENCRYPTION_FORWARD_SECURE,
118 std::make_unique<NullEncrypter>(connection_->perspective()));
119 QuicConfigPeer::SetReceivedInitialSessionFlowControlWindow(
120 session_->config(), kMinimumFlowControlSendWindow);
121 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesUnidirectional(
122 session_->config(), kMinimumFlowControlSendWindow);
123 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesIncomingBidirectional(
124 session_->config(), kMinimumFlowControlSendWindow);
125 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesOutgoingBidirectional(
126 session_->config(), kMinimumFlowControlSendWindow);
127 QuicConfigPeer::SetReceivedMaxUnidirectionalStreams(session_->config(), 10);
martinduke4bc013a2024-12-10 10:19:27 -0800128 session_->config()->SetReliableStreamReset(true);
Bence Békybac04052022-04-07 15:44:29 -0400129 session_->OnConfigNegotiated();
130
131 stream_ = new StrictMock<TestStream>(kTestStreamId, session_.get(),
132 BIDIRECTIONAL);
133 EXPECT_NE(nullptr, stream_);
renjietang89540a62022-12-01 14:46:26 -0800134 EXPECT_CALL(*session_, ShouldKeepConnectionAlive())
135 .WillRepeatedly(Return(true));
Bence Békybac04052022-04-07 15:44:29 -0400136 // session_ now owns stream_.
137 session_->ActivateStream(absl::WrapUnique(stream_));
138 // Ignore resetting when session_ is terminated.
139 EXPECT_CALL(*session_, MaybeSendStopSendingFrame(kTestStreamId, _))
140 .Times(AnyNumber());
141 EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _))
142 .Times(AnyNumber());
143 write_blocked_list_ =
144 QuicSessionPeer::GetWriteBlockedStreams(session_.get());
145 }
146
147 bool fin_sent() { return stream_->fin_sent(); }
148 bool rst_sent() { return stream_->rst_sent(); }
149
150 bool HasWriteBlockedStreams() {
151 return write_blocked_list_->HasWriteBlockedSpecialStream() ||
152 write_blocked_list_->HasWriteBlockedDataStreams();
153 }
154
155 QuicConsumedData CloseStreamOnWriteError(
156 QuicStreamId id, QuicByteCount /*write_length*/,
157 QuicStreamOffset /*offset*/, StreamSendingState /*state*/,
vasilvv243b2622023-11-07 17:01:30 -0800158 TransmissionType /*type*/, std::optional<EncryptionLevel> /*level*/) {
Bence Békybac04052022-04-07 15:44:29 -0400159 session_->ResetStream(id, QUIC_STREAM_CANCELLED);
160 return QuicConsumedData(1, false);
161 }
162
163 bool ClearResetStreamFrame(const QuicFrame& frame) {
164 EXPECT_EQ(RST_STREAM_FRAME, frame.type);
165 DeleteFrame(&const_cast<QuicFrame&>(frame));
166 return true;
167 }
168
169 bool ClearStopSendingFrame(const QuicFrame& frame) {
170 EXPECT_EQ(STOP_SENDING_FRAME, frame.type);
171 DeleteFrame(&const_cast<QuicFrame&>(frame));
172 return true;
173 }
174
martinduke4bc013a2024-12-10 10:19:27 -0800175 // Use application stream interface for sending data. This will trigger a call
176 // to mock_stream->Writev(_, _) that will have to return QuicConsumedData.
177 QuicConsumedData SendApplicationData(TestStream* stream,
178 absl::string_view data, size_t iov_len,
179 bool fin) {
180 struct iovec iov = {const_cast<char*>(data.data()), iov_len};
181 quiche::QuicheMemSliceStorage storage(
182 &iov, 1,
183 session_->connection()->helper()->GetStreamSendBufferAllocator(), 1024);
184 return stream->WriteMemSlices(storage.ToSpan(), fin);
185 }
186
187 QuicConsumedData SendApplicationData(absl::string_view data, size_t iov_len,
188 bool fin) {
189 return SendApplicationData(stream_, data, iov_len, fin);
190 }
191
Bence Békybac04052022-04-07 15:44:29 -0400192 protected:
193 MockQuicConnectionHelper helper_;
194 MockAlarmFactory alarm_factory_;
195 MockQuicConnection* connection_;
196 std::unique_ptr<MockQuicSession> session_;
197 StrictMock<TestStream>* stream_;
vasilvv5d896432023-03-20 06:11:07 -0700198 QuicWriteBlockedListInterface* write_blocked_list_;
Bence Békybac04052022-04-07 15:44:29 -0400199 QuicTime::Delta zero_;
200 ParsedQuicVersionVector supported_versions_;
bnc862751f2022-04-13 08:33:42 -0700201 QuicStreamId kTestStreamId = GetNthClientInitiatedBidirectionalStreamId(
202 GetParam().transport_version, 1);
Bence Békybac04052022-04-07 15:44:29 -0400203 const QuicStreamId kTestPendingStreamId =
204 GetNthClientInitiatedUnidirectionalStreamId(GetParam().transport_version,
205 1);
206};
207
208INSTANTIATE_TEST_SUITE_P(QuicStreamTests, QuicStreamTest,
209 ::testing::ValuesIn(AllSupportedVersions()),
210 ::testing::PrintToStringParamName());
211
212using PendingStreamTest = QuicStreamTest;
213
214INSTANTIATE_TEST_SUITE_P(PendingStreamTests, PendingStreamTest,
215 ::testing::ValuesIn(CurrentSupportedHttp3Versions()),
216 ::testing::PrintToStringParamName());
217
218TEST_P(PendingStreamTest, PendingStreamStaticness) {
219 Initialize();
220
221 PendingStream pending(kTestPendingStreamId, session_.get());
222 TestStream stream(&pending, session_.get(), false);
223 EXPECT_FALSE(stream.is_static());
224
225 PendingStream pending2(kTestPendingStreamId + 4, session_.get());
226 TestStream stream2(&pending2, session_.get(), true);
227 EXPECT_TRUE(stream2.is_static());
228}
229
230TEST_P(PendingStreamTest, PendingStreamType) {
231 Initialize();
232
233 PendingStream pending(kTestPendingStreamId, session_.get());
234 TestStream stream(&pending, session_.get(), false);
235 EXPECT_EQ(stream.type(), READ_UNIDIRECTIONAL);
236}
237
238TEST_P(PendingStreamTest, PendingStreamTypeOnClient) {
239 Initialize(Perspective::IS_CLIENT);
240
241 QuicStreamId server_initiated_pending_stream_id =
242 GetNthServerInitiatedUnidirectionalStreamId(session_->transport_version(),
243 1);
244 PendingStream pending(server_initiated_pending_stream_id, session_.get());
245 TestStream stream(&pending, session_.get(), false);
246 EXPECT_EQ(stream.type(), READ_UNIDIRECTIONAL);
247}
248
249TEST_P(PendingStreamTest, PendingStreamTooMuchData) {
250 Initialize();
251
252 PendingStream pending(kTestPendingStreamId, session_.get());
253 // Receive a stream frame that violates flow control: the byte offset is
254 // higher than the receive window offset.
255 QuicStreamFrame frame(kTestPendingStreamId, false,
256 kInitialSessionFlowControlWindowForTest + 1, ".");
257
258 // Stream should not accept the frame, and the connection should be closed.
259 EXPECT_CALL(*connection_,
260 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
261 pending.OnStreamFrame(frame);
262}
263
264TEST_P(PendingStreamTest, PendingStreamTooMuchDataInRstStream) {
265 Initialize();
266
267 PendingStream pending1(kTestPendingStreamId, session_.get());
268 // Receive a rst stream frame that violates flow control: the byte offset is
269 // higher than the receive window offset.
270 QuicRstStreamFrame frame1(kInvalidControlFrameId, kTestPendingStreamId,
271 QUIC_STREAM_CANCELLED,
272 kInitialSessionFlowControlWindowForTest + 1);
273
274 // Pending stream should not accept the frame, and the connection should be
275 // closed.
276 EXPECT_CALL(*connection_,
277 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
278 pending1.OnRstStreamFrame(frame1);
279
280 QuicStreamId bidirection_stream_id = QuicUtils::GetFirstBidirectionalStreamId(
281 session_->transport_version(), Perspective::IS_CLIENT);
282 PendingStream pending2(bidirection_stream_id, session_.get());
283 // Receive a rst stream frame that violates flow control: the byte offset is
284 // higher than the receive window offset.
285 QuicRstStreamFrame frame2(kInvalidControlFrameId, bidirection_stream_id,
286 QUIC_STREAM_CANCELLED,
287 kInitialSessionFlowControlWindowForTest + 1);
288 // Bidirectional Pending stream should not accept the frame, and the
289 // connection should be closed.
290 EXPECT_CALL(*connection_,
291 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
292 pending2.OnRstStreamFrame(frame2);
293}
294
295TEST_P(PendingStreamTest, PendingStreamRstStream) {
296 Initialize();
297
298 PendingStream pending(kTestPendingStreamId, session_.get());
299 QuicStreamOffset final_byte_offset = 7;
300 QuicRstStreamFrame frame(kInvalidControlFrameId, kTestPendingStreamId,
301 QUIC_STREAM_CANCELLED, final_byte_offset);
302
303 // Pending stream should accept the frame and not close the connection.
304 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
305 pending.OnRstStreamFrame(frame);
306}
307
308TEST_P(PendingStreamTest, PendingStreamWindowUpdate) {
309 Initialize();
310
311 QuicStreamId bidirection_stream_id = QuicUtils::GetFirstBidirectionalStreamId(
312 session_->transport_version(), Perspective::IS_CLIENT);
313 PendingStream pending(bidirection_stream_id, session_.get());
314 QuicWindowUpdateFrame frame(kInvalidControlFrameId, bidirection_stream_id,
315 kDefaultFlowControlSendWindow * 2);
316 pending.OnWindowUpdateFrame(frame);
317 TestStream stream(&pending, session_.get(), false);
318
319 EXPECT_EQ(QuicStreamPeer::SendWindowSize(&stream),
320 kDefaultFlowControlSendWindow * 2);
321}
322
323TEST_P(PendingStreamTest, PendingStreamStopSending) {
324 Initialize();
325
326 QuicStreamId bidirection_stream_id = QuicUtils::GetFirstBidirectionalStreamId(
327 session_->transport_version(), Perspective::IS_CLIENT);
328 PendingStream pending(bidirection_stream_id, session_.get());
329 QuicResetStreamError error =
330 QuicResetStreamError::FromInternal(QUIC_STREAM_INTERNAL_ERROR);
331 pending.OnStopSending(error);
332 EXPECT_TRUE(pending.GetStopSendingErrorCode());
333 auto actual_error = *pending.GetStopSendingErrorCode();
334 EXPECT_EQ(actual_error, error);
335}
336
337TEST_P(PendingStreamTest, FromPendingStream) {
338 Initialize();
339
340 PendingStream pending(kTestPendingStreamId, session_.get());
341
342 QuicStreamFrame frame(kTestPendingStreamId, false, 2, ".");
343 pending.OnStreamFrame(frame);
344 pending.OnStreamFrame(frame);
345 QuicStreamFrame frame2(kTestPendingStreamId, true, 3, ".");
346 pending.OnStreamFrame(frame2);
347
348 TestStream stream(&pending, session_.get(), false);
349 EXPECT_EQ(3, stream.num_frames_received());
350 EXPECT_EQ(3u, stream.stream_bytes_read());
351 EXPECT_EQ(1, stream.num_duplicate_frames_received());
352 EXPECT_EQ(true, stream.fin_received());
353 EXPECT_EQ(frame2.offset + 1, stream.highest_received_byte_offset());
354 EXPECT_EQ(frame2.offset + 1,
355 session_->flow_controller()->highest_received_byte_offset());
356}
357
358TEST_P(PendingStreamTest, FromPendingStreamThenData) {
359 Initialize();
360
361 PendingStream pending(kTestPendingStreamId, session_.get());
362
363 QuicStreamFrame frame(kTestPendingStreamId, false, 2, ".");
364 pending.OnStreamFrame(frame);
365
366 auto stream = new TestStream(&pending, session_.get(), false);
367 session_->ActivateStream(absl::WrapUnique(stream));
368
369 QuicStreamFrame frame2(kTestPendingStreamId, true, 3, ".");
370 stream->OnStreamFrame(frame2);
371
372 EXPECT_EQ(2, stream->num_frames_received());
373 EXPECT_EQ(2u, stream->stream_bytes_read());
374 EXPECT_EQ(true, stream->fin_received());
375 EXPECT_EQ(frame2.offset + 1, stream->highest_received_byte_offset());
376 EXPECT_EQ(frame2.offset + 1,
377 session_->flow_controller()->highest_received_byte_offset());
378}
379
martinduke890a21c2024-09-18 07:46:32 -0700380TEST_P(PendingStreamTest, ResetStreamAt) {
381 Initialize();
382 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
383 return;
384 }
385
386 PendingStream pending(kTestPendingStreamId, session_.get());
387
388 QuicResetStreamAtFrame rst(0, kTestPendingStreamId, QUIC_STREAM_CANCELLED,
389 100, 3);
390 pending.OnResetStreamAtFrame(rst);
391 QuicStreamFrame frame(kTestPendingStreamId, false, 2, ".");
392 pending.OnStreamFrame(frame);
393
394 auto stream = new TestStream(&pending, session_.get(), false);
395 session_->ActivateStream(absl::WrapUnique(stream));
396
397 EXPECT_FALSE(stream->rst_received());
398 EXPECT_FALSE(stream->read_side_closed());
399 EXPECT_CALL(*stream, OnDataAvailable()).WillOnce([&]() {
400 stream->ConsumeData(3);
401 });
402 QuicStreamFrame frame2(kTestPendingStreamId, false, 0, "..");
403 stream->OnStreamFrame(frame2);
404 EXPECT_TRUE(stream->read_side_closed());
405 EXPECT_TRUE(stream->rst_received());
406}
407
Bence Békybac04052022-04-07 15:44:29 -0400408TEST_P(QuicStreamTest, WriteAllData) {
409 Initialize();
410
411 QuicByteCount length =
412 1 + QuicPacketCreator::StreamFramePacketOverhead(
martindukea12ff5d2022-10-12 17:25:51 -0700413 connection_->transport_version(), kPacket8ByteConnectionId,
414 kPacket0ByteConnectionId, !kIncludeVersion,
Bence Békybac04052022-04-07 15:44:29 -0400415 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
dschinazi35c0ff72022-08-16 12:10:06 -0700416 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
417 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0u);
Bence Békybac04052022-04-07 15:44:29 -0400418 connection_->SetMaxPacketLength(length);
419
420 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
421 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
422 stream_->WriteOrBufferData(kData1, false, nullptr);
423 EXPECT_FALSE(HasWriteBlockedStreams());
424}
425
426TEST_P(QuicStreamTest, NoBlockingIfNoDataOrFin) {
427 Initialize();
428
429 // Write no data and no fin. If we consume nothing we should not be write
430 // blocked.
431 EXPECT_QUIC_BUG(
432 stream_->WriteOrBufferData(absl::string_view(), false, nullptr), "");
433 EXPECT_FALSE(HasWriteBlockedStreams());
434}
435
436TEST_P(QuicStreamTest, BlockIfOnlySomeDataConsumed) {
437 Initialize();
438
439 // Write some data and no fin. If we consume some but not all of the data,
440 // we should be write blocked a not all the data was consumed.
441 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
442 .WillOnce(InvokeWithoutArgs([this]() {
443 return session_->ConsumeData(stream_->id(), 1u, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -0800444 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400445 }));
446 stream_->WriteOrBufferData(absl::string_view(kData1, 2), false, nullptr);
447 EXPECT_TRUE(session_->HasUnackedStreamData());
448 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
449 EXPECT_EQ(1u, stream_->BufferedDataBytes());
450}
451
452TEST_P(QuicStreamTest, BlockIfFinNotConsumedWithData) {
453 Initialize();
454
455 // Write some data and no fin. If we consume all the data but not the fin,
456 // we should be write blocked because the fin was not consumed.
457 // (This should never actually happen as the fin should be sent out with the
458 // last data)
459 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
460 .WillOnce(InvokeWithoutArgs([this]() {
461 return session_->ConsumeData(stream_->id(), 2u, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -0800462 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400463 }));
464 stream_->WriteOrBufferData(absl::string_view(kData1, 2), true, nullptr);
465 EXPECT_TRUE(session_->HasUnackedStreamData());
466 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
467}
468
469TEST_P(QuicStreamTest, BlockIfSoloFinNotConsumed) {
470 Initialize();
471
472 // Write no data and a fin. If we consume nothing we should be write blocked,
473 // as the fin was not consumed.
474 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
475 .WillOnce(Return(QuicConsumedData(0, false)));
476 stream_->WriteOrBufferData(absl::string_view(), true, nullptr);
477 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
478}
479
480TEST_P(QuicStreamTest, CloseOnPartialWrite) {
481 Initialize();
482
483 // Write some data and no fin. However, while writing the data
484 // close the stream and verify that MarkConnectionLevelWriteBlocked does not
485 // crash with an unknown stream.
486 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
487 .WillOnce(Invoke(this, &QuicStreamTest::CloseStreamOnWriteError));
488 stream_->WriteOrBufferData(absl::string_view(kData1, 2), false, nullptr);
489 ASSERT_EQ(0u, write_blocked_list_->NumBlockedStreams());
490}
491
492TEST_P(QuicStreamTest, WriteOrBufferData) {
493 Initialize();
494
495 EXPECT_FALSE(HasWriteBlockedStreams());
496 QuicByteCount length =
497 1 + QuicPacketCreator::StreamFramePacketOverhead(
martindukea12ff5d2022-10-12 17:25:51 -0700498 connection_->transport_version(), kPacket8ByteConnectionId,
499 kPacket0ByteConnectionId, !kIncludeVersion,
Bence Békybac04052022-04-07 15:44:29 -0400500 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
dschinazi35c0ff72022-08-16 12:10:06 -0700501 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
502 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0u);
Bence Békybac04052022-04-07 15:44:29 -0400503 connection_->SetMaxPacketLength(length);
504
505 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
506 .WillOnce(InvokeWithoutArgs([this]() {
507 return session_->ConsumeData(stream_->id(), kDataLen - 1, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -0800508 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400509 }));
510 stream_->WriteOrBufferData(kData1, false, nullptr);
511
512 EXPECT_TRUE(session_->HasUnackedStreamData());
513 EXPECT_EQ(1u, stream_->BufferedDataBytes());
514 EXPECT_TRUE(HasWriteBlockedStreams());
515
516 // Queue a bytes_consumed write.
517 stream_->WriteOrBufferData(kData2, false, nullptr);
518 EXPECT_EQ(10u, stream_->BufferedDataBytes());
519 // Make sure we get the tail of the first write followed by the bytes_consumed
520 InSequence s;
521 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
522 .WillOnce(InvokeWithoutArgs([this]() {
523 return session_->ConsumeData(stream_->id(), kDataLen - 1, kDataLen - 1,
vasilvv243b2622023-11-07 17:01:30 -0800524 NO_FIN, NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400525 }));
526 EXPECT_CALL(*stream_, OnCanWriteNewData());
527 stream_->OnCanWrite();
528 EXPECT_TRUE(session_->HasUnackedStreamData());
529
530 // And finally the end of the bytes_consumed.
531 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
532 .WillOnce(InvokeWithoutArgs([this]() {
533 return session_->ConsumeData(stream_->id(), 2u, 2 * kDataLen - 2,
vasilvv243b2622023-11-07 17:01:30 -0800534 NO_FIN, NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400535 }));
536 EXPECT_CALL(*stream_, OnCanWriteNewData());
537 stream_->OnCanWrite();
538 EXPECT_TRUE(session_->HasUnackedStreamData());
539}
540
541TEST_P(QuicStreamTest, WriteOrBufferDataReachStreamLimit) {
542 Initialize();
543 std::string data("aaaaa");
544 QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - data.length(),
545 stream_);
546 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
547 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
548 stream_->WriteOrBufferData(data, false, nullptr);
549 EXPECT_TRUE(session_->HasUnackedStreamData());
vasilvvac2e30d2022-06-02 14:26:59 -0700550 EXPECT_QUIC_BUG(
551 {
552 EXPECT_CALL(*connection_,
553 CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
554 stream_->WriteOrBufferData("a", false, nullptr);
555 },
556 "Write too many data via stream");
Bence Békybac04052022-04-07 15:44:29 -0400557}
558
559TEST_P(QuicStreamTest, ConnectionCloseAfterStreamClose) {
560 Initialize();
561
562 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
563 QUIC_STREAM_CANCELLED, 1234);
564 stream_->OnStreamReset(rst_frame);
565 if (VersionHasIetfQuicFrames(session_->transport_version())) {
566 // Create and inject a STOP SENDING frame to complete the close
567 // of the stream. This is only needed for version 99/IETF QUIC.
568 QuicStopSendingFrame stop_sending(kInvalidControlFrameId, stream_->id(),
569 QUIC_STREAM_CANCELLED);
570 session_->OnStopSendingFrame(stop_sending);
571 }
572 EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_STREAM_CANCELLED));
573 EXPECT_THAT(stream_->connection_error(), IsQuicNoError());
renjietang20dbb382024-06-20 14:31:32 -0700574 QuicConnectionCloseFrame frame;
575 frame.quic_error_code = QUIC_INTERNAL_ERROR;
576 stream_->OnConnectionClosed(frame, ConnectionCloseSource::FROM_SELF);
Bence Békybac04052022-04-07 15:44:29 -0400577 EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_STREAM_CANCELLED));
578 EXPECT_THAT(stream_->connection_error(), IsQuicNoError());
579}
580
581TEST_P(QuicStreamTest, RstAlwaysSentIfNoFinSent) {
582 // For flow control accounting, a stream must send either a FIN or a RST frame
583 // before termination.
584 // Test that if no FIN has been sent, we send a RST.
585
586 Initialize();
587 EXPECT_FALSE(fin_sent());
588 EXPECT_FALSE(rst_sent());
589
590 // Write some data, with no FIN.
591 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
592 .WillOnce(InvokeWithoutArgs([this]() {
593 return session_->ConsumeData(stream_->id(), 1u, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -0800594 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400595 }));
596 stream_->WriteOrBufferData(absl::string_view(kData1, 1), false, nullptr);
597 EXPECT_TRUE(session_->HasUnackedStreamData());
598 EXPECT_FALSE(fin_sent());
599 EXPECT_FALSE(rst_sent());
600
601 // Now close the stream, and expect that we send a RST.
602 EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _));
603 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
604 QUIC_STREAM_CANCELLED, 1234);
605 stream_->OnStreamReset(rst_frame);
606 if (VersionHasIetfQuicFrames(session_->transport_version())) {
607 // Create and inject a STOP SENDING frame to complete the close
608 // of the stream. This is only needed for version 99/IETF QUIC.
609 QuicStopSendingFrame stop_sending(kInvalidControlFrameId, stream_->id(),
610 QUIC_STREAM_CANCELLED);
611 session_->OnStopSendingFrame(stop_sending);
612 }
613 EXPECT_FALSE(session_->HasUnackedStreamData());
614 EXPECT_FALSE(fin_sent());
615 EXPECT_TRUE(rst_sent());
616}
617
618TEST_P(QuicStreamTest, RstNotSentIfFinSent) {
619 // For flow control accounting, a stream must send either a FIN or a RST frame
620 // before termination.
621 // Test that if a FIN has been sent, we don't also send a RST.
622
623 Initialize();
624 EXPECT_FALSE(fin_sent());
625 EXPECT_FALSE(rst_sent());
626
627 // Write some data, with FIN.
628 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
629 .WillOnce(InvokeWithoutArgs([this]() {
630 return session_->ConsumeData(stream_->id(), 1u, 0u, FIN,
vasilvv243b2622023-11-07 17:01:30 -0800631 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400632 }));
633 stream_->WriteOrBufferData(absl::string_view(kData1, 1), true, nullptr);
634 EXPECT_TRUE(fin_sent());
635 EXPECT_FALSE(rst_sent());
636
637 // Now close the stream, and expect that we do not send a RST.
638 QuicStreamPeer::CloseReadSide(stream_);
639 stream_->CloseWriteSide();
640 EXPECT_TRUE(fin_sent());
641 EXPECT_FALSE(rst_sent());
642}
643
644TEST_P(QuicStreamTest, OnlySendOneRst) {
645 // For flow control accounting, a stream must send either a FIN or a RST frame
646 // before termination.
647 // Test that if a stream sends a RST, it doesn't send an additional RST during
648 // OnClose() (this shouldn't be harmful, but we shouldn't do it anyway...)
649
650 Initialize();
651 EXPECT_FALSE(fin_sent());
652 EXPECT_FALSE(rst_sent());
653
654 // Reset the stream.
655 EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, _, _)).Times(1);
656 stream_->Reset(QUIC_STREAM_CANCELLED);
657 EXPECT_FALSE(fin_sent());
658 EXPECT_TRUE(rst_sent());
659
660 // Now close the stream (any further resets being sent would break the
661 // expectation above).
662 QuicStreamPeer::CloseReadSide(stream_);
663 stream_->CloseWriteSide();
664 EXPECT_FALSE(fin_sent());
665 EXPECT_TRUE(rst_sent());
666}
667
668TEST_P(QuicStreamTest, StreamFlowControlMultipleWindowUpdates) {
669 Initialize();
670
671 // If we receive multiple WINDOW_UPDATES (potentially out of order), then we
672 // want to make sure we latch the largest offset we see.
673
674 // Initially should be default.
675 EXPECT_EQ(kMinimumFlowControlSendWindow,
676 QuicStreamPeer::SendWindowOffset(stream_));
677
678 // Check a single WINDOW_UPDATE results in correct offset.
679 QuicWindowUpdateFrame window_update_1(kInvalidControlFrameId, stream_->id(),
680 kMinimumFlowControlSendWindow + 5);
681 stream_->OnWindowUpdateFrame(window_update_1);
682 EXPECT_EQ(window_update_1.max_data,
683 QuicStreamPeer::SendWindowOffset(stream_));
684
685 // Now send a few more WINDOW_UPDATES and make sure that only the largest is
686 // remembered.
687 QuicWindowUpdateFrame window_update_2(kInvalidControlFrameId, stream_->id(),
688 1);
689 QuicWindowUpdateFrame window_update_3(kInvalidControlFrameId, stream_->id(),
690 kMinimumFlowControlSendWindow + 10);
691 QuicWindowUpdateFrame window_update_4(kInvalidControlFrameId, stream_->id(),
692 5678);
693 stream_->OnWindowUpdateFrame(window_update_2);
694 stream_->OnWindowUpdateFrame(window_update_3);
695 stream_->OnWindowUpdateFrame(window_update_4);
696 EXPECT_EQ(window_update_3.max_data,
697 QuicStreamPeer::SendWindowOffset(stream_));
698}
699
700TEST_P(QuicStreamTest, FrameStats) {
701 Initialize();
702
703 EXPECT_EQ(0, stream_->num_frames_received());
704 EXPECT_EQ(0, stream_->num_duplicate_frames_received());
705 QuicStreamFrame frame(stream_->id(), false, 0, ".");
706 EXPECT_CALL(*stream_, OnDataAvailable()).Times(2);
707 stream_->OnStreamFrame(frame);
708 EXPECT_EQ(1, stream_->num_frames_received());
709 EXPECT_EQ(0, stream_->num_duplicate_frames_received());
710 stream_->OnStreamFrame(frame);
711 EXPECT_EQ(2, stream_->num_frames_received());
712 EXPECT_EQ(1, stream_->num_duplicate_frames_received());
713 QuicStreamFrame frame2(stream_->id(), false, 1, "abc");
714 stream_->OnStreamFrame(frame2);
715}
716
717// Verify that when we receive a packet which violates flow control (i.e. sends
718// too much data on the stream) that the stream sequencer never sees this frame,
719// as we check for violation and close the connection early.
720TEST_P(QuicStreamTest, StreamSequencerNeverSeesPacketsViolatingFlowControl) {
721 Initialize();
722
723 // Receive a stream frame that violates flow control: the byte offset is
724 // higher than the receive window offset.
725 QuicStreamFrame frame(stream_->id(), false,
726 kInitialSessionFlowControlWindowForTest + 1, ".");
727 EXPECT_GT(frame.offset, QuicStreamPeer::ReceiveWindowOffset(stream_));
728
729 // Stream should not accept the frame, and the connection should be closed.
730 EXPECT_CALL(*connection_,
731 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
732 stream_->OnStreamFrame(frame);
733}
734
735// Verify that after the consumer calls StopReading(), the stream still sends
736// flow control updates.
737TEST_P(QuicStreamTest, StopReadingSendsFlowControl) {
738 Initialize();
739
740 stream_->StopReading();
741
742 // Connection should not get terminated due to flow control errors.
743 EXPECT_CALL(*connection_,
744 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _))
745 .Times(0);
746 EXPECT_CALL(*session_, WriteControlFrame(_, _))
747 .Times(AtLeast(1))
748 .WillRepeatedly(Invoke(&ClearControlFrameWithTransmissionType));
749
750 std::string data(1000, 'x');
751 for (QuicStreamOffset offset = 0;
752 offset < 2 * kInitialStreamFlowControlWindowForTest;
753 offset += data.length()) {
754 QuicStreamFrame frame(stream_->id(), false, offset, data);
755 stream_->OnStreamFrame(frame);
756 }
757 EXPECT_LT(kInitialStreamFlowControlWindowForTest,
758 QuicStreamPeer::ReceiveWindowOffset(stream_));
759}
760
761TEST_P(QuicStreamTest, FinalByteOffsetFromFin) {
762 Initialize();
763
764 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
765
766 QuicStreamFrame stream_frame_no_fin(stream_->id(), false, 1234, ".");
767 stream_->OnStreamFrame(stream_frame_no_fin);
768 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
769
770 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
771 stream_->OnStreamFrame(stream_frame_with_fin);
772 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
773}
774
775TEST_P(QuicStreamTest, FinalByteOffsetFromRst) {
776 Initialize();
777
778 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
779 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
780 QUIC_STREAM_CANCELLED, 1234);
781 stream_->OnStreamReset(rst_frame);
782 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
783}
784
785TEST_P(QuicStreamTest, InvalidFinalByteOffsetFromRst) {
786 Initialize();
787
788 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
789 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
790 QUIC_STREAM_CANCELLED, 0xFFFFFFFFFFFF);
791 // Stream should not accept the frame, and the connection should be closed.
792 EXPECT_CALL(*connection_,
793 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
794 stream_->OnStreamReset(rst_frame);
795 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
796}
797
798TEST_P(QuicStreamTest, FinalByteOffsetFromZeroLengthStreamFrame) {
799 // When receiving Trailers, an empty stream frame is created with the FIN set,
800 // and is passed to OnStreamFrame. The Trailers may be sent in advance of
801 // queued body bytes being sent, and thus the final byte offset may exceed
802 // current flow control limits. Flow control should only be concerned with
803 // data that has actually been sent/received, so verify that flow control
804 // ignores such a stream frame.
805 Initialize();
806
807 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
808 const QuicStreamOffset kByteOffsetExceedingFlowControlWindow =
809 kInitialSessionFlowControlWindowForTest + 1;
810 const QuicStreamOffset current_stream_flow_control_offset =
811 QuicStreamPeer::ReceiveWindowOffset(stream_);
812 const QuicStreamOffset current_connection_flow_control_offset =
813 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller());
814 ASSERT_GT(kByteOffsetExceedingFlowControlWindow,
815 current_stream_flow_control_offset);
816 ASSERT_GT(kByteOffsetExceedingFlowControlWindow,
817 current_connection_flow_control_offset);
818 QuicStreamFrame zero_length_stream_frame_with_fin(
819 stream_->id(), /*fin=*/true, kByteOffsetExceedingFlowControlWindow,
820 absl::string_view());
821 EXPECT_EQ(0, zero_length_stream_frame_with_fin.data_length);
822
823 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
824 stream_->OnStreamFrame(zero_length_stream_frame_with_fin);
825 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
826
827 // The flow control receive offset values should not have changed.
828 EXPECT_EQ(current_stream_flow_control_offset,
829 QuicStreamPeer::ReceiveWindowOffset(stream_));
830 EXPECT_EQ(
831 current_connection_flow_control_offset,
832 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller()));
833}
834
835TEST_P(QuicStreamTest, OnStreamResetOffsetOverflow) {
836 Initialize();
837 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
838 QUIC_STREAM_CANCELLED, kMaxStreamLength + 1);
839 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
840 stream_->OnStreamReset(rst_frame);
841}
842
843TEST_P(QuicStreamTest, OnStreamFrameUpperLimit) {
844 Initialize();
845
846 // Modify receive window offset and sequencer buffer total_bytes_read_ to
847 // avoid flow control violation.
848 QuicStreamPeer::SetReceiveWindowOffset(stream_, kMaxStreamLength + 5u);
849 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(),
850 kMaxStreamLength + 5u);
851 QuicStreamSequencerPeer::SetFrameBufferTotalBytesRead(
852 QuicStreamPeer::sequencer(stream_), kMaxStreamLength - 10u);
853
854 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _))
855 .Times(0);
856 QuicStreamFrame stream_frame(stream_->id(), false, kMaxStreamLength - 1, ".");
857 stream_->OnStreamFrame(stream_frame);
858 QuicStreamFrame stream_frame2(stream_->id(), true, kMaxStreamLength, "");
859 stream_->OnStreamFrame(stream_frame2);
860}
861
862TEST_P(QuicStreamTest, StreamTooLong) {
863 Initialize();
Bence Békybac04052022-04-07 15:44:29 -0400864 QuicStreamFrame stream_frame(stream_->id(), false, kMaxStreamLength, ".");
865 EXPECT_QUIC_PEER_BUG(
vasilvvac2e30d2022-06-02 14:26:59 -0700866 {
867 EXPECT_CALL(*connection_,
868 CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _))
869 .Times(1);
870 stream_->OnStreamFrame(stream_frame);
871 },
Bence Békybac04052022-04-07 15:44:29 -0400872 absl::StrCat("Receive stream frame on stream ", stream_->id(),
873 " reaches max stream length"));
874}
875
876TEST_P(QuicStreamTest, SetDrainingIncomingOutgoing) {
877 // Don't have incoming data consumed.
878 Initialize();
879
880 // Incoming data with FIN.
881 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
882 stream_->OnStreamFrame(stream_frame_with_fin);
883 // The FIN has been received but not consumed.
884 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
885 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
886 EXPECT_FALSE(stream_->reading_stopped());
887
888 EXPECT_EQ(1u, QuicSessionPeer::GetNumOpenDynamicStreams(session_.get()));
889
890 // Outgoing data with FIN.
891 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
892 .WillOnce(InvokeWithoutArgs([this]() {
893 return session_->ConsumeData(stream_->id(), 2u, 0u, FIN,
vasilvv243b2622023-11-07 17:01:30 -0800894 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400895 }));
896 stream_->WriteOrBufferData(absl::string_view(kData1, 2), true, nullptr);
897 EXPECT_TRUE(stream_->write_side_closed());
898
899 EXPECT_EQ(1u, QuicSessionPeer::GetNumDrainingStreams(session_.get()));
900 EXPECT_EQ(0u, QuicSessionPeer::GetNumOpenDynamicStreams(session_.get()));
901}
902
903TEST_P(QuicStreamTest, SetDrainingOutgoingIncoming) {
904 // Don't have incoming data consumed.
905 Initialize();
906
907 // Outgoing data with FIN.
908 EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
909 .WillOnce(InvokeWithoutArgs([this]() {
910 return session_->ConsumeData(stream_->id(), 2u, 0u, FIN,
vasilvv243b2622023-11-07 17:01:30 -0800911 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -0400912 }));
913 stream_->WriteOrBufferData(absl::string_view(kData1, 2), true, nullptr);
914 EXPECT_TRUE(stream_->write_side_closed());
915
916 EXPECT_EQ(1u, QuicSessionPeer::GetNumOpenDynamicStreams(session_.get()));
917
918 // Incoming data with FIN.
919 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
920 stream_->OnStreamFrame(stream_frame_with_fin);
921 // The FIN has been received but not consumed.
922 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
923 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
924 EXPECT_FALSE(stream_->reading_stopped());
925
926 EXPECT_EQ(1u, QuicSessionPeer::GetNumDrainingStreams(session_.get()));
927 EXPECT_EQ(0u, QuicSessionPeer::GetNumOpenDynamicStreams(session_.get()));
928}
929
930TEST_P(QuicStreamTest, EarlyResponseFinHandling) {
931 // Verify that if the server completes the response before reading the end of
932 // the request, the received FIN is recorded.
933
934 Initialize();
935 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
936 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
937 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
938
939 // Receive data for the request.
940 EXPECT_CALL(*stream_, OnDataAvailable()).Times(1);
941 QuicStreamFrame frame1(stream_->id(), false, 0, "Start");
942 stream_->OnStreamFrame(frame1);
943 // When QuicSimpleServerStream sends the response, it calls
944 // QuicStream::CloseReadSide() first.
945 QuicStreamPeer::CloseReadSide(stream_);
946 // Send data and FIN for the response.
947 stream_->WriteOrBufferData(kData1, false, nullptr);
948 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
949 // Receive remaining data and FIN for the request.
950 QuicStreamFrame frame2(stream_->id(), true, 0, "End");
951 stream_->OnStreamFrame(frame2);
952 EXPECT_TRUE(stream_->fin_received());
953 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
954}
955
956TEST_P(QuicStreamTest, StreamWaitsForAcks) {
957 Initialize();
958 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
959 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
960 // Stream is not waiting for acks initially.
961 EXPECT_FALSE(stream_->IsWaitingForAcks());
962 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
963 EXPECT_FALSE(session_->HasUnackedStreamData());
964
965 // Send kData1.
966 stream_->WriteOrBufferData(kData1, false, nullptr);
967 EXPECT_TRUE(session_->HasUnackedStreamData());
968 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
969 EXPECT_TRUE(stream_->IsWaitingForAcks());
970 QuicByteCount newly_acked_length = 0;
971 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
972 QuicTime::Zero(),
973 &newly_acked_length));
974 EXPECT_EQ(9u, newly_acked_length);
975 // Stream is not waiting for acks as all sent data is acked.
976 EXPECT_FALSE(stream_->IsWaitingForAcks());
977 EXPECT_FALSE(session_->HasUnackedStreamData());
978 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
979
980 // Send kData2.
981 stream_->WriteOrBufferData(kData2, false, nullptr);
982 EXPECT_TRUE(stream_->IsWaitingForAcks());
983 EXPECT_TRUE(session_->HasUnackedStreamData());
984 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
985 // Send FIN.
986 stream_->WriteOrBufferData("", true, nullptr);
987 // Fin only frame is not stored in send buffer.
988 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
989
990 // kData2 is retransmitted.
991 stream_->OnStreamFrameRetransmitted(9, 9, false);
992
993 // kData2 is acked.
994 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
995 QuicTime::Zero(),
996 &newly_acked_length));
997 EXPECT_EQ(9u, newly_acked_length);
998 // Stream is waiting for acks as FIN is not acked.
999 EXPECT_TRUE(stream_->IsWaitingForAcks());
1000 EXPECT_TRUE(session_->HasUnackedStreamData());
1001 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1002
1003 // FIN is acked.
1004 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState());
1005 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 0, true, QuicTime::Delta::Zero(),
1006 QuicTime::Zero(),
1007 &newly_acked_length));
1008 EXPECT_EQ(0u, newly_acked_length);
1009 EXPECT_FALSE(stream_->IsWaitingForAcks());
1010 EXPECT_FALSE(session_->HasUnackedStreamData());
1011 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1012}
1013
1014TEST_P(QuicStreamTest, StreamDataGetAckedOutOfOrder) {
1015 Initialize();
1016 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1017 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1018 // Send data.
1019 stream_->WriteOrBufferData(kData1, false, nullptr);
1020 stream_->WriteOrBufferData(kData1, false, nullptr);
1021 stream_->WriteOrBufferData(kData1, false, nullptr);
1022 stream_->WriteOrBufferData("", true, nullptr);
1023 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
1024 EXPECT_TRUE(stream_->IsWaitingForAcks());
1025 EXPECT_TRUE(session_->HasUnackedStreamData());
1026 QuicByteCount newly_acked_length = 0;
1027 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
1028 QuicTime::Zero(),
1029 &newly_acked_length));
1030 EXPECT_TRUE(session_->HasUnackedStreamData());
1031 EXPECT_EQ(9u, newly_acked_length);
1032 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
1033 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 9, false, QuicTime::Delta::Zero(),
1034 QuicTime::Zero(),
1035 &newly_acked_length));
1036 EXPECT_TRUE(session_->HasUnackedStreamData());
1037 EXPECT_EQ(9u, newly_acked_length);
1038 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
1039 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
1040 QuicTime::Zero(),
1041 &newly_acked_length));
1042 EXPECT_TRUE(session_->HasUnackedStreamData());
1043 EXPECT_EQ(9u, newly_acked_length);
1044 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1045 // FIN is not acked yet.
1046 EXPECT_TRUE(stream_->IsWaitingForAcks());
1047 EXPECT_TRUE(session_->HasUnackedStreamData());
1048 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState());
1049 EXPECT_TRUE(stream_->OnStreamFrameAcked(27, 0, true, QuicTime::Delta::Zero(),
1050 QuicTime::Zero(),
1051 &newly_acked_length));
1052 EXPECT_EQ(0u, newly_acked_length);
1053 EXPECT_FALSE(stream_->IsWaitingForAcks());
1054 EXPECT_FALSE(session_->HasUnackedStreamData());
1055}
1056
1057TEST_P(QuicStreamTest, CancelStream) {
1058 Initialize();
1059 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1060 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1061 EXPECT_FALSE(stream_->IsWaitingForAcks());
1062 EXPECT_FALSE(session_->HasUnackedStreamData());
1063 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1064
1065 stream_->WriteOrBufferData(kData1, false, nullptr);
1066 EXPECT_TRUE(stream_->IsWaitingForAcks());
1067 EXPECT_TRUE(session_->HasUnackedStreamData());
1068 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1069 // Cancel stream.
1070 stream_->MaybeSendStopSending(QUIC_STREAM_NO_ERROR);
1071 // stream still waits for acks as the error code is QUIC_STREAM_NO_ERROR, and
1072 // data is going to be retransmitted.
1073 EXPECT_TRUE(stream_->IsWaitingForAcks());
1074 EXPECT_TRUE(session_->HasUnackedStreamData());
1075 EXPECT_CALL(*connection_,
1076 OnStreamReset(stream_->id(), QUIC_STREAM_CANCELLED));
1077 EXPECT_CALL(*session_, WriteControlFrame(_, _))
1078 .Times(AtLeast(1))
1079 .WillRepeatedly(Invoke(&ClearControlFrameWithTransmissionType));
1080
1081 EXPECT_CALL(*session_, MaybeSendRstStreamFrame(_, _, _))
1082 .WillOnce(InvokeWithoutArgs([this]() {
1083 session_->ReallyMaybeSendRstStreamFrame(
1084 stream_->id(), QUIC_STREAM_CANCELLED,
1085 stream_->stream_bytes_written());
1086 }));
1087
1088 stream_->Reset(QUIC_STREAM_CANCELLED);
1089 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1090 // Stream stops waiting for acks as data is not going to be retransmitted.
1091 EXPECT_FALSE(stream_->IsWaitingForAcks());
1092 EXPECT_FALSE(session_->HasUnackedStreamData());
1093}
1094
1095TEST_P(QuicStreamTest, RstFrameReceivedStreamNotFinishSending) {
1096 if (VersionHasIetfQuicFrames(GetParam().transport_version)) {
1097 // In IETF QUIC, receiving a RESET_STREAM will only close the read side. The
1098 // stream itself is not closed and will not send reset.
1099 return;
1100 }
1101
1102 Initialize();
1103 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1104 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1105 EXPECT_FALSE(stream_->IsWaitingForAcks());
1106 EXPECT_FALSE(session_->HasUnackedStreamData());
1107 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1108
1109 stream_->WriteOrBufferData(kData1, false, nullptr);
1110 EXPECT_TRUE(stream_->IsWaitingForAcks());
1111 EXPECT_TRUE(session_->HasUnackedStreamData());
1112 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1113
1114 // RST_STREAM received.
1115 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
1116 QUIC_STREAM_CANCELLED, 9);
1117
1118 EXPECT_CALL(
1119 *session_,
1120 MaybeSendRstStreamFrame(
1121 stream_->id(),
1122 QuicResetStreamError::FromInternal(QUIC_RST_ACKNOWLEDGEMENT), 9));
1123 stream_->OnStreamReset(rst_frame);
1124 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1125 // Stream stops waiting for acks as it does not finish sending and rst is
1126 // sent.
1127 EXPECT_FALSE(stream_->IsWaitingForAcks());
1128 EXPECT_FALSE(session_->HasUnackedStreamData());
1129}
1130
1131TEST_P(QuicStreamTest, RstFrameReceivedStreamFinishSending) {
1132 Initialize();
1133 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1134 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1135 EXPECT_FALSE(stream_->IsWaitingForAcks());
1136 EXPECT_FALSE(session_->HasUnackedStreamData());
1137 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1138
1139 stream_->WriteOrBufferData(kData1, true, nullptr);
1140 EXPECT_TRUE(stream_->IsWaitingForAcks());
1141 EXPECT_TRUE(session_->HasUnackedStreamData());
1142
1143 // RST_STREAM received.
1144 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
1145 QUIC_STREAM_CANCELLED, 1234);
1146 stream_->OnStreamReset(rst_frame);
1147 // Stream still waits for acks as it finishes sending and has unacked data.
1148 EXPECT_TRUE(stream_->IsWaitingForAcks());
1149 EXPECT_TRUE(session_->HasUnackedStreamData());
1150 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1151}
1152
1153TEST_P(QuicStreamTest, ConnectionClosed) {
1154 Initialize();
1155 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1156 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1157 EXPECT_FALSE(stream_->IsWaitingForAcks());
1158 EXPECT_FALSE(session_->HasUnackedStreamData());
1159 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1160
1161 stream_->WriteOrBufferData(kData1, false, nullptr);
1162 EXPECT_TRUE(stream_->IsWaitingForAcks());
1163 EXPECT_TRUE(session_->HasUnackedStreamData());
1164 EXPECT_CALL(
1165 *session_,
1166 MaybeSendRstStreamFrame(
1167 stream_->id(),
1168 QuicResetStreamError::FromInternal(QUIC_RST_ACKNOWLEDGEMENT), 9));
1169 QuicConnectionPeer::SetConnectionClose(connection_);
renjietang20dbb382024-06-20 14:31:32 -07001170 QuicConnectionCloseFrame frame;
1171 frame.quic_error_code = QUIC_INTERNAL_ERROR;
1172 stream_->OnConnectionClosed(frame, ConnectionCloseSource::FROM_SELF);
Bence Békybac04052022-04-07 15:44:29 -04001173 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1174 // Stream stops waiting for acks as connection is going to close.
1175 EXPECT_FALSE(stream_->IsWaitingForAcks());
1176 EXPECT_FALSE(session_->HasUnackedStreamData());
1177}
1178
1179TEST_P(QuicStreamTest, CanWriteNewDataAfterData) {
birenroyef686222022-09-12 11:34:34 -07001180 SetQuicFlag(quic_buffered_data_threshold, 100);
Bence Békybac04052022-04-07 15:44:29 -04001181 Initialize();
1182 EXPECT_TRUE(stream_->CanWriteNewDataAfterData(99));
1183 EXPECT_FALSE(stream_->CanWriteNewDataAfterData(100));
1184}
1185
1186TEST_P(QuicStreamTest, WriteBufferedData) {
1187 // Set buffered data low water mark to be 100.
birenroyef686222022-09-12 11:34:34 -07001188 SetQuicFlag(quic_buffered_data_threshold, 100);
Bence Békybac04052022-04-07 15:44:29 -04001189
1190 Initialize();
1191 std::string data(1024, 'a');
1192 EXPECT_TRUE(stream_->CanWriteNewData());
1193
1194 // Testing WriteOrBufferData.
1195 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1196 .WillOnce(InvokeWithoutArgs([this]() {
1197 return session_->ConsumeData(stream_->id(), 100u, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001198 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001199 }));
1200 stream_->WriteOrBufferData(data, false, nullptr);
1201 stream_->WriteOrBufferData(data, false, nullptr);
1202 stream_->WriteOrBufferData(data, false, nullptr);
1203 EXPECT_TRUE(stream_->IsWaitingForAcks());
1204
1205 // Verify all data is saved.
1206 EXPECT_EQ(3 * data.length() - 100, stream_->BufferedDataBytes());
1207
1208 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1209 .WillOnce(InvokeWithoutArgs([this]() {
1210 return session_->ConsumeData(stream_->id(), 100, 100u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001211 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001212 }));
1213 // Buffered data size > threshold, do not ask upper layer for more data.
1214 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(0);
1215 stream_->OnCanWrite();
1216 EXPECT_EQ(3 * data.length() - 200, stream_->BufferedDataBytes());
1217 EXPECT_FALSE(stream_->CanWriteNewData());
1218
1219 // Send buffered data to make buffered data size < threshold.
1220 QuicByteCount data_to_write =
birenroyef686222022-09-12 11:34:34 -07001221 3 * data.length() - 200 - GetQuicFlag(quic_buffered_data_threshold) + 1;
Bence Békybac04052022-04-07 15:44:29 -04001222 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1223 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1224 return session_->ConsumeData(stream_->id(), data_to_write, 200u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001225 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001226 }));
1227 // Buffered data size < threshold, ask upper layer for more data.
1228 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1229 stream_->OnCanWrite();
birenroyef686222022-09-12 11:34:34 -07001230 EXPECT_EQ(
1231 static_cast<uint64_t>(GetQuicFlag(quic_buffered_data_threshold) - 1),
1232 stream_->BufferedDataBytes());
Bence Békybac04052022-04-07 15:44:29 -04001233 EXPECT_TRUE(stream_->CanWriteNewData());
1234
1235 // Flush all buffered data.
1236 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1237 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1238 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1239 stream_->OnCanWrite();
1240 EXPECT_EQ(0u, stream_->BufferedDataBytes());
1241 EXPECT_FALSE(stream_->HasBufferedData());
1242 EXPECT_TRUE(stream_->CanWriteNewData());
1243
1244 // Testing Writev.
1245 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1246 .WillOnce(Return(QuicConsumedData(0, false)));
martinduke4bc013a2024-12-10 10:19:27 -08001247 QuicConsumedData consumed = SendApplicationData(data, data.length(), false);
Bence Békybac04052022-04-07 15:44:29 -04001248
1249 // There is no buffered data before, all data should be consumed without
1250 // respecting buffered data upper limit.
1251 EXPECT_EQ(data.length(), consumed.bytes_consumed);
1252 EXPECT_FALSE(consumed.fin_consumed);
1253 EXPECT_EQ(data.length(), stream_->BufferedDataBytes());
1254 EXPECT_FALSE(stream_->CanWriteNewData());
1255
1256 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(0);
martinduke4bc013a2024-12-10 10:19:27 -08001257 consumed = SendApplicationData(data, data.length(), false);
1258
Bence Békybac04052022-04-07 15:44:29 -04001259 // No Data can be consumed as buffered data is beyond upper limit.
1260 EXPECT_EQ(0u, consumed.bytes_consumed);
1261 EXPECT_FALSE(consumed.fin_consumed);
1262 EXPECT_EQ(data.length(), stream_->BufferedDataBytes());
1263
birenroyef686222022-09-12 11:34:34 -07001264 data_to_write = data.length() - GetQuicFlag(quic_buffered_data_threshold) + 1;
Bence Békybac04052022-04-07 15:44:29 -04001265 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1266 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1267 return session_->ConsumeData(stream_->id(), data_to_write, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001268 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001269 }));
1270
1271 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1272 stream_->OnCanWrite();
birenroyef686222022-09-12 11:34:34 -07001273 EXPECT_EQ(
1274 static_cast<uint64_t>(GetQuicFlag(quic_buffered_data_threshold) - 1),
1275 stream_->BufferedDataBytes());
Bence Békybac04052022-04-07 15:44:29 -04001276 EXPECT_TRUE(stream_->CanWriteNewData());
1277
1278 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(0);
1279 // All data can be consumed as buffered data is below upper limit.
martinduke4bc013a2024-12-10 10:19:27 -08001280 consumed = SendApplicationData(data, data.length(), false);
Bence Békybac04052022-04-07 15:44:29 -04001281 EXPECT_EQ(data.length(), consumed.bytes_consumed);
1282 EXPECT_FALSE(consumed.fin_consumed);
birenroyef686222022-09-12 11:34:34 -07001283 EXPECT_EQ(data.length() + GetQuicFlag(quic_buffered_data_threshold) - 1,
Bence Békybac04052022-04-07 15:44:29 -04001284 stream_->BufferedDataBytes());
1285 EXPECT_FALSE(stream_->CanWriteNewData());
1286}
1287
1288TEST_P(QuicStreamTest, WritevDataReachStreamLimit) {
1289 Initialize();
1290 std::string data("aaaaa");
1291 QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - data.length(),
1292 stream_);
1293 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1294 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
martinduke4bc013a2024-12-10 10:19:27 -08001295 QuicConsumedData consumed = SendApplicationData(data, 5, false);
Bence Békybac04052022-04-07 15:44:29 -04001296 EXPECT_EQ(data.length(), consumed.bytes_consumed);
vasilvvac2e30d2022-06-02 14:26:59 -07001297 EXPECT_QUIC_BUG(
1298 {
1299 EXPECT_CALL(*connection_,
1300 CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
martinduke4bc013a2024-12-10 10:19:27 -08001301 SendApplicationData(data, 1, false);
vasilvvac2e30d2022-06-02 14:26:59 -07001302 },
1303 "Write too many data via stream");
Bence Békybac04052022-04-07 15:44:29 -04001304}
1305
1306TEST_P(QuicStreamTest, WriteMemSlices) {
1307 // Set buffered data low water mark to be 100.
birenroyef686222022-09-12 11:34:34 -07001308 SetQuicFlag(quic_buffered_data_threshold, 100);
Bence Békybac04052022-04-07 15:44:29 -04001309
1310 Initialize();
1311 constexpr QuicByteCount kDataSize = 1024;
1312 quiche::QuicheBufferAllocator* allocator =
1313 connection_->helper()->GetStreamSendBufferAllocator();
1314 std::vector<quiche::QuicheMemSlice> vector1;
1315 vector1.push_back(
1316 quiche::QuicheMemSlice(quiche::QuicheBuffer(allocator, kDataSize)));
1317 vector1.push_back(
1318 quiche::QuicheMemSlice(quiche::QuicheBuffer(allocator, kDataSize)));
1319 std::vector<quiche::QuicheMemSlice> vector2;
1320 vector2.push_back(
1321 quiche::QuicheMemSlice(quiche::QuicheBuffer(allocator, kDataSize)));
1322 vector2.push_back(
1323 quiche::QuicheMemSlice(quiche::QuicheBuffer(allocator, kDataSize)));
1324 absl::Span<quiche::QuicheMemSlice> span1(vector1);
1325 absl::Span<quiche::QuicheMemSlice> span2(vector2);
1326
1327 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1328 .WillOnce(InvokeWithoutArgs([this]() {
1329 return session_->ConsumeData(stream_->id(), 100u, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001330 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001331 }));
1332 // There is no buffered data before, all data should be consumed.
1333 QuicConsumedData consumed = stream_->WriteMemSlices(span1, false);
1334 EXPECT_EQ(2048u, consumed.bytes_consumed);
1335 EXPECT_FALSE(consumed.fin_consumed);
1336 EXPECT_EQ(2 * kDataSize - 100, stream_->BufferedDataBytes());
1337 EXPECT_FALSE(stream_->fin_buffered());
1338
1339 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(0);
1340 // No Data can be consumed as buffered data is beyond upper limit.
1341 consumed = stream_->WriteMemSlices(span2, true);
1342 EXPECT_EQ(0u, consumed.bytes_consumed);
1343 EXPECT_FALSE(consumed.fin_consumed);
1344 EXPECT_EQ(2 * kDataSize - 100, stream_->BufferedDataBytes());
1345 EXPECT_FALSE(stream_->fin_buffered());
1346
1347 QuicByteCount data_to_write =
birenroyef686222022-09-12 11:34:34 -07001348 2 * kDataSize - 100 - GetQuicFlag(quic_buffered_data_threshold) + 1;
Bence Békybac04052022-04-07 15:44:29 -04001349 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1350 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1351 return session_->ConsumeData(stream_->id(), data_to_write, 100u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001352 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001353 }));
1354 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1355 stream_->OnCanWrite();
birenroyef686222022-09-12 11:34:34 -07001356 EXPECT_EQ(
1357 static_cast<uint64_t>(GetQuicFlag(quic_buffered_data_threshold) - 1),
1358 stream_->BufferedDataBytes());
Bence Békybac04052022-04-07 15:44:29 -04001359 // Try to write slices2 again.
1360 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(0);
1361 consumed = stream_->WriteMemSlices(span2, true);
1362 EXPECT_EQ(2048u, consumed.bytes_consumed);
1363 EXPECT_TRUE(consumed.fin_consumed);
birenroyef686222022-09-12 11:34:34 -07001364 EXPECT_EQ(2 * kDataSize + GetQuicFlag(quic_buffered_data_threshold) - 1,
Bence Békybac04052022-04-07 15:44:29 -04001365 stream_->BufferedDataBytes());
1366 EXPECT_TRUE(stream_->fin_buffered());
1367
1368 // Flush all buffered data.
1369 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1370 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1371 stream_->OnCanWrite();
1372 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(0);
1373 EXPECT_FALSE(stream_->HasBufferedData());
1374 EXPECT_TRUE(stream_->write_side_closed());
1375}
1376
1377TEST_P(QuicStreamTest, WriteMemSlicesReachStreamLimit) {
1378 Initialize();
1379 QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - 5u, stream_);
1380 std::vector<std::pair<char*, size_t>> buffers;
1381 quiche::QuicheMemSlice slice1 = MemSliceFromString("12345");
1382 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1383 .WillOnce(InvokeWithoutArgs([this]() {
1384 return session_->ConsumeData(stream_->id(), 5u, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001385 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001386 }));
1387 // There is no buffered data before, all data should be consumed.
1388 QuicConsumedData consumed = stream_->WriteMemSlice(std::move(slice1), false);
1389 EXPECT_EQ(5u, consumed.bytes_consumed);
1390
1391 quiche::QuicheMemSlice slice2 = MemSliceFromString("6");
vasilvvac2e30d2022-06-02 14:26:59 -07001392 EXPECT_QUIC_BUG(
1393 {
1394 EXPECT_CALL(*connection_,
1395 CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
1396 stream_->WriteMemSlice(std::move(slice2), false);
1397 },
1398 "Write too many data via stream");
Bence Békybac04052022-04-07 15:44:29 -04001399}
1400
1401TEST_P(QuicStreamTest, StreamDataGetAckedMultipleTimes) {
1402 Initialize();
1403 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1404 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1405 EXPECT_FALSE(stream_->IsWaitingForAcks());
1406 EXPECT_FALSE(session_->HasUnackedStreamData());
1407
1408 // Send [0, 27) and fin.
1409 stream_->WriteOrBufferData(kData1, false, nullptr);
1410 stream_->WriteOrBufferData(kData1, false, nullptr);
1411 stream_->WriteOrBufferData(kData1, true, nullptr);
1412 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
1413 EXPECT_TRUE(stream_->IsWaitingForAcks());
1414 EXPECT_TRUE(session_->HasUnackedStreamData());
1415 // Ack [0, 9), [5, 22) and [18, 26)
1416 // Verify [0, 9) 9 bytes are acked.
1417 QuicByteCount newly_acked_length = 0;
1418 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
1419 QuicTime::Zero(),
1420 &newly_acked_length));
1421 EXPECT_EQ(9u, newly_acked_length);
1422 EXPECT_EQ(2u, QuicStreamPeer::SendBuffer(stream_).size());
1423 // Verify [9, 22) 13 bytes are acked.
1424 EXPECT_TRUE(stream_->OnStreamFrameAcked(5, 17, false, QuicTime::Delta::Zero(),
1425 QuicTime::Zero(),
1426 &newly_acked_length));
1427 EXPECT_EQ(13u, newly_acked_length);
1428 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1429 // Verify [22, 26) 4 bytes are acked.
1430 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 8, false, QuicTime::Delta::Zero(),
1431 QuicTime::Zero(),
1432 &newly_acked_length));
1433 EXPECT_EQ(4u, newly_acked_length);
1434 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1435 EXPECT_TRUE(stream_->IsWaitingForAcks());
1436 EXPECT_TRUE(session_->HasUnackedStreamData());
1437
1438 // Ack [0, 27). Verify [26, 27) 1 byte is acked.
1439 EXPECT_TRUE(stream_->OnStreamFrameAcked(26, 1, false, QuicTime::Delta::Zero(),
1440 QuicTime::Zero(),
1441 &newly_acked_length));
1442 EXPECT_EQ(1u, newly_acked_length);
1443 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1444 EXPECT_TRUE(stream_->IsWaitingForAcks());
1445 EXPECT_TRUE(session_->HasUnackedStreamData());
1446
1447 // Ack Fin.
1448 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState()).Times(1);
1449 EXPECT_TRUE(stream_->OnStreamFrameAcked(27, 0, true, QuicTime::Delta::Zero(),
1450 QuicTime::Zero(),
1451 &newly_acked_length));
1452 EXPECT_EQ(0u, newly_acked_length);
1453 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1454 EXPECT_FALSE(stream_->IsWaitingForAcks());
1455 EXPECT_FALSE(session_->HasUnackedStreamData());
1456
1457 // Ack [10, 27) and fin. No new data is acked.
1458 EXPECT_FALSE(
1459 stream_->OnStreamFrameAcked(10, 17, true, QuicTime::Delta::Zero(),
1460 QuicTime::Zero(), &newly_acked_length));
1461 EXPECT_EQ(0u, newly_acked_length);
1462 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1463 EXPECT_FALSE(stream_->IsWaitingForAcks());
1464 EXPECT_FALSE(session_->HasUnackedStreamData());
1465}
1466
1467TEST_P(QuicStreamTest, OnStreamFrameLost) {
1468 Initialize();
1469
1470 // Send [0, 9).
1471 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1472 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1473 stream_->WriteOrBufferData(kData1, false, nullptr);
1474 EXPECT_FALSE(stream_->HasBufferedData());
1475 EXPECT_TRUE(stream_->IsStreamFrameOutstanding(0, 9, false));
1476
1477 // Try to send [9, 27), but connection is blocked.
1478 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1479 .WillOnce(Return(QuicConsumedData(0, false)));
1480 stream_->WriteOrBufferData(kData2, false, nullptr);
1481 stream_->WriteOrBufferData(kData2, false, nullptr);
1482 EXPECT_TRUE(stream_->HasBufferedData());
1483 EXPECT_FALSE(stream_->HasPendingRetransmission());
1484
1485 // Lost [0, 9). When stream gets a chance to write, only lost data is
1486 // transmitted.
1487 stream_->OnStreamFrameLost(0, 9, false);
1488 EXPECT_TRUE(stream_->HasPendingRetransmission());
1489 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1490 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1491 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1492 stream_->OnCanWrite();
1493 EXPECT_FALSE(stream_->HasPendingRetransmission());
1494 EXPECT_TRUE(stream_->HasBufferedData());
1495
1496 // This OnCanWrite causes [9, 27) to be sent.
1497 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1498 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1499 stream_->OnCanWrite();
1500 EXPECT_FALSE(stream_->HasBufferedData());
1501
1502 // Send a fin only frame.
1503 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1504 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1505 stream_->WriteOrBufferData("", true, nullptr);
1506
1507 // Lost [9, 27) and fin.
1508 stream_->OnStreamFrameLost(9, 18, false);
1509 stream_->OnStreamFrameLost(27, 0, true);
1510 EXPECT_TRUE(stream_->HasPendingRetransmission());
1511
1512 // Ack [9, 18).
1513 QuicByteCount newly_acked_length = 0;
1514 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
1515 QuicTime::Zero(),
1516 &newly_acked_length));
1517 EXPECT_EQ(9u, newly_acked_length);
1518 EXPECT_FALSE(stream_->IsStreamFrameOutstanding(9, 3, false));
1519 EXPECT_TRUE(stream_->HasPendingRetransmission());
1520 // This OnCanWrite causes [18, 27) and fin to be retransmitted. Verify fin can
1521 // be bundled with data.
1522 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1523 .WillOnce(InvokeWithoutArgs([this]() {
1524 return session_->ConsumeData(stream_->id(), 9u, 18u, FIN,
vasilvv243b2622023-11-07 17:01:30 -08001525 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001526 }));
1527 stream_->OnCanWrite();
1528 EXPECT_FALSE(stream_->HasPendingRetransmission());
1529 // Lost [9, 18) again, but it is not considered as lost because kData2
1530 // has been acked.
1531 stream_->OnStreamFrameLost(9, 9, false);
1532 EXPECT_FALSE(stream_->HasPendingRetransmission());
1533 EXPECT_TRUE(stream_->IsStreamFrameOutstanding(27, 0, true));
1534}
1535
1536TEST_P(QuicStreamTest, CannotBundleLostFin) {
1537 Initialize();
1538
1539 // Send [0, 18) and fin.
1540 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1541 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1542 stream_->WriteOrBufferData(kData1, false, nullptr);
1543 stream_->WriteOrBufferData(kData2, true, nullptr);
1544
1545 // Lost [0, 9) and fin.
1546 stream_->OnStreamFrameLost(0, 9, false);
1547 stream_->OnStreamFrameLost(18, 0, true);
1548
1549 // Retransmit lost data. Verify [0, 9) and fin are retransmitted in two
1550 // frames.
1551 InSequence s;
1552 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1553 .WillOnce(InvokeWithoutArgs([this]() {
1554 return session_->ConsumeData(stream_->id(), 9u, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001555 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001556 }));
1557 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1558 .WillOnce(Return(QuicConsumedData(0, true)));
1559 stream_->OnCanWrite();
1560}
1561
1562TEST_P(QuicStreamTest, MarkConnectionLevelWriteBlockedOnWindowUpdateFrame) {
1563 Initialize();
1564
1565 // Set the config to a small value so that a newly created stream has small
1566 // send flow control window.
1567 QuicConfigPeer::SetReceivedInitialStreamFlowControlWindow(session_->config(),
1568 100);
1569 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesIncomingBidirectional(
1570 session_->config(), 100);
1571 auto stream = new TestStream(GetNthClientInitiatedBidirectionalStreamId(
1572 GetParam().transport_version, 2),
1573 session_.get(), BIDIRECTIONAL);
1574 session_->ActivateStream(absl::WrapUnique(stream));
1575
1576 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1577 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
QUICHE team1a271082022-05-18 10:22:22 -07001578 EXPECT_CALL(*session_, SendBlocked(_, _)).Times(1);
Bence Békybac04052022-04-07 15:44:29 -04001579 std::string data(1024, '.');
1580 stream->WriteOrBufferData(data, false, nullptr);
1581 EXPECT_FALSE(HasWriteBlockedStreams());
1582
1583 QuicWindowUpdateFrame window_update(kInvalidControlFrameId, stream_->id(),
1584 1234);
1585
1586 stream->OnWindowUpdateFrame(window_update);
1587 // Verify stream is marked connection level write blocked.
1588 EXPECT_TRUE(HasWriteBlockedStreams());
1589 EXPECT_TRUE(stream->HasBufferedData());
1590}
1591
1592// Regression test for b/73282665.
1593TEST_P(QuicStreamTest,
1594 MarkConnectionLevelWriteBlockedOnWindowUpdateFrameWithNoBufferedData) {
1595 Initialize();
1596
1597 // Set the config to a small value so that a newly created stream has small
1598 // send flow control window.
1599 QuicConfigPeer::SetReceivedInitialStreamFlowControlWindow(session_->config(),
1600 100);
1601 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesIncomingBidirectional(
1602 session_->config(), 100);
1603 auto stream = new TestStream(GetNthClientInitiatedBidirectionalStreamId(
1604 GetParam().transport_version, 2),
1605 session_.get(), BIDIRECTIONAL);
1606 session_->ActivateStream(absl::WrapUnique(stream));
1607
1608 std::string data(100, '.');
1609 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1610 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
QUICHE team1a271082022-05-18 10:22:22 -07001611 EXPECT_CALL(*session_, SendBlocked(_, _)).Times(1);
Bence Békybac04052022-04-07 15:44:29 -04001612 stream->WriteOrBufferData(data, false, nullptr);
1613 EXPECT_FALSE(HasWriteBlockedStreams());
1614
1615 QuicWindowUpdateFrame window_update(kInvalidControlFrameId, stream_->id(),
1616 120);
1617 stream->OnWindowUpdateFrame(window_update);
1618 EXPECT_FALSE(stream->HasBufferedData());
1619 // Verify stream is marked as blocked although there is no buffered data.
1620 EXPECT_TRUE(HasWriteBlockedStreams());
1621}
1622
1623TEST_P(QuicStreamTest, RetransmitStreamData) {
1624 Initialize();
1625 InSequence s;
1626
1627 // Send [0, 18) with fin.
1628 EXPECT_CALL(*session_, WritevData(stream_->id(), _, _, _, _, _))
1629 .Times(2)
1630 .WillRepeatedly(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1631 stream_->WriteOrBufferData(kData1, false, nullptr);
1632 stream_->WriteOrBufferData(kData1, true, nullptr);
1633 // Ack [10, 13).
1634 QuicByteCount newly_acked_length = 0;
1635 stream_->OnStreamFrameAcked(10, 3, false, QuicTime::Delta::Zero(),
1636 QuicTime::Zero(), &newly_acked_length);
1637 EXPECT_EQ(3u, newly_acked_length);
1638 // Retransmit [0, 18) with fin, and only [0, 8) is consumed.
1639 EXPECT_CALL(*session_, WritevData(stream_->id(), 10, 0, NO_FIN, _, _))
1640 .WillOnce(InvokeWithoutArgs([this]() {
1641 return session_->ConsumeData(stream_->id(), 8, 0u, NO_FIN,
vasilvv243b2622023-11-07 17:01:30 -08001642 NOT_RETRANSMISSION, std::nullopt);
Bence Békybac04052022-04-07 15:44:29 -04001643 }));
1644 EXPECT_FALSE(stream_->RetransmitStreamData(0, 18, true, PTO_RETRANSMISSION));
1645
1646 // Retransmit [0, 18) with fin, and all is consumed.
1647 EXPECT_CALL(*session_, WritevData(stream_->id(), 10, 0, NO_FIN, _, _))
1648 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1649 EXPECT_CALL(*session_, WritevData(stream_->id(), 5, 13, FIN, _, _))
1650 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1651 EXPECT_TRUE(stream_->RetransmitStreamData(0, 18, true, PTO_RETRANSMISSION));
1652
1653 // Retransmit [0, 8) with fin, and all is consumed.
1654 EXPECT_CALL(*session_, WritevData(stream_->id(), 8, 0, NO_FIN, _, _))
1655 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1656 EXPECT_CALL(*session_, WritevData(stream_->id(), 0, 18, FIN, _, _))
1657 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1658 EXPECT_TRUE(stream_->RetransmitStreamData(0, 8, true, PTO_RETRANSMISSION));
1659}
1660
1661TEST_P(QuicStreamTest, ResetStreamOnTtlExpiresRetransmitLostData) {
1662 Initialize();
1663
1664 EXPECT_CALL(*session_, WritevData(stream_->id(), 200, 0, FIN, _, _))
1665 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1666 std::string body(200, 'a');
1667 stream_->WriteOrBufferData(body, true, nullptr);
1668
1669 // Set TTL to be 1 s.
1670 QuicTime::Delta ttl = QuicTime::Delta::FromSeconds(1);
1671 ASSERT_TRUE(stream_->MaybeSetTtl(ttl));
1672 // Verify data gets retransmitted because TTL does not expire.
1673 EXPECT_CALL(*session_, WritevData(stream_->id(), 100, 0, NO_FIN, _, _))
1674 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1675 EXPECT_TRUE(stream_->RetransmitStreamData(0, 100, false, PTO_RETRANSMISSION));
1676 stream_->OnStreamFrameLost(100, 100, true);
1677 EXPECT_TRUE(stream_->HasPendingRetransmission());
1678
1679 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
1680 // Verify stream gets reset because TTL expires.
1681 if (session_->version().UsesHttp3()) {
1682 EXPECT_CALL(*session_,
1683 MaybeSendStopSendingFrame(_, QuicResetStreamError::FromInternal(
1684 QUIC_STREAM_TTL_EXPIRED)))
1685 .Times(1);
1686 }
1687 EXPECT_CALL(
1688 *session_,
1689 MaybeSendRstStreamFrame(
1690 _, QuicResetStreamError::FromInternal(QUIC_STREAM_TTL_EXPIRED), _))
1691 .Times(1);
1692 stream_->OnCanWrite();
1693}
1694
1695TEST_P(QuicStreamTest, ResetStreamOnTtlExpiresEarlyRetransmitData) {
1696 Initialize();
1697
1698 EXPECT_CALL(*session_, WritevData(stream_->id(), 200, 0, FIN, _, _))
1699 .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
1700 std::string body(200, 'a');
1701 stream_->WriteOrBufferData(body, true, nullptr);
1702
1703 // Set TTL to be 1 s.
1704 QuicTime::Delta ttl = QuicTime::Delta::FromSeconds(1);
1705 ASSERT_TRUE(stream_->MaybeSetTtl(ttl));
1706
1707 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
1708 // Verify stream gets reset because TTL expires.
1709 if (session_->version().UsesHttp3()) {
1710 EXPECT_CALL(*session_,
1711 MaybeSendStopSendingFrame(_, QuicResetStreamError::FromInternal(
1712 QUIC_STREAM_TTL_EXPIRED)))
1713 .Times(1);
1714 }
1715 EXPECT_CALL(
1716 *session_,
1717 MaybeSendRstStreamFrame(
1718 _, QuicResetStreamError::FromInternal(QUIC_STREAM_TTL_EXPIRED), _))
1719 .Times(1);
1720 stream_->RetransmitStreamData(0, 100, false, PTO_RETRANSMISSION);
1721}
1722
1723// Test that OnStreamReset does one-way (read) closes if version 99, two way
1724// (read and write) if not version 99.
1725TEST_P(QuicStreamTest, OnStreamResetReadOrReadWrite) {
1726 Initialize();
1727 EXPECT_FALSE(stream_->write_side_closed());
1728 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
1729
1730 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
1731 QUIC_STREAM_CANCELLED, 1234);
1732 stream_->OnStreamReset(rst_frame);
1733 if (VersionHasIetfQuicFrames(connection_->transport_version())) {
1734 // Version 99/IETF QUIC should close just the read side.
1735 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
1736 EXPECT_FALSE(stream_->write_side_closed());
1737 } else {
1738 // Google QUIC should close both sides of the stream.
1739 EXPECT_TRUE(stream_->write_side_closed());
1740 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
1741 }
1742}
1743
1744TEST_P(QuicStreamTest, WindowUpdateForReadOnlyStream) {
1745 Initialize();
1746
1747 QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
1748 connection_->transport_version(), Perspective::IS_CLIENT);
1749 TestStream stream(stream_id, session_.get(), READ_UNIDIRECTIONAL);
1750 QuicWindowUpdateFrame window_update_frame(kInvalidControlFrameId, stream_id,
1751 0);
1752 EXPECT_CALL(
1753 *connection_,
1754 CloseConnection(
1755 QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM,
1756 "WindowUpdateFrame received on READ_UNIDIRECTIONAL stream.", _));
1757 stream.OnWindowUpdateFrame(window_update_frame);
1758}
1759
1760TEST_P(QuicStreamTest, RstStreamFrameChangesCloseOffset) {
1761 Initialize();
1762
1763 QuicStreamFrame stream_frame(stream_->id(), true, 0, "abc");
1764 EXPECT_CALL(*stream_, OnDataAvailable());
1765 stream_->OnStreamFrame(stream_frame);
1766 QuicRstStreamFrame rst(kInvalidControlFrameId, stream_->id(),
1767 QUIC_STREAM_CANCELLED, 0u);
1768
1769 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_MULTIPLE_OFFSET, _, _));
1770 stream_->OnStreamReset(rst);
1771}
1772
1773// Regression test for b/176073284.
1774TEST_P(QuicStreamTest, EmptyStreamFrameWithNoFin) {
1775 Initialize();
1776 QuicStreamFrame empty_stream_frame(stream_->id(), false, 0, "");
1777 if (stream_->version().HasIetfQuicFrames()) {
1778 EXPECT_CALL(*connection_,
1779 CloseConnection(QUIC_EMPTY_STREAM_FRAME_NO_FIN, _, _))
1780 .Times(0);
1781 } else {
1782 EXPECT_CALL(*connection_,
1783 CloseConnection(QUIC_EMPTY_STREAM_FRAME_NO_FIN, _, _));
1784 }
1785 EXPECT_CALL(*stream_, OnDataAvailable()).Times(0);
1786 stream_->OnStreamFrame(empty_stream_frame);
1787}
1788
1789TEST_P(QuicStreamTest, SendRstWithCustomIetfCode) {
1790 Initialize();
1791 QuicResetStreamError error(QUIC_STREAM_CANCELLED, 0x1234abcd);
1792 EXPECT_CALL(*session_, MaybeSendRstStreamFrame(kTestStreamId, error, _))
1793 .Times(1);
1794 stream_->ResetWithError(error);
1795 EXPECT_TRUE(rst_sent());
1796}
1797
martinduke890a21c2024-09-18 07:46:32 -07001798TEST_P(QuicStreamTest, ResetWhenOffsetReached) {
1799 Initialize();
1800 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1801 return;
1802 }
1803 QuicResetStreamAtFrame rst(0, stream_->id(), QUIC_STREAM_CANCELLED, 400, 100);
1804 stream_->OnResetStreamAtFrame(rst); // Nothing happens.
1805
1806 // Send data to reach reliable_offset.
1807 char data[100];
1808 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([this]() {
1809 stream_->ConsumeData(99);
1810 });
1811 stream_->OnStreamFrame(
1812 QuicStreamFrame(stream_->id(), false, 0, absl::string_view(data, 99)));
1813 EXPECT_FALSE(stream_->rst_received());
1814 EXPECT_FALSE(stream_->read_side_closed());
1815 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([this]() {
1816 stream_->ConsumeData(1);
1817 });
1818 stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), false, 99,
1819 absl::string_view(data + 99, 1)));
1820 EXPECT_TRUE(stream_->rst_received());
1821 EXPECT_TRUE(stream_->read_side_closed());
1822}
1823
1824TEST_P(QuicStreamTest, ResetWhenOffsetReachedOutOfOrder) {
1825 Initialize();
1826 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1827 return;
1828 }
1829 QuicResetStreamAtFrame rst(0, stream_->id(), QUIC_STREAM_CANCELLED, 400, 100);
1830 stream_->OnResetStreamAtFrame(rst); // Nothing happens.
1831
1832 // Send data to reach reliable_offset.
1833 char data[100];
1834 stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), false, 99,
1835 absl::string_view(data + 99, 1)));
1836 EXPECT_FALSE(stream_->rst_received());
1837 EXPECT_FALSE(stream_->read_side_closed());
1838 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([this]() {
1839 stream_->ConsumeData(100);
1840 });
1841 stream_->OnStreamFrame(
1842 QuicStreamFrame(stream_->id(), false, 0, absl::string_view(data, 99)));
1843 EXPECT_TRUE(stream_->rst_received());
1844 EXPECT_TRUE(stream_->read_side_closed());
1845}
1846
1847TEST_P(QuicStreamTest, HigherReliableSizeIgnored) {
1848 Initialize();
1849 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1850 return;
1851 }
1852 QuicResetStreamAtFrame rst(0, stream_->id(), QUIC_STREAM_CANCELLED, 400, 100);
1853 stream_->OnResetStreamAtFrame(rst); // Nothing happens.
1854 QuicResetStreamAtFrame rst2(0, stream_->id(), QUIC_STREAM_CANCELLED, 400,
1855 200);
1856 stream_->OnResetStreamAtFrame(rst2); // Ignored.
1857
1858 // Send data to reach reliable_offset.
1859 char data[100];
1860 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([this]() {
1861 stream_->ConsumeData(99);
1862 });
1863 stream_->OnStreamFrame(
1864 QuicStreamFrame(stream_->id(), false, 0, absl::string_view(data, 99)));
1865 EXPECT_FALSE(stream_->rst_received());
1866 EXPECT_FALSE(stream_->read_side_closed());
1867 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([this]() {
1868 stream_->ConsumeData(1);
1869 });
1870 stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), false, 99,
1871 absl::string_view(data + 99, 1)));
1872 EXPECT_TRUE(stream_->rst_received());
1873 EXPECT_TRUE(stream_->read_side_closed());
1874}
1875
1876TEST_P(QuicStreamTest, InstantReset) {
1877 Initialize();
1878 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1879 return;
1880 }
1881 char data[100];
1882 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([this]() {
1883 stream_->ConsumeData(100);
1884 });
1885 stream_->OnStreamFrame(
1886 QuicStreamFrame(stream_->id(), false, 0, absl::string_view(data, 100)));
1887 QuicResetStreamAtFrame rst(0, stream_->id(), QUIC_STREAM_CANCELLED, 400, 100);
1888 EXPECT_FALSE(stream_->rst_received());
1889 EXPECT_FALSE(stream_->read_side_closed());
1890 stream_->OnResetStreamAtFrame(rst);
1891 EXPECT_TRUE(stream_->rst_received());
1892 EXPECT_TRUE(stream_->read_side_closed());
1893}
1894
1895TEST_P(QuicStreamTest, ResetIgnoredDueToFin) {
1896 Initialize();
1897 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1898 return;
1899 }
1900 char data[100];
1901 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([this]() {
1902 stream_->ConsumeData(98);
1903 });
1904 stream_->OnStreamFrame(
1905 QuicStreamFrame(stream_->id(), false, 0, absl::string_view(data, 98)));
1906 QuicResetStreamAtFrame rst(0, stream_->id(), QUIC_STREAM_CANCELLED, 100, 99);
1907 stream_->OnResetStreamAtFrame(rst); // Nothing happens.
1908 // There is no call to OnFinRead() because the stream is responsible for
1909 // doing that.
1910 EXPECT_FALSE(stream_->rst_received());
1911 EXPECT_FALSE(stream_->read_side_closed());
1912 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([this]() {
1913 stream_->ConsumeData(2);
1914 stream_->OnFinRead();
1915 });
1916 stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), true, 98,
1917 absl::string_view(data + 98, 2)));
1918 EXPECT_FALSE(stream_->rst_received());
1919 EXPECT_TRUE(stream_->read_side_closed());
1920}
1921
1922TEST_P(QuicStreamTest, ReliableOffsetBeyondFin) {
1923 Initialize();
1924 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1925 return;
1926 }
1927 char data[100];
1928 stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), true, 98,
1929 absl::string_view(data + 98, 2)));
1930 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_MULTIPLE_OFFSET, _, _))
1931 .Times(1);
1932 QuicResetStreamAtFrame rst(0, stream_->id(), QUIC_STREAM_CANCELLED, 101, 101);
1933 stream_->OnResetStreamAtFrame(rst); // Nothing happens.
1934}
1935
1936TEST_P(QuicStreamTest, FinBeforeReliableOffset) {
1937 Initialize();
1938 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1939 return;
1940 }
1941 QuicResetStreamAtFrame rst(0, stream_->id(), QUIC_STREAM_CANCELLED, 101, 101);
1942 stream_->OnResetStreamAtFrame(rst); // Nothing happens.
1943 char data[100];
1944 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_MULTIPLE_OFFSET, _, _))
1945 .Times(1);
1946 stream_->OnStreamFrame(
1947 QuicStreamFrame(stream_->id(), true, 0, absl::string_view(data, 100)));
1948}
1949
martinduke4bc013a2024-12-10 10:19:27 -08001950TEST_P(QuicStreamTest, ReliableSizeNotAckedAtTimeOfReset) {
1951 Initialize();
1952 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1953 return;
1954 }
1955 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08001956 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08001957 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1958 .WillOnce(Return(QuicConsumedData(100, false)));
1959 SendApplicationData(data, 100, false);
1960 EXPECT_TRUE(stream_->SetReliableSize());
1961 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
1962 stream_->PartialResetWriteSide(
1963 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
1964 QuicByteCount newly_acked_length = 0;
1965 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState()).Times(1);
1966 EXPECT_CALL(*connection_, OnStreamReset(stream_->id(), _)).Times(1);
1967 stream_->OnStreamFrameAcked(0, 100, false, QuicTime::Delta::Zero(),
1968 QuicTime::Zero(), &newly_acked_length);
1969 std::vector<std::unique_ptr<QuicStream>>* closed_streams =
1970 session_->ClosedStreams();
1971 EXPECT_TRUE(closed_streams->empty());
1972 // Peer sends RST_STREAM in response.
1973 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
1974 QUIC_STREAM_CANCELLED, 1234);
1975 stream_->OnStreamReset(rst_frame);
1976 EXPECT_EQ((*(closed_streams->begin()))->id(), stream_->id());
1977 ASSERT_EQ(closed_streams->size(), 1);
1978}
1979
1980TEST_P(QuicStreamTest, ReliableSizeNotAckedAtTimeOfResetAndRetransmitted) {
1981 Initialize();
1982 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
1983 return;
1984 }
1985 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08001986 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08001987 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1988 .WillOnce(Return(QuicConsumedData(100, false)));
1989 SendApplicationData(data, 100, false);
1990 EXPECT_TRUE(stream_->SetReliableSize());
1991 // Send 50 more bytes that aren't reliable.
1992 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
1993 .WillOnce(Return(QuicConsumedData(50, false)));
1994 SendApplicationData(data, 50, false);
1995 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
1996 stream_->PartialResetWriteSide(
1997 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
1998
1999 // Lose all the bytes.
2000 stream_->OnStreamFrameLost(0, 150, false);
2001 // Cause retransmission of the reliable bytes.
2002 EXPECT_CALL(*session_, WritevData(stream_->id(), 100, 0, _, _, _))
2003 .WillOnce(Return(QuicConsumedData(100, false)));
2004 stream_->OnCanWrite();
2005
2006 // Ack the reliable bytes, and close.
2007 QuicByteCount newly_acked_length = 0;
2008 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState()).Times(1);
2009 EXPECT_CALL(*connection_, OnStreamReset(stream_->id(), _)).Times(1);
2010 stream_->OnStreamFrameAcked(0, 100, false, QuicTime::Delta::Zero(),
2011 QuicTime::Zero(), &newly_acked_length);
2012 std::vector<std::unique_ptr<QuicStream>>* closed_streams =
2013 session_->ClosedStreams();
2014 EXPECT_TRUE(closed_streams->empty());
2015 // Peer sends RST_STREAM in response.
2016 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
2017 QUIC_STREAM_CANCELLED, 1234);
2018 stream_->OnStreamReset(rst_frame);
2019 EXPECT_EQ((*(closed_streams->begin()))->id(), stream_->id());
2020 ASSERT_EQ(closed_streams->size(), 1);
2021}
2022
2023TEST_P(QuicStreamTest, ReliableSizeNotAckedAtTimeOfResetThenReadSideReset) {
2024 Initialize();
2025 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2026 return;
2027 }
2028 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002029 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002030 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
2031 .WillOnce(Return(QuicConsumedData(100, false)));
2032 SendApplicationData(data, 100, false);
2033 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2034 EXPECT_TRUE(stream_->SetReliableSize());
2035 stream_->PartialResetWriteSide(
2036 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2037
2038 // Peer sends RST_STREAM in response.
2039 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
2040 QUIC_STREAM_CANCELLED, 1234);
2041 stream_->OnStreamReset(rst_frame);
2042 std::vector<std::unique_ptr<QuicStream>>* closed_streams =
2043 session_->ClosedStreams();
2044 ASSERT_TRUE(closed_streams->empty());
2045 QuicByteCount newly_acked_length = 0;
2046 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState()).Times(1);
2047 EXPECT_CALL(*connection_, OnStreamReset(stream_->id(), _)).Times(1);
2048 stream_->OnStreamFrameAcked(0, 100, false, QuicTime::Delta::Zero(),
2049 QuicTime::Zero(), &newly_acked_length);
2050 ASSERT_EQ(closed_streams->size(), 1);
2051 EXPECT_EQ((*(closed_streams->begin()))->id(), stream_->id());
2052}
2053
2054TEST_P(QuicStreamTest, ReliableSizeNotAckedAtTimeOfResetThenReadSideFin) {
2055 Initialize();
2056 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2057 return;
2058 }
2059 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002060 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002061 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
2062 .WillOnce(Return(QuicConsumedData(100, false)));
2063 SendApplicationData(data, 100, false);
2064 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2065 EXPECT_TRUE(stream_->SetReliableSize());
2066 stream_->PartialResetWriteSide(
2067 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2068 EXPECT_TRUE(stream_->write_side_closed());
2069
2070 // Peer sends OOO FIN.
2071 stream_->OnStreamFrame(
2072 QuicStreamFrame(stream_->id(), true, sizeof(data), ""));
2073 std::vector<std::unique_ptr<QuicStream>>* closed_streams =
2074 session_->ClosedStreams();
2075 ASSERT_TRUE(closed_streams->empty());
2076 EXPECT_FALSE(stream_->read_side_closed()); // Missing the data before 100.
2077
2078 QuicByteCount newly_acked_length = 0;
2079 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState()).Times(1);
2080 EXPECT_CALL(*connection_, OnStreamReset(stream_->id(), _)).Times(1);
2081 stream_->OnStreamFrameAcked(0, 100, false, QuicTime::Delta::Zero(),
2082 QuicTime::Zero(), &newly_acked_length);
2083 ASSERT_TRUE(closed_streams->empty());
2084 // The rest of the stream arrives.
2085 EXPECT_CALL(*stream_, OnDataAvailable()).WillOnce([&]() {
2086 // Most classes derived from QuicStream do something like this in
2087 // OnDataAvailable. This is how FIN-related state is updated.
2088 std::string buffer;
2089 stream_->sequencer()->Read(&buffer);
2090 if (stream_->sequencer()->IsClosed()) {
2091 stream_->OnFinRead();
2092 }
2093 });
2094 stream_->OnStreamFrame(QuicStreamFrame(
2095 stream_->id(), false, 0, absl::string_view(data, sizeof(data))));
2096 EXPECT_TRUE(stream_->read_side_closed());
2097 ASSERT_EQ(closed_streams->size(), 1);
2098 EXPECT_EQ((*(closed_streams->begin()))->id(), stream_->id());
2099}
2100
2101TEST_P(QuicStreamTest, ReliableSizeAckedAtTimeOfReset) {
2102 Initialize();
2103 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2104 return;
2105 }
2106 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
2107 .WillOnce(Return(QuicConsumedData(100, false)));
2108 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002109 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002110 SendApplicationData(data, 100, false);
2111 QuicByteCount newly_acked_length = 0;
2112 stream_->OnStreamFrameAcked(0, 100, false, QuicTime::Delta::Zero(),
2113 QuicTime::Zero(), &newly_acked_length);
2114 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2115 EXPECT_TRUE(stream_->SetReliableSize());
2116 EXPECT_CALL(*connection_, OnStreamReset(stream_->id(), _)).Times(1);
2117 stream_->PartialResetWriteSide(
2118 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2119}
2120
2121TEST_P(QuicStreamTest, BufferedDataInReliableSize) {
2122 Initialize();
2123 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2124 return;
2125 }
2126 EXPECT_CALL(*session_, WritevData(stream_->id(), 100, 0, _, _, _))
2127 .WillOnce(Return(QuicConsumedData(50, false)));
2128 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002129 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002130 // 50 bytes of this will be buffered.
2131 SendApplicationData(data, 100, false);
2132 EXPECT_EQ(stream_->BufferedDataBytes(), 50);
2133 EXPECT_TRUE(stream_->SetReliableSize());
2134 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2135 stream_->PartialResetWriteSide(
2136 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2137 EXPECT_FALSE(stream_->write_side_closed());
2138 EXPECT_CALL(*session_, WritevData(stream_->id(), 50, 50, _, _, _))
2139 .WillOnce(Return(QuicConsumedData(50, false)));
2140 stream_->OnCanWrite();
2141 // Now that the stream has sent 100 bytes, the write side can be closed.
2142 EXPECT_TRUE(stream_->write_side_closed());
2143 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState()).Times(1);
2144 EXPECT_CALL(*connection_, OnStreamReset(stream_->id(), _)).Times(1);
2145 QuicByteCount newly_acked_length = 0;
2146 stream_->OnStreamFrameAcked(0, 100, false, QuicTime::Delta::Zero(),
2147 QuicTime::Zero(), &newly_acked_length);
2148}
2149
2150TEST_P(QuicStreamTest, ReliableSizeIsFinOffset) {
2151 Initialize();
2152 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2153 return;
2154 }
2155 EXPECT_CALL(*session_, WritevData(_, 100, 0, FIN, _, _))
2156 .WillOnce(Return(QuicConsumedData(100, true)));
2157 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002158 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002159 SendApplicationData(data, 100, true);
2160 // Send STOP_SENDING, but nothing else.
2161 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2162 EXPECT_CALL(*session_, MaybeSendRstStreamFrame(_, _, _)).Times(0);
2163 EXPECT_TRUE(stream_->SetReliableSize());
2164 stream_->PartialResetWriteSide(
2165 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2166 // Lose the packet; the stream will not be FINed again.
2167 stream_->OnStreamFrameLost(0, 100, true);
2168 EXPECT_CALL(*session_,
2169 WritevData(stream_->id(), 100, 0, NO_FIN, LOSS_RETRANSMISSION, _))
2170 .WillOnce(Return(QuicConsumedData(100, true)));
2171 stream_->OnCanWrite();
2172}
2173
2174TEST_P(QuicStreamTest, DataAfterResetStreamAt) {
2175 Initialize();
2176 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2177 return;
2178 }
2179 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002180 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002181 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
2182 .WillOnce(Return(QuicConsumedData(100, false)));
2183 SendApplicationData(data, 100, false);
2184 EXPECT_TRUE(stream_->SetReliableSize());
2185 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2186 stream_->PartialResetWriteSide(
2187 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2188 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(0);
2189 EXPECT_QUIC_BUG(SendApplicationData(data, 100, false),
2190 "Fin already buffered or RESET_STREAM_AT sent");
2191 EXPECT_EQ(stream_->stream_bytes_written(), 100);
2192}
2193
2194TEST_P(QuicStreamTest, SetReliableSizeOnUnidirectionalRead) {
2195 Initialize();
2196 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2197 return;
2198 }
2199 QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
2200 connection_->transport_version(), Perspective::IS_CLIENT);
2201 TestStream stream(stream_id, session_.get(), READ_UNIDIRECTIONAL);
2202 EXPECT_FALSE(stream.SetReliableSize());
2203}
2204
2205// This covers the case where the read side is already closed, that the zombie
2206// stream is cleaned up.
2207TEST_P(QuicStreamTest, ResetStreamAtUnidirectionalWrite) {
2208 Initialize();
2209 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2210 return;
2211 }
2212 const QuicStreamId kId = 3;
2213 std::unique_ptr<TestStream> stream =
2214 std::make_unique<TestStream>(kId, session_.get(), WRITE_UNIDIRECTIONAL);
2215 TestStream* stream_ptr = stream.get();
2216 session_->ActivateStream(std::move(stream));
2217 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002218 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002219 EXPECT_CALL(*session_, WritevData(kId, _, _, _, _, _))
2220 .WillOnce(Return(QuicConsumedData(100, false)));
2221 SendApplicationData(stream_ptr, data, 100, false);
2222 EXPECT_TRUE(stream_ptr->SetReliableSize());
2223 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2224 stream_ptr->PartialResetWriteSide(
2225 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2226 EXPECT_CALL(*stream_ptr, OnWriteSideInDataRecvdState());
2227 EXPECT_CALL(*connection_, OnStreamReset(kId, _)).Times(1);
2228 ;
2229 QuicByteCount newly_acked_length = 0;
2230 stream_ptr->OnStreamFrameAcked(0, 100, false, QuicTime::Delta::Zero(),
2231 QuicTime::Zero(), &newly_acked_length);
2232 std::vector<std::unique_ptr<QuicStream>>* closed_streams =
2233 session_->ClosedStreams();
2234 ASSERT_EQ(closed_streams->size(), 1);
2235 EXPECT_EQ((*(closed_streams->begin()))->id(), kId);
2236}
2237
2238// This covers the case where the read side is already closed with FIN, that the
2239// zombie stream is cleaned up.
2240TEST_P(QuicStreamTest, ResetStreamAtReadSideFin) {
2241 Initialize();
2242 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2243 return;
2244 }
2245 // Fin the read side.
2246 QuicStreamId stream_id = stream_->id();
2247 EXPECT_CALL(*stream_, OnDataAvailable()).Times(1);
2248 stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), true, 0, ""));
2249 stream_->OnFinRead();
2250 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002251 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002252 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
2253 .WillOnce(Return(QuicConsumedData(100, false)));
2254 SendApplicationData(data, 100, false);
2255 EXPECT_TRUE(stream_->SetReliableSize());
2256 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2257 stream_->PartialResetWriteSide(
2258 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2259 EXPECT_CALL(*stream_, OnWriteSideInDataRecvdState());
2260 EXPECT_CALL(*connection_, OnStreamReset(stream_id, _)).Times(1);
2261 QuicByteCount newly_acked_length = 0;
2262 stream_->OnStreamFrameAcked(0, 100, false, QuicTime::Delta::Zero(),
2263 QuicTime::Zero(), &newly_acked_length);
2264 std::vector<std::unique_ptr<QuicStream>>* closed_streams =
2265 session_->ClosedStreams();
2266 ASSERT_EQ(closed_streams->size(), 1);
2267 EXPECT_EQ((*(closed_streams->begin()))->id(), stream_id);
2268}
2269
2270TEST_P(QuicStreamTest, ResetStreamAtAfterStopSending) {
2271 Initialize();
2272 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2273 return;
2274 }
2275 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002276 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002277 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
2278 .WillOnce(Return(QuicConsumedData(100, false)));
2279 stream_->WriteOrBufferData(absl::string_view(data, 100), false, nullptr);
2280 EXPECT_TRUE(stream_->SetReliableSize());
2281 EXPECT_CALL(*session_, MaybeSendResetStreamAtFrame(_, _, _, _)).Times(1);
2282 stream_->OnStopSending(
2283 QuicResetStreamError::FromInternal(QUIC_STREAM_CANCELLED));
2284}
2285
2286TEST_P(QuicStreamTest, RejectReliableSizeOldVersion) {
2287 Initialize();
2288 if (VersionHasIetfQuicFrames(session_->transport_version())) {
2289 return;
2290 }
2291 char data[100];
martindukebf33a4a2024-12-11 10:53:57 -08002292 memset(data, 0, sizeof(data));
martinduke4bc013a2024-12-10 10:19:27 -08002293 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
2294 .WillOnce(Return(QuicConsumedData(100, false)));
2295 stream_->WriteOrBufferData(absl::string_view(data, 100), false, nullptr);
2296 EXPECT_FALSE(stream_->SetReliableSize());
2297}
2298
2299TEST_P(QuicStreamTest, RejectReliableSizeReadOnlyStream) {
2300 Initialize();
2301 if (!VersionHasIetfQuicFrames(session_->transport_version())) {
2302 return;
2303 }
2304 auto uni = new StrictMock<TestStream>(6, session_.get(), READ_UNIDIRECTIONAL);
2305 session_->ActivateStream(absl::WrapUnique(uni));
2306 EXPECT_FALSE(uni->SetReliableSize());
2307}
2308
Bence Békybac04052022-04-07 15:44:29 -04002309} // namespace
2310} // namespace test
2311} // namespace quic