blob: 0a7178737737c9e2c8f0072ab761de5470064437 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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 "net/third_party/quiche/src/quic/core/quic_stream.h"
6
7#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -07008#include <string>
bnc463f2352019-10-10 04:49:34 -07009#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -050010
renjietang15afba32019-10-23 14:32:35 -070011#include "net/third_party/quiche/src/quic/core/frames/quic_rst_stream_frame.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050012#include "net/third_party/quiche/src/quic/core/quic_connection.h"
renjietang39979d32019-09-13 10:02:13 -070013#include "net/third_party/quiche/src/quic/core/quic_constants.h"
renjietang15afba32019-10-23 14:32:35 -070014#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
renjietang39979d32019-09-13 10:02:13 -070015#include "net/third_party/quiche/src/quic/core/quic_types.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050016#include "net/third_party/quiche/src/quic/core/quic_utils.h"
17#include "net/third_party/quiche/src/quic/core/quic_versions.h"
18#include "net/third_party/quiche/src/quic/core/quic_write_blocked_list.h"
19#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
20#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
21#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
22#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
23#include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_storage.h"
24#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050025#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
26#include "net/third_party/quiche/src/quic/platform/api/quic_test_mem_slice_vector.h"
27#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h"
28#include "net/third_party/quiche/src/quic/test_tools/quic_connection_peer.h"
29#include "net/third_party/quiche/src/quic/test_tools/quic_flow_controller_peer.h"
30#include "net/third_party/quiche/src/quic/test_tools/quic_session_peer.h"
31#include "net/third_party/quiche/src/quic/test_tools/quic_stream_peer.h"
32#include "net/third_party/quiche/src/quic/test_tools/quic_stream_sequencer_peer.h"
33#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
dmcardlecf0bfcf2019-12-13 08:08:21 -080034#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050035
36using testing::_;
37using testing::AnyNumber;
38using testing::AtLeast;
39using testing::InSequence;
40using testing::Invoke;
41using testing::InvokeWithoutArgs;
42using testing::Return;
43using testing::StrictMock;
44
45namespace quic {
46namespace test {
47namespace {
48
49const char kData1[] = "FooAndBar";
50const char kData2[] = "EepAndBaz";
51const size_t kDataLen = 9;
52
53class TestStream : public QuicStream {
54 public:
55 TestStream(QuicStreamId id, QuicSession* session, StreamType type)
renjietangb38e6352019-10-24 09:38:20 -070056 : QuicStream(id, session, /*is_static=*/false, type) {
57 sequencer()->set_level_triggered(true);
58 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050059
renjietangbaea59c2019-05-29 15:08:14 -070060 TestStream(PendingStream* pending, StreamType type, bool is_static)
61 : QuicStream(pending, type, is_static) {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050062
renjietangb38e6352019-10-24 09:38:20 -070063 MOCK_METHOD0(OnDataAvailable, void());
QUICHE teama6ef0a62019-03-07 20:34:33 -050064
65 MOCK_METHOD0(OnCanWriteNewData, void());
66
67 using QuicStream::CanWriteNewData;
68 using QuicStream::CanWriteNewDataAfterData;
69 using QuicStream::CloseWriteSide;
70 using QuicStream::fin_buffered;
71 using QuicStream::OnClose;
72 using QuicStream::WriteMemSlices;
73 using QuicStream::WriteOrBufferData;
QUICHE teama6ef0a62019-03-07 20:34:33 -050074
75 private:
vasilvvc48c8712019-03-11 13:38:16 -070076 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -050077};
78
renjietang9bf25642019-10-10 10:21:15 -070079class QuicStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
QUICHE teama6ef0a62019-03-07 20:34:33 -050080 public:
renjietang9bf25642019-10-10 10:21:15 -070081 QuicStreamTest()
renjietang39979d32019-09-13 10:02:13 -070082 : zero_(QuicTime::Delta::Zero()),
QUICHE teama6ef0a62019-03-07 20:34:33 -050083 supported_versions_(AllSupportedVersions()) {}
84
85 void Initialize() {
86 ParsedQuicVersionVector version_vector;
87 version_vector.push_back(GetParam());
88 connection_ = new StrictMock<MockQuicConnection>(
89 &helper_, &alarm_factory_, Perspective::IS_SERVER, version_vector);
90 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
vasilvv0fc587f2019-09-06 13:33:08 -070091 session_ = std::make_unique<StrictMock<MockQuicSession>>(connection_);
renjietang39979d32019-09-13 10:02:13 -070092 session_->Initialize();
QUICHE teama6ef0a62019-03-07 20:34:33 -050093
renjietang39979d32019-09-13 10:02:13 -070094 QuicConfigPeer::SetReceivedInitialSessionFlowControlWindow(
95 session_->config(), kMinimumFlowControlSendWindow);
dschinazi18cdf132019-10-09 16:08:18 -070096 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesUnidirectional(
97 session_->config(), kMinimumFlowControlSendWindow);
98 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesIncomingBidirectional(
99 session_->config(), kMinimumFlowControlSendWindow);
100 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesOutgoingBidirectional(
101 session_->config(), kMinimumFlowControlSendWindow);
renjietang39979d32019-09-13 10:02:13 -0700102 QuicConfigPeer::SetReceivedMaxIncomingUnidirectionalStreams(
103 session_->config(), 10);
104 session_->OnConfigNegotiated();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105
renjietangb38e6352019-10-24 09:38:20 -0700106 stream_ = new StrictMock<TestStream>(kTestStreamId, session_.get(),
107 BIDIRECTIONAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500108 EXPECT_NE(nullptr, stream_);
109 // session_ now owns stream_.
110 session_->ActivateStream(QuicWrapUnique(stream_));
111 // Ignore resetting when session_ is terminated.
112 EXPECT_CALL(*session_, SendRstStream(kTestStreamId, _, _))
113 .Times(AnyNumber());
114 write_blocked_list_ =
115 QuicSessionPeer::GetWriteBlockedStreams(session_.get());
116 }
117
bncc7d9e0c2019-04-16 10:22:15 -0700118 bool fin_sent() { return stream_->fin_sent(); }
119 bool rst_sent() { return stream_->rst_sent(); }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500120
QUICHE teama6ef0a62019-03-07 20:34:33 -0500121 bool HasWriteBlockedStreams() {
122 return write_blocked_list_->HasWriteBlockedSpecialStream() ||
123 write_blocked_list_->HasWriteBlockedDataStreams();
124 }
125
126 QuicConsumedData CloseStreamOnWriteError(QuicStream* /*stream*/,
127 QuicStreamId id,
128 size_t /*write_length*/,
129 QuicStreamOffset /*offset*/,
130 StreamSendingState /*state*/) {
131 session_->CloseStream(id);
132 return QuicConsumedData(1, false);
133 }
134
QUICHE teama6ef0a62019-03-07 20:34:33 -0500135 bool ClearResetStreamFrame(const QuicFrame& frame) {
136 EXPECT_EQ(RST_STREAM_FRAME, frame.type);
137 DeleteFrame(&const_cast<QuicFrame&>(frame));
138 return true;
139 }
140
141 bool ClearStopSendingFrame(const QuicFrame& frame) {
142 EXPECT_EQ(STOP_SENDING_FRAME, frame.type);
143 DeleteFrame(&const_cast<QuicFrame&>(frame));
144 return true;
145 }
146
147 protected:
148 MockQuicConnectionHelper helper_;
149 MockAlarmFactory alarm_factory_;
150 MockQuicConnection* connection_;
151 std::unique_ptr<MockQuicSession> session_;
renjietangb38e6352019-10-24 09:38:20 -0700152 StrictMock<TestStream>* stream_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500153 QuicWriteBlockedList* write_blocked_list_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500154 QuicTime::Delta zero_;
155 ParsedQuicVersionVector supported_versions_;
renjietang940a5322019-08-02 16:17:51 -0700156 QuicStreamId kTestStreamId =
157 GetNthClientInitiatedBidirectionalStreamId(GetParam().transport_version,
158 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500159};
160
renjietang9bf25642019-10-10 10:21:15 -0700161INSTANTIATE_TEST_SUITE_P(QuicStreamTests,
162 QuicStreamTest,
dschinazi142051a2019-09-18 18:17:29 -0700163 ::testing::ValuesIn(AllSupportedVersions()),
164 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500165
renjietang35448992019-05-08 17:08:57 -0700166TEST_P(QuicStreamTest, PendingStreamStaticness) {
167 Initialize();
168
169 PendingStream pending(kTestStreamId + 2, session_.get());
renjietangbaea59c2019-05-29 15:08:14 -0700170 TestStream stream(&pending, StreamType::BIDIRECTIONAL, false);
renjietang35448992019-05-08 17:08:57 -0700171 EXPECT_FALSE(stream.is_static());
172
173 PendingStream pending2(kTestStreamId + 3, session_.get());
renjietangbaea59c2019-05-29 15:08:14 -0700174 TestStream stream2(&pending2, StreamType::BIDIRECTIONAL, true);
renjietang35448992019-05-08 17:08:57 -0700175 EXPECT_TRUE(stream2.is_static());
176}
177
QUICHE teama6ef0a62019-03-07 20:34:33 -0500178TEST_P(QuicStreamTest, PendingStreamTooMuchData) {
179 Initialize();
180
181 PendingStream pending(kTestStreamId + 2, session_.get());
182 // Receive a stream frame that violates flow control: the byte offset is
183 // higher than the receive window offset.
184 QuicStreamFrame frame(kTestStreamId + 2, false,
renjietangb38e6352019-10-24 09:38:20 -0700185 kInitialSessionFlowControlWindowForTest + 1, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500186
187 // Stream should not accept the frame, and the connection should be closed.
188 EXPECT_CALL(*connection_,
189 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
190 pending.OnStreamFrame(frame);
191}
192
193TEST_P(QuicStreamTest, PendingStreamTooMuchDataInRstStream) {
194 Initialize();
195
196 PendingStream pending(kTestStreamId + 2, session_.get());
197 // Receive a rst stream frame that violates flow control: the byte offset is
198 // higher than the receive window offset.
199 QuicRstStreamFrame frame(kInvalidControlFrameId, kTestStreamId + 2,
200 QUIC_STREAM_CANCELLED,
201 kInitialSessionFlowControlWindowForTest + 1);
202
203 // Pending stream should not accept the frame, and the connection should be
204 // closed.
205 EXPECT_CALL(*connection_,
206 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
207 pending.OnRstStreamFrame(frame);
208}
209
210TEST_P(QuicStreamTest, PendingStreamRstStream) {
211 Initialize();
212
213 PendingStream pending(kTestStreamId + 2, session_.get());
214 QuicStreamOffset final_byte_offset = 7;
215 QuicRstStreamFrame frame(kInvalidControlFrameId, kTestStreamId + 2,
216 QUIC_STREAM_CANCELLED, final_byte_offset);
217
218 // Pending stream should accept the frame and not close the connection.
219 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
220 pending.OnRstStreamFrame(frame);
221}
222
223TEST_P(QuicStreamTest, FromPendingStream) {
224 Initialize();
225
226 PendingStream pending(kTestStreamId + 2, session_.get());
227
renjietangb38e6352019-10-24 09:38:20 -0700228 QuicStreamFrame frame(kTestStreamId + 2, false, 2, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229 pending.OnStreamFrame(frame);
230 pending.OnStreamFrame(frame);
renjietangb38e6352019-10-24 09:38:20 -0700231 QuicStreamFrame frame2(kTestStreamId + 2, true, 3, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500232 pending.OnStreamFrame(frame2);
233
renjietangbaea59c2019-05-29 15:08:14 -0700234 TestStream stream(&pending, StreamType::READ_UNIDIRECTIONAL, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500235 EXPECT_EQ(3, stream.num_frames_received());
236 EXPECT_EQ(3u, stream.stream_bytes_read());
237 EXPECT_EQ(1, stream.num_duplicate_frames_received());
238 EXPECT_EQ(true, stream.fin_received());
239 EXPECT_EQ(frame2.offset + 1,
240 stream.flow_controller()->highest_received_byte_offset());
241 EXPECT_EQ(frame2.offset + 1,
242 session_->flow_controller()->highest_received_byte_offset());
243}
244
245TEST_P(QuicStreamTest, FromPendingStreamThenData) {
246 Initialize();
247
248 PendingStream pending(kTestStreamId + 2, session_.get());
249
renjietangb38e6352019-10-24 09:38:20 -0700250 QuicStreamFrame frame(kTestStreamId + 2, false, 2, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500251 pending.OnStreamFrame(frame);
252
renjietangbaea59c2019-05-29 15:08:14 -0700253 auto stream =
254 new TestStream(&pending, StreamType::READ_UNIDIRECTIONAL, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500255 session_->ActivateStream(QuicWrapUnique(stream));
256
renjietangb38e6352019-10-24 09:38:20 -0700257 QuicStreamFrame frame2(kTestStreamId + 2, true, 3, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500258 stream->OnStreamFrame(frame2);
259
260 EXPECT_EQ(2, stream->num_frames_received());
261 EXPECT_EQ(2u, stream->stream_bytes_read());
262 EXPECT_EQ(true, stream->fin_received());
263 EXPECT_EQ(frame2.offset + 1,
264 stream->flow_controller()->highest_received_byte_offset());
265 EXPECT_EQ(frame2.offset + 1,
266 session_->flow_controller()->highest_received_byte_offset());
267}
268
269TEST_P(QuicStreamTest, WriteAllData) {
270 Initialize();
271
272 size_t length =
273 1 + QuicPacketCreator::StreamFramePacketOverhead(
274 connection_->transport_version(), PACKET_8BYTE_CONNECTION_ID,
275 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
276 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
277 VARIABLE_LENGTH_INTEGER_LENGTH_0,
278 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0u);
279 connection_->SetMaxPacketLength(length);
280
281 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
282 .WillOnce(Invoke(&(MockQuicSession::ConsumeData)));
283 stream_->WriteOrBufferData(kData1, false, nullptr);
284 EXPECT_FALSE(HasWriteBlockedStreams());
285}
286
287TEST_P(QuicStreamTest, NoBlockingIfNoDataOrFin) {
288 Initialize();
289
290 // Write no data and no fin. If we consume nothing we should not be write
291 // blocked.
dmcardlecf0bfcf2019-12-13 08:08:21 -0800292 EXPECT_QUIC_BUG(
293 stream_->WriteOrBufferData(quiche::QuicheStringPiece(), false, nullptr),
294 "");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500295 EXPECT_FALSE(HasWriteBlockedStreams());
296}
297
298TEST_P(QuicStreamTest, BlockIfOnlySomeDataConsumed) {
299 Initialize();
300
301 // Write some data and no fin. If we consume some but not all of the data,
302 // we should be write blocked a not all the data was consumed.
303 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
304 .WillOnce(InvokeWithoutArgs([this]() {
305 return MockQuicSession::ConsumeData(stream_, stream_->id(), 1u, 0u,
306 NO_FIN);
307 }));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800308 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 2), false,
309 nullptr);
fayang8265a2a2019-10-16 11:23:51 -0700310 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500311 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
312 EXPECT_EQ(1u, stream_->BufferedDataBytes());
313}
314
315TEST_P(QuicStreamTest, BlockIfFinNotConsumedWithData) {
316 Initialize();
317
318 // Write some data and no fin. If we consume all the data but not the fin,
319 // we should be write blocked because the fin was not consumed.
320 // (This should never actually happen as the fin should be sent out with the
321 // last data)
322 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
323 .WillOnce(InvokeWithoutArgs([this]() {
324 return MockQuicSession::ConsumeData(stream_, stream_->id(), 2u, 0u,
325 NO_FIN);
326 }));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800327 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 2), true,
328 nullptr);
fayang8265a2a2019-10-16 11:23:51 -0700329 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500330 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
331}
332
333TEST_P(QuicStreamTest, BlockIfSoloFinNotConsumed) {
334 Initialize();
335
336 // Write no data and a fin. If we consume nothing we should be write blocked,
337 // as the fin was not consumed.
338 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
339 .WillOnce(Return(QuicConsumedData(0, false)));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800340 stream_->WriteOrBufferData(quiche::QuicheStringPiece(), true, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500341 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
342}
343
344TEST_P(QuicStreamTest, CloseOnPartialWrite) {
345 Initialize();
346
347 // Write some data and no fin. However, while writing the data
348 // close the stream and verify that MarkConnectionLevelWriteBlocked does not
349 // crash with an unknown stream.
350 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
351 .WillOnce(Invoke(this, &QuicStreamTest::CloseStreamOnWriteError));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800352 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 2), false,
353 nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500354 ASSERT_EQ(0u, write_blocked_list_->NumBlockedStreams());
355}
356
357TEST_P(QuicStreamTest, WriteOrBufferData) {
358 Initialize();
359
360 EXPECT_FALSE(HasWriteBlockedStreams());
361 size_t length =
362 1 + QuicPacketCreator::StreamFramePacketOverhead(
363 connection_->transport_version(), PACKET_8BYTE_CONNECTION_ID,
364 PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
365 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
366 VARIABLE_LENGTH_INTEGER_LENGTH_0,
367 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0u);
368 connection_->SetMaxPacketLength(length);
369
370 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
371 .WillOnce(InvokeWithoutArgs([this]() {
372 return MockQuicSession::ConsumeData(stream_, stream_->id(),
373 kDataLen - 1, 0u, NO_FIN);
374 }));
375 stream_->WriteOrBufferData(kData1, false, nullptr);
zhongyi1b2f7832019-06-14 13:31:34 -0700376
fayang8265a2a2019-10-16 11:23:51 -0700377 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500378 EXPECT_EQ(1u, stream_->BufferedDataBytes());
379 EXPECT_TRUE(HasWriteBlockedStreams());
380
381 // Queue a bytes_consumed write.
382 stream_->WriteOrBufferData(kData2, false, nullptr);
383 EXPECT_EQ(10u, stream_->BufferedDataBytes());
384 // Make sure we get the tail of the first write followed by the bytes_consumed
385 InSequence s;
386 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
387 .WillOnce(InvokeWithoutArgs([this]() {
388 return MockQuicSession::ConsumeData(stream_, stream_->id(),
389 kDataLen - 1, kDataLen - 1, NO_FIN);
390 }));
renjietangb38e6352019-10-24 09:38:20 -0700391 EXPECT_CALL(*stream_, OnCanWriteNewData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500392 stream_->OnCanWrite();
fayang8265a2a2019-10-16 11:23:51 -0700393 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500394
395 // And finally the end of the bytes_consumed.
396 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
397 .WillOnce(InvokeWithoutArgs([this]() {
398 return MockQuicSession::ConsumeData(stream_, stream_->id(), 2u,
399 2 * kDataLen - 2, NO_FIN);
400 }));
renjietangb38e6352019-10-24 09:38:20 -0700401 EXPECT_CALL(*stream_, OnCanWriteNewData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 stream_->OnCanWrite();
fayang8265a2a2019-10-16 11:23:51 -0700403 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500404}
405
406TEST_P(QuicStreamTest, WriteOrBufferDataReachStreamLimit) {
407 Initialize();
vasilvvc48c8712019-03-11 13:38:16 -0700408 std::string data("aaaaa");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500409 QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - data.length(),
410 stream_);
411 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
412 .WillOnce(Invoke(&(MockQuicSession::ConsumeData)));
413 stream_->WriteOrBufferData(data, false, nullptr);
fayang8265a2a2019-10-16 11:23:51 -0700414 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500415 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
416 EXPECT_QUIC_BUG(stream_->WriteOrBufferData("a", false, nullptr),
417 "Write too many data via stream");
418}
419
420TEST_P(QuicStreamTest, ConnectionCloseAfterStreamClose) {
421 Initialize();
422
423 QuicStreamPeer::CloseReadSide(stream_);
424 stream_->CloseWriteSide();
bncf6f82b12019-10-30 07:01:01 -0700425 EXPECT_THAT(stream_->stream_error(), IsQuicStreamNoError());
426 EXPECT_THAT(stream_->connection_error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500427 stream_->OnConnectionClosed(QUIC_INTERNAL_ERROR,
428 ConnectionCloseSource::FROM_SELF);
bncf6f82b12019-10-30 07:01:01 -0700429 EXPECT_THAT(stream_->stream_error(), IsQuicStreamNoError());
430 EXPECT_THAT(stream_->connection_error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500431}
432
433TEST_P(QuicStreamTest, RstAlwaysSentIfNoFinSent) {
434 // For flow control accounting, a stream must send either a FIN or a RST frame
435 // before termination.
436 // Test that if no FIN has been sent, we send a RST.
437
438 Initialize();
439 EXPECT_FALSE(fin_sent());
440 EXPECT_FALSE(rst_sent());
441
442 // Write some data, with no FIN.
443 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
444 .WillOnce(InvokeWithoutArgs([this]() {
445 return MockQuicSession::ConsumeData(stream_, stream_->id(), 1u, 0u,
446 NO_FIN);
447 }));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800448 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 1), false,
449 nullptr);
fayang8265a2a2019-10-16 11:23:51 -0700450 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500451 EXPECT_FALSE(fin_sent());
452 EXPECT_FALSE(rst_sent());
453
454 // Now close the stream, and expect that we send a RST.
455 EXPECT_CALL(*session_, SendRstStream(_, _, _));
456 stream_->OnClose();
zhongyi9fa2be32019-09-10 12:39:01 -0700457 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500458 EXPECT_FALSE(fin_sent());
459 EXPECT_TRUE(rst_sent());
460}
461
462TEST_P(QuicStreamTest, RstNotSentIfFinSent) {
463 // For flow control accounting, a stream must send either a FIN or a RST frame
464 // before termination.
465 // Test that if a FIN has been sent, we don't also send a RST.
466
467 Initialize();
468 EXPECT_FALSE(fin_sent());
469 EXPECT_FALSE(rst_sent());
470
471 // Write some data, with FIN.
472 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
473 .WillOnce(InvokeWithoutArgs([this]() {
474 return MockQuicSession::ConsumeData(stream_, stream_->id(), 1u, 0u,
475 FIN);
476 }));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800477 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 1), true,
478 nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500479 EXPECT_TRUE(fin_sent());
480 EXPECT_FALSE(rst_sent());
481
482 // Now close the stream, and expect that we do not send a RST.
483 stream_->OnClose();
484 EXPECT_TRUE(fin_sent());
485 EXPECT_FALSE(rst_sent());
486}
487
488TEST_P(QuicStreamTest, OnlySendOneRst) {
489 // For flow control accounting, a stream must send either a FIN or a RST frame
490 // before termination.
491 // Test that if a stream sends a RST, it doesn't send an additional RST during
492 // OnClose() (this shouldn't be harmful, but we shouldn't do it anyway...)
493
494 Initialize();
495 EXPECT_FALSE(fin_sent());
496 EXPECT_FALSE(rst_sent());
497
498 // Reset the stream.
499 const int expected_resets = 1;
500 EXPECT_CALL(*session_, SendRstStream(_, _, _)).Times(expected_resets);
501 stream_->Reset(QUIC_STREAM_CANCELLED);
502 EXPECT_FALSE(fin_sent());
503 EXPECT_TRUE(rst_sent());
504
505 // Now close the stream (any further resets being sent would break the
506 // expectation above).
507 stream_->OnClose();
508 EXPECT_FALSE(fin_sent());
509 EXPECT_TRUE(rst_sent());
510}
511
512TEST_P(QuicStreamTest, StreamFlowControlMultipleWindowUpdates) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500513 Initialize();
514
515 // If we receive multiple WINDOW_UPDATES (potentially out of order), then we
516 // want to make sure we latch the largest offset we see.
517
518 // Initially should be default.
519 EXPECT_EQ(
renjietang39979d32019-09-13 10:02:13 -0700520 kMinimumFlowControlSendWindow,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500521 QuicFlowControllerPeer::SendWindowOffset(stream_->flow_controller()));
522
523 // Check a single WINDOW_UPDATE results in correct offset.
524 QuicWindowUpdateFrame window_update_1(kInvalidControlFrameId, stream_->id(),
renjietang39979d32019-09-13 10:02:13 -0700525 kMinimumFlowControlSendWindow + 5);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500526 stream_->OnWindowUpdateFrame(window_update_1);
renjietangd088eab2019-11-21 14:54:41 -0800527 EXPECT_EQ(window_update_1.max_data, QuicFlowControllerPeer::SendWindowOffset(
528 stream_->flow_controller()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500529
530 // Now send a few more WINDOW_UPDATES and make sure that only the largest is
531 // remembered.
532 QuicWindowUpdateFrame window_update_2(kInvalidControlFrameId, stream_->id(),
533 1);
534 QuicWindowUpdateFrame window_update_3(kInvalidControlFrameId, stream_->id(),
renjietang39979d32019-09-13 10:02:13 -0700535 kMinimumFlowControlSendWindow + 10);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500536 QuicWindowUpdateFrame window_update_4(kInvalidControlFrameId, stream_->id(),
537 5678);
538 stream_->OnWindowUpdateFrame(window_update_2);
539 stream_->OnWindowUpdateFrame(window_update_3);
540 stream_->OnWindowUpdateFrame(window_update_4);
renjietangd088eab2019-11-21 14:54:41 -0800541 EXPECT_EQ(window_update_3.max_data, QuicFlowControllerPeer::SendWindowOffset(
542 stream_->flow_controller()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500543}
544
545TEST_P(QuicStreamTest, FrameStats) {
546 Initialize();
547
548 EXPECT_EQ(0, stream_->num_frames_received());
549 EXPECT_EQ(0, stream_->num_duplicate_frames_received());
renjietangb38e6352019-10-24 09:38:20 -0700550 QuicStreamFrame frame(stream_->id(), false, 0, ".");
551 EXPECT_CALL(*stream_, OnDataAvailable()).Times(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500552 stream_->OnStreamFrame(frame);
553 EXPECT_EQ(1, stream_->num_frames_received());
554 EXPECT_EQ(0, stream_->num_duplicate_frames_received());
555 stream_->OnStreamFrame(frame);
556 EXPECT_EQ(2, stream_->num_frames_received());
557 EXPECT_EQ(1, stream_->num_duplicate_frames_received());
renjietangb38e6352019-10-24 09:38:20 -0700558 QuicStreamFrame frame2(stream_->id(), false, 1, "abc");
559 stream_->OnStreamFrame(frame2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500560}
561
562// Verify that when we receive a packet which violates flow control (i.e. sends
563// too much data on the stream) that the stream sequencer never sees this frame,
564// as we check for violation and close the connection early.
565TEST_P(QuicStreamTest, StreamSequencerNeverSeesPacketsViolatingFlowControl) {
566 Initialize();
567
568 // Receive a stream frame that violates flow control: the byte offset is
569 // higher than the receive window offset.
570 QuicStreamFrame frame(stream_->id(), false,
renjietangb38e6352019-10-24 09:38:20 -0700571 kInitialSessionFlowControlWindowForTest + 1, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500572 EXPECT_GT(frame.offset, QuicFlowControllerPeer::ReceiveWindowOffset(
573 stream_->flow_controller()));
574
575 // Stream should not accept the frame, and the connection should be closed.
576 EXPECT_CALL(*connection_,
577 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
578 stream_->OnStreamFrame(frame);
579}
580
581// Verify that after the consumer calls StopReading(), the stream still sends
582// flow control updates.
583TEST_P(QuicStreamTest, StopReadingSendsFlowControl) {
renjietangb38e6352019-10-24 09:38:20 -0700584 SetQuicReloadableFlag(quic_stop_reading_when_level_triggered, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500585 Initialize();
586
587 stream_->StopReading();
588
589 // Connection should not get terminated due to flow control errors.
590 EXPECT_CALL(*connection_,
591 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _))
592 .Times(0);
593 EXPECT_CALL(*connection_, SendControlFrame(_))
594 .Times(AtLeast(1))
bnc5b3c3be2019-06-25 10:37:09 -0700595 .WillRepeatedly(Invoke(&ClearControlFrame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500596
vasilvvc48c8712019-03-11 13:38:16 -0700597 std::string data(1000, 'x');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500598 for (QuicStreamOffset offset = 0;
599 offset < 2 * kInitialStreamFlowControlWindowForTest;
600 offset += data.length()) {
601 QuicStreamFrame frame(stream_->id(), false, offset, data);
602 stream_->OnStreamFrame(frame);
603 }
604 EXPECT_LT(
605 kInitialStreamFlowControlWindowForTest,
606 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller()));
607}
608
609TEST_P(QuicStreamTest, FinalByteOffsetFromFin) {
610 Initialize();
611
renjietang6c066562019-11-04 17:05:59 -0800612 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500613
renjietangb38e6352019-10-24 09:38:20 -0700614 QuicStreamFrame stream_frame_no_fin(stream_->id(), false, 1234, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500615 stream_->OnStreamFrame(stream_frame_no_fin);
renjietang6c066562019-11-04 17:05:59 -0800616 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500617
renjietangb38e6352019-10-24 09:38:20 -0700618 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500619 stream_->OnStreamFrame(stream_frame_with_fin);
renjietang6c066562019-11-04 17:05:59 -0800620 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500621}
622
623TEST_P(QuicStreamTest, FinalByteOffsetFromRst) {
624 Initialize();
625
renjietang6c066562019-11-04 17:05:59 -0800626 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500627 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
628 QUIC_STREAM_CANCELLED, 1234);
629 stream_->OnStreamReset(rst_frame);
renjietang6c066562019-11-04 17:05:59 -0800630 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500631}
632
633TEST_P(QuicStreamTest, InvalidFinalByteOffsetFromRst) {
634 Initialize();
635
renjietang6c066562019-11-04 17:05:59 -0800636 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500637 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
638 QUIC_STREAM_CANCELLED, 0xFFFFFFFFFFFF);
639 // Stream should not accept the frame, and the connection should be closed.
640 EXPECT_CALL(*connection_,
641 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
642 stream_->OnStreamReset(rst_frame);
renjietang6c066562019-11-04 17:05:59 -0800643 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500644 stream_->OnClose();
645}
646
647TEST_P(QuicStreamTest, FinalByteOffsetFromZeroLengthStreamFrame) {
648 // When receiving Trailers, an empty stream frame is created with the FIN set,
649 // and is passed to OnStreamFrame. The Trailers may be sent in advance of
650 // queued body bytes being sent, and thus the final byte offset may exceed
651 // current flow control limits. Flow control should only be concerned with
652 // data that has actually been sent/received, so verify that flow control
653 // ignores such a stream frame.
654 Initialize();
655
renjietang6c066562019-11-04 17:05:59 -0800656 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500657 const QuicStreamOffset kByteOffsetExceedingFlowControlWindow =
658 kInitialSessionFlowControlWindowForTest + 1;
659 const QuicStreamOffset current_stream_flow_control_offset =
660 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller());
661 const QuicStreamOffset current_connection_flow_control_offset =
662 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller());
663 ASSERT_GT(kByteOffsetExceedingFlowControlWindow,
664 current_stream_flow_control_offset);
665 ASSERT_GT(kByteOffsetExceedingFlowControlWindow,
666 current_connection_flow_control_offset);
667 QuicStreamFrame zero_length_stream_frame_with_fin(
668 stream_->id(), /*fin=*/true, kByteOffsetExceedingFlowControlWindow,
dmcardlecf0bfcf2019-12-13 08:08:21 -0800669 quiche::QuicheStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500670 EXPECT_EQ(0, zero_length_stream_frame_with_fin.data_length);
671
672 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
673 stream_->OnStreamFrame(zero_length_stream_frame_with_fin);
renjietang6c066562019-11-04 17:05:59 -0800674 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500675
676 // The flow control receive offset values should not have changed.
677 EXPECT_EQ(
678 current_stream_flow_control_offset,
679 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller()));
680 EXPECT_EQ(
681 current_connection_flow_control_offset,
682 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller()));
683}
684
685TEST_P(QuicStreamTest, OnStreamResetOffsetOverflow) {
686 Initialize();
687 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
688 QUIC_STREAM_CANCELLED, kMaxStreamLength + 1);
689 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
690 stream_->OnStreamReset(rst_frame);
691}
692
693TEST_P(QuicStreamTest, OnStreamFrameUpperLimit) {
694 Initialize();
695
696 // Modify receive window offset and sequencer buffer total_bytes_read_ to
697 // avoid flow control violation.
698 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
699 kMaxStreamLength + 5u);
700 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(),
701 kMaxStreamLength + 5u);
702 QuicStreamSequencerPeer::SetFrameBufferTotalBytesRead(
703 QuicStreamPeer::sequencer(stream_), kMaxStreamLength - 10u);
704
705 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _))
706 .Times(0);
renjietangb38e6352019-10-24 09:38:20 -0700707 QuicStreamFrame stream_frame(stream_->id(), false, kMaxStreamLength - 1, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500708 stream_->OnStreamFrame(stream_frame);
renjietangb38e6352019-10-24 09:38:20 -0700709 QuicStreamFrame stream_frame2(stream_->id(), true, kMaxStreamLength, "");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500710 stream_->OnStreamFrame(stream_frame2);
711}
712
713TEST_P(QuicStreamTest, StreamTooLong) {
714 Initialize();
715 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _))
716 .Times(1);
renjietangb38e6352019-10-24 09:38:20 -0700717 QuicStreamFrame stream_frame(stream_->id(), false, kMaxStreamLength, ".");
dmcardlecf0bfcf2019-12-13 08:08:21 -0800718 EXPECT_QUIC_PEER_BUG(
719 stream_->OnStreamFrame(stream_frame),
720 quiche::QuicheStrCat("Receive stream frame on stream ", stream_->id(),
721 " reaches max stream length"));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500722}
723
renjietang9bf25642019-10-10 10:21:15 -0700724TEST_P(QuicStreamTest, SetDrainingIncomingOutgoing) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500725 // Don't have incoming data consumed.
726 Initialize();
727
728 // Incoming data with FIN.
renjietangb38e6352019-10-24 09:38:20 -0700729 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500730 stream_->OnStreamFrame(stream_frame_with_fin);
731 // The FIN has been received but not consumed.
renjietang6c066562019-11-04 17:05:59 -0800732 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500733 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
734 EXPECT_FALSE(stream_->reading_stopped());
735
736 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
737
738 // Outgoing data with FIN.
739 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
740 .WillOnce(InvokeWithoutArgs([this]() {
741 return MockQuicSession::ConsumeData(stream_, stream_->id(), 2u, 0u,
742 FIN);
743 }));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800744 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 2), true,
745 nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500746 EXPECT_TRUE(stream_->write_side_closed());
747
748 EXPECT_EQ(1u, QuicSessionPeer::GetDrainingStreams(session_.get())
749 ->count(kTestStreamId));
750 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
751}
752
renjietang9bf25642019-10-10 10:21:15 -0700753TEST_P(QuicStreamTest, SetDrainingOutgoingIncoming) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500754 // Don't have incoming data consumed.
755 Initialize();
756
757 // Outgoing data with FIN.
758 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
759 .WillOnce(InvokeWithoutArgs([this]() {
760 return MockQuicSession::ConsumeData(stream_, stream_->id(), 2u, 0u,
761 FIN);
762 }));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800763 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 2), true,
764 nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500765 EXPECT_TRUE(stream_->write_side_closed());
766
767 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
768
769 // Incoming data with FIN.
renjietangb38e6352019-10-24 09:38:20 -0700770 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500771 stream_->OnStreamFrame(stream_frame_with_fin);
772 // The FIN has been received but not consumed.
renjietang6c066562019-11-04 17:05:59 -0800773 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500774 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
775 EXPECT_FALSE(stream_->reading_stopped());
776
777 EXPECT_EQ(1u, QuicSessionPeer::GetDrainingStreams(session_.get())
778 ->count(kTestStreamId));
779 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
780}
781
782TEST_P(QuicStreamTest, EarlyResponseFinHandling) {
783 // Verify that if the server completes the response before reading the end of
784 // the request, the received FIN is recorded.
785
786 Initialize();
787 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
788 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
789 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
790
791 // Receive data for the request.
renjietangb38e6352019-10-24 09:38:20 -0700792 EXPECT_CALL(*stream_, OnDataAvailable()).Times(1);
793 QuicStreamFrame frame1(stream_->id(), false, 0, "Start");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500794 stream_->OnStreamFrame(frame1);
795 // When QuicSimpleServerStream sends the response, it calls
796 // QuicStream::CloseReadSide() first.
797 QuicStreamPeer::CloseReadSide(stream_);
798 // Send data and FIN for the response.
799 stream_->WriteOrBufferData(kData1, false, nullptr);
800 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
801 // Receive remaining data and FIN for the request.
renjietangb38e6352019-10-24 09:38:20 -0700802 QuicStreamFrame frame2(stream_->id(), true, 0, "End");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500803 stream_->OnStreamFrame(frame2);
804 EXPECT_TRUE(stream_->fin_received());
renjietang6c066562019-11-04 17:05:59 -0800805 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500806}
807
808TEST_P(QuicStreamTest, StreamWaitsForAcks) {
809 Initialize();
810 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
811 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
812 // Stream is not waiting for acks initially.
813 EXPECT_FALSE(stream_->IsWaitingForAcks());
814 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
zhongyi9fa2be32019-09-10 12:39:01 -0700815 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500816
817 // Send kData1.
818 stream_->WriteOrBufferData(kData1, false, nullptr);
fayang8265a2a2019-10-16 11:23:51 -0700819 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500820 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
821 EXPECT_TRUE(stream_->IsWaitingForAcks());
822 QuicByteCount newly_acked_length = 0;
823 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
824 &newly_acked_length));
825 EXPECT_EQ(9u, newly_acked_length);
826 // Stream is not waiting for acks as all sent data is acked.
827 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700828 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500829 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
830
831 // Send kData2.
832 stream_->WriteOrBufferData(kData2, false, nullptr);
833 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700834 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500835 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
836 // Send FIN.
837 stream_->WriteOrBufferData("", true, nullptr);
838 // Fin only frame is not stored in send buffer.
839 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
840
841 // kData2 is retransmitted.
842 stream_->OnStreamFrameRetransmitted(9, 9, false);
843
844 // kData2 is acked.
845 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
846 &newly_acked_length));
847 EXPECT_EQ(9u, newly_acked_length);
848 // Stream is waiting for acks as FIN is not acked.
849 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700850 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500851 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
852
853 // FIN is acked.
854 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 0, true, QuicTime::Delta::Zero(),
855 &newly_acked_length));
856 EXPECT_EQ(0u, newly_acked_length);
857 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700858 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500859 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
860}
861
862TEST_P(QuicStreamTest, StreamDataGetAckedOutOfOrder) {
863 Initialize();
864 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
865 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
866 // Send data.
867 stream_->WriteOrBufferData(kData1, false, nullptr);
868 stream_->WriteOrBufferData(kData1, false, nullptr);
869 stream_->WriteOrBufferData(kData1, false, nullptr);
870 stream_->WriteOrBufferData("", true, nullptr);
871 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
872 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700873 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500874 QuicByteCount newly_acked_length = 0;
875 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
876 &newly_acked_length));
fayang8265a2a2019-10-16 11:23:51 -0700877 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500878 EXPECT_EQ(9u, newly_acked_length);
879 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
880 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 9, false, QuicTime::Delta::Zero(),
881 &newly_acked_length));
fayang8265a2a2019-10-16 11:23:51 -0700882 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500883 EXPECT_EQ(9u, newly_acked_length);
884 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
885 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
886 &newly_acked_length));
fayang8265a2a2019-10-16 11:23:51 -0700887 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500888 EXPECT_EQ(9u, newly_acked_length);
889 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
890 // FIN is not acked yet.
891 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700892 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500893 EXPECT_TRUE(stream_->OnStreamFrameAcked(27, 0, true, QuicTime::Delta::Zero(),
894 &newly_acked_length));
895 EXPECT_EQ(0u, newly_acked_length);
896 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700897 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500898}
899
900TEST_P(QuicStreamTest, CancelStream) {
901 Initialize();
902 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
903 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
904 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700905 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500906 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
907
908 stream_->WriteOrBufferData(kData1, false, nullptr);
909 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700910 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500911 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
912 // Cancel stream.
913 stream_->Reset(QUIC_STREAM_NO_ERROR);
914 // stream still waits for acks as the error code is QUIC_STREAM_NO_ERROR, and
915 // data is going to be retransmitted.
916 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700917 EXPECT_TRUE(session_->HasUnackedStreamData());
zhongyi1b2f7832019-06-14 13:31:34 -0700918 EXPECT_CALL(*connection_,
919 OnStreamReset(stream_->id(), QUIC_STREAM_CANCELLED));
renjietangeab92852019-10-25 12:16:14 -0700920 EXPECT_CALL(*connection_, SendControlFrame(_))
921 .Times(AtLeast(1))
922 .WillRepeatedly(Invoke(&ClearControlFrame));
zhongyi1b2f7832019-06-14 13:31:34 -0700923 EXPECT_CALL(*session_, SendRstStream(stream_->id(), QUIC_STREAM_CANCELLED, 9))
924 .WillOnce(InvokeWithoutArgs([this]() {
renjietang61cc2452019-11-26 10:57:10 -0800925 session_->ReallySendRstStream(stream_->id(), QUIC_STREAM_CANCELLED,
926 stream_->stream_bytes_written());
zhongyi1b2f7832019-06-14 13:31:34 -0700927 }));
928
QUICHE teama6ef0a62019-03-07 20:34:33 -0500929 stream_->Reset(QUIC_STREAM_CANCELLED);
930 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
931 // Stream stops waiting for acks as data is not going to be retransmitted.
932 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700933 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500934}
935
936TEST_P(QuicStreamTest, RstFrameReceivedStreamNotFinishSending) {
renjietang9bf25642019-10-10 10:21:15 -0700937 if (VersionHasIetfQuicFrames(GetParam().transport_version)) {
938 // In IETF QUIC, receiving a RESET_STREAM will only close the read side. The
939 // stream itself is not closed and will not send reset.
940 return;
941 }
942
QUICHE teama6ef0a62019-03-07 20:34:33 -0500943 Initialize();
944 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
945 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
946 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700947 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500948 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
949
950 stream_->WriteOrBufferData(kData1, false, nullptr);
951 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700952 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500953 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
954
955 // RST_STREAM received.
956 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
957 QUIC_STREAM_CANCELLED, 9);
958 EXPECT_CALL(*session_,
959 SendRstStream(stream_->id(), QUIC_RST_ACKNOWLEDGEMENT, 9));
960 stream_->OnStreamReset(rst_frame);
961 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
962 // Stream stops waiting for acks as it does not finish sending and rst is
963 // sent.
964 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700965 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500966}
967
968TEST_P(QuicStreamTest, RstFrameReceivedStreamFinishSending) {
969 Initialize();
970 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
971 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
972 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700973 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500974 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
975
976 stream_->WriteOrBufferData(kData1, true, nullptr);
977 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700978 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500979
980 // RST_STREAM received.
981 EXPECT_CALL(*session_, SendRstStream(_, _, _)).Times(0);
982 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
983 QUIC_STREAM_CANCELLED, 1234);
984 stream_->OnStreamReset(rst_frame);
985 // Stream still waits for acks as it finishes sending and has unacked data.
986 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700987 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500988 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
989}
990
991TEST_P(QuicStreamTest, ConnectionClosed) {
992 Initialize();
993 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
994 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
995 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700996 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500997 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
998
999 stream_->WriteOrBufferData(kData1, false, nullptr);
1000 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -07001001 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001002 EXPECT_CALL(*session_,
1003 SendRstStream(stream_->id(), QUIC_RST_ACKNOWLEDGEMENT, 9));
1004 stream_->OnConnectionClosed(QUIC_INTERNAL_ERROR,
1005 ConnectionCloseSource::FROM_SELF);
1006 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1007 // Stream stops waiting for acks as connection is going to close.
1008 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -07001009 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001010}
1011
1012TEST_P(QuicStreamTest, CanWriteNewDataAfterData) {
wub49855982019-05-01 14:16:26 -07001013 SetQuicFlag(FLAGS_quic_buffered_data_threshold, 100);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001014 Initialize();
1015 EXPECT_TRUE(stream_->CanWriteNewDataAfterData(99));
1016 EXPECT_FALSE(stream_->CanWriteNewDataAfterData(100));
1017}
1018
1019TEST_P(QuicStreamTest, WriteBufferedData) {
1020 // Set buffered data low water mark to be 100.
wub49855982019-05-01 14:16:26 -07001021 SetQuicFlag(FLAGS_quic_buffered_data_threshold, 100);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001022
1023 Initialize();
vasilvvc48c8712019-03-11 13:38:16 -07001024 std::string data(1024, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001025 EXPECT_TRUE(stream_->CanWriteNewData());
1026
1027 // Testing WriteOrBufferData.
1028 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1029 .WillOnce(InvokeWithoutArgs([this]() {
1030 return MockQuicSession::ConsumeData(stream_, stream_->id(), 100u, 0u,
1031 NO_FIN);
1032 }));
1033 stream_->WriteOrBufferData(data, false, nullptr);
1034 stream_->WriteOrBufferData(data, false, nullptr);
1035 stream_->WriteOrBufferData(data, false, nullptr);
zhongyi1b2f7832019-06-14 13:31:34 -07001036 EXPECT_TRUE(stream_->IsWaitingForAcks());
1037
QUICHE teama6ef0a62019-03-07 20:34:33 -05001038 // Verify all data is saved.
1039 EXPECT_EQ(3 * data.length() - 100, stream_->BufferedDataBytes());
1040
1041 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1042 .WillOnce(InvokeWithoutArgs([this]() {
1043 return MockQuicSession::ConsumeData(stream_, stream_->id(), 100, 100u,
1044 NO_FIN);
1045 }));
1046 // Buffered data size > threshold, do not ask upper layer for more data.
1047 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(0);
1048 stream_->OnCanWrite();
1049 EXPECT_EQ(3 * data.length() - 200, stream_->BufferedDataBytes());
1050 EXPECT_FALSE(stream_->CanWriteNewData());
1051
1052 // Send buffered data to make buffered data size < threshold.
1053 size_t data_to_write = 3 * data.length() - 200 -
1054 GetQuicFlag(FLAGS_quic_buffered_data_threshold) + 1;
1055 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1056 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1057 return MockQuicSession::ConsumeData(stream_, stream_->id(),
1058 data_to_write, 200u, NO_FIN);
1059 }));
1060 // Buffered data size < threshold, ask upper layer for more data.
1061 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1062 stream_->OnCanWrite();
dschinazi696ee602019-04-25 16:05:35 -07001063 EXPECT_EQ(static_cast<uint64_t>(
1064 GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001065 stream_->BufferedDataBytes());
1066 EXPECT_TRUE(stream_->CanWriteNewData());
1067
1068 // Flush all buffered data.
1069 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1070 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1071 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1072 stream_->OnCanWrite();
1073 EXPECT_EQ(0u, stream_->BufferedDataBytes());
1074 EXPECT_FALSE(stream_->HasBufferedData());
1075 EXPECT_TRUE(stream_->CanWriteNewData());
1076
1077 // Testing Writev.
1078 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1079 .WillOnce(Return(QuicConsumedData(0, false)));
1080 struct iovec iov = {const_cast<char*>(data.data()), data.length()};
1081 QuicMemSliceStorage storage(
1082 &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
1083 1024);
1084 QuicConsumedData consumed = stream_->WriteMemSlices(storage.ToSpan(), false);
1085
1086 // There is no buffered data before, all data should be consumed without
1087 // respecting buffered data upper limit.
1088 EXPECT_EQ(data.length(), consumed.bytes_consumed);
1089 EXPECT_FALSE(consumed.fin_consumed);
1090 EXPECT_EQ(data.length(), stream_->BufferedDataBytes());
1091 EXPECT_FALSE(stream_->CanWriteNewData());
1092
1093 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(0);
1094 QuicMemSliceStorage storage2(
1095 &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
1096 1024);
1097 consumed = stream_->WriteMemSlices(storage2.ToSpan(), false);
1098 // No Data can be consumed as buffered data is beyond upper limit.
1099 EXPECT_EQ(0u, consumed.bytes_consumed);
1100 EXPECT_FALSE(consumed.fin_consumed);
1101 EXPECT_EQ(data.length(), stream_->BufferedDataBytes());
1102
1103 data_to_write =
1104 data.length() - GetQuicFlag(FLAGS_quic_buffered_data_threshold) + 1;
1105 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1106 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1107 return MockQuicSession::ConsumeData(stream_, stream_->id(),
1108 data_to_write, 0u, NO_FIN);
1109 }));
1110
1111 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1112 stream_->OnCanWrite();
dschinazi696ee602019-04-25 16:05:35 -07001113 EXPECT_EQ(static_cast<uint64_t>(
1114 GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001115 stream_->BufferedDataBytes());
1116 EXPECT_TRUE(stream_->CanWriteNewData());
1117
1118 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(0);
1119 // All data can be consumed as buffered data is below upper limit.
1120 QuicMemSliceStorage storage3(
1121 &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
1122 1024);
1123 consumed = stream_->WriteMemSlices(storage3.ToSpan(), false);
1124 EXPECT_EQ(data.length(), consumed.bytes_consumed);
1125 EXPECT_FALSE(consumed.fin_consumed);
1126 EXPECT_EQ(data.length() + GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1,
1127 stream_->BufferedDataBytes());
1128 EXPECT_FALSE(stream_->CanWriteNewData());
1129}
1130
1131TEST_P(QuicStreamTest, WritevDataReachStreamLimit) {
1132 Initialize();
vasilvvc48c8712019-03-11 13:38:16 -07001133 std::string data("aaaaa");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001134 QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - data.length(),
1135 stream_);
1136 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1137 .WillOnce(Invoke(&(MockQuicSession::ConsumeData)));
1138 struct iovec iov = {const_cast<char*>(data.data()), 5u};
1139 QuicMemSliceStorage storage(
1140 &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
1141 1024);
1142 QuicConsumedData consumed = stream_->WriteMemSlices(storage.ToSpan(), false);
1143 EXPECT_EQ(data.length(), consumed.bytes_consumed);
1144 struct iovec iov2 = {const_cast<char*>(data.data()), 1u};
1145 QuicMemSliceStorage storage2(
1146 &iov2, 1,
1147 session_->connection()->helper()->GetStreamSendBufferAllocator(), 1024);
1148 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
1149 EXPECT_QUIC_BUG(stream_->WriteMemSlices(storage2.ToSpan(), false),
1150 "Write too many data via stream");
1151}
1152
1153TEST_P(QuicStreamTest, WriteMemSlices) {
1154 // Set buffered data low water mark to be 100.
wub49855982019-05-01 14:16:26 -07001155 SetQuicFlag(FLAGS_quic_buffered_data_threshold, 100);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001156
1157 Initialize();
1158 char data[1024];
1159 std::vector<std::pair<char*, size_t>> buffers;
1160 buffers.push_back(std::make_pair(data, QUIC_ARRAYSIZE(data)));
1161 buffers.push_back(std::make_pair(data, QUIC_ARRAYSIZE(data)));
1162 QuicTestMemSliceVector vector1(buffers);
1163 QuicTestMemSliceVector vector2(buffers);
1164 QuicMemSliceSpan span1 = vector1.span();
1165 QuicMemSliceSpan span2 = vector2.span();
1166
1167 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1168 .WillOnce(InvokeWithoutArgs([this]() {
1169 return MockQuicSession::ConsumeData(stream_, stream_->id(), 100u, 0u,
1170 NO_FIN);
1171 }));
1172 // There is no buffered data before, all data should be consumed.
1173 QuicConsumedData consumed = stream_->WriteMemSlices(span1, false);
1174 EXPECT_EQ(2048u, consumed.bytes_consumed);
1175 EXPECT_FALSE(consumed.fin_consumed);
1176 EXPECT_EQ(2 * QUIC_ARRAYSIZE(data) - 100, stream_->BufferedDataBytes());
1177 EXPECT_FALSE(stream_->fin_buffered());
1178
1179 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(0);
1180 // No Data can be consumed as buffered data is beyond upper limit.
1181 consumed = stream_->WriteMemSlices(span2, true);
1182 EXPECT_EQ(0u, consumed.bytes_consumed);
1183 EXPECT_FALSE(consumed.fin_consumed);
1184 EXPECT_EQ(2 * QUIC_ARRAYSIZE(data) - 100, stream_->BufferedDataBytes());
1185 EXPECT_FALSE(stream_->fin_buffered());
1186
1187 size_t data_to_write = 2 * QUIC_ARRAYSIZE(data) - 100 -
1188 GetQuicFlag(FLAGS_quic_buffered_data_threshold) + 1;
1189 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1190 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1191 return MockQuicSession::ConsumeData(stream_, stream_->id(),
1192 data_to_write, 100u, NO_FIN);
1193 }));
1194 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1195 stream_->OnCanWrite();
dschinazi696ee602019-04-25 16:05:35 -07001196 EXPECT_EQ(static_cast<uint64_t>(
1197 GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001198 stream_->BufferedDataBytes());
1199 // Try to write slices2 again.
1200 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(0);
1201 consumed = stream_->WriteMemSlices(span2, true);
1202 EXPECT_EQ(2048u, consumed.bytes_consumed);
1203 EXPECT_TRUE(consumed.fin_consumed);
1204 EXPECT_EQ(2 * QUIC_ARRAYSIZE(data) +
1205 GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1,
1206 stream_->BufferedDataBytes());
1207 EXPECT_TRUE(stream_->fin_buffered());
1208
1209 // Flush all buffered data.
1210 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1211 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1212 stream_->OnCanWrite();
1213 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(0);
1214 EXPECT_FALSE(stream_->HasBufferedData());
1215 EXPECT_TRUE(stream_->write_side_closed());
1216}
1217
1218TEST_P(QuicStreamTest, WriteMemSlicesReachStreamLimit) {
1219 Initialize();
1220 QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - 5u, stream_);
1221 char data[5];
1222 std::vector<std::pair<char*, size_t>> buffers;
1223 buffers.push_back(std::make_pair(data, QUIC_ARRAYSIZE(data)));
1224 QuicTestMemSliceVector vector1(buffers);
1225 QuicMemSliceSpan span1 = vector1.span();
1226 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1227 .WillOnce(InvokeWithoutArgs([this]() {
1228 return MockQuicSession::ConsumeData(stream_, stream_->id(), 5u, 0u,
1229 NO_FIN);
1230 }));
1231 // There is no buffered data before, all data should be consumed.
1232 QuicConsumedData consumed = stream_->WriteMemSlices(span1, false);
1233 EXPECT_EQ(5u, consumed.bytes_consumed);
1234
1235 std::vector<std::pair<char*, size_t>> buffers2;
1236 buffers2.push_back(std::make_pair(data, 1u));
1237 QuicTestMemSliceVector vector2(buffers);
1238 QuicMemSliceSpan span2 = vector2.span();
1239 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
1240 EXPECT_QUIC_BUG(stream_->WriteMemSlices(span2, false),
1241 "Write too many data via stream");
1242}
1243
1244TEST_P(QuicStreamTest, StreamDataGetAckedMultipleTimes) {
1245 Initialize();
1246 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1247 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
zhongyi1b2f7832019-06-14 13:31:34 -07001248 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -07001249 EXPECT_FALSE(session_->HasUnackedStreamData());
zhongyi1b2f7832019-06-14 13:31:34 -07001250
QUICHE teama6ef0a62019-03-07 20:34:33 -05001251 // Send [0, 27) and fin.
1252 stream_->WriteOrBufferData(kData1, false, nullptr);
1253 stream_->WriteOrBufferData(kData1, false, nullptr);
1254 stream_->WriteOrBufferData(kData1, true, nullptr);
1255 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
1256 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -07001257 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001258 // Ack [0, 9), [5, 22) and [18, 26)
1259 // Verify [0, 9) 9 bytes are acked.
1260 QuicByteCount newly_acked_length = 0;
1261 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
1262 &newly_acked_length));
1263 EXPECT_EQ(9u, newly_acked_length);
1264 EXPECT_EQ(2u, QuicStreamPeer::SendBuffer(stream_).size());
1265 // Verify [9, 22) 13 bytes are acked.
1266 EXPECT_TRUE(stream_->OnStreamFrameAcked(5, 17, false, QuicTime::Delta::Zero(),
1267 &newly_acked_length));
1268 EXPECT_EQ(13u, newly_acked_length);
1269 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1270 // Verify [22, 26) 4 bytes are acked.
1271 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 8, false, QuicTime::Delta::Zero(),
1272 &newly_acked_length));
1273 EXPECT_EQ(4u, newly_acked_length);
1274 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1275 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -07001276 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001277
1278 // Ack [0, 27). Verify [26, 27) 1 byte is acked.
1279 EXPECT_TRUE(stream_->OnStreamFrameAcked(26, 1, false, QuicTime::Delta::Zero(),
1280 &newly_acked_length));
1281 EXPECT_EQ(1u, newly_acked_length);
1282 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1283 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -07001284 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001285
1286 // Ack Fin.
1287 EXPECT_TRUE(stream_->OnStreamFrameAcked(27, 0, true, QuicTime::Delta::Zero(),
1288 &newly_acked_length));
1289 EXPECT_EQ(0u, newly_acked_length);
1290 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1291 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -07001292 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001293
1294 // Ack [10, 27) and fin. No new data is acked.
1295 EXPECT_FALSE(stream_->OnStreamFrameAcked(
1296 10, 17, true, QuicTime::Delta::Zero(), &newly_acked_length));
1297 EXPECT_EQ(0u, newly_acked_length);
1298 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1299 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -07001300 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001301}
1302
1303TEST_P(QuicStreamTest, OnStreamFrameLost) {
1304 Initialize();
1305
1306 // Send [0, 9).
1307 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1308 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1309 stream_->WriteOrBufferData(kData1, false, nullptr);
1310 EXPECT_FALSE(stream_->HasBufferedData());
1311 EXPECT_TRUE(stream_->IsStreamFrameOutstanding(0, 9, false));
1312
1313 // Try to send [9, 27), but connection is blocked.
1314 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1315 .WillOnce(Return(QuicConsumedData(0, false)));
1316 stream_->WriteOrBufferData(kData2, false, nullptr);
1317 stream_->WriteOrBufferData(kData2, false, nullptr);
1318 EXPECT_TRUE(stream_->HasBufferedData());
1319 EXPECT_FALSE(stream_->HasPendingRetransmission());
1320
1321 // Lost [0, 9). When stream gets a chance to write, only lost data is
1322 // transmitted.
1323 stream_->OnStreamFrameLost(0, 9, false);
1324 EXPECT_TRUE(stream_->HasPendingRetransmission());
1325 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1326 .WillOnce(Invoke(MockQuicSession::ConsumeData));
renjietangb38e6352019-10-24 09:38:20 -07001327 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001328 stream_->OnCanWrite();
1329 EXPECT_FALSE(stream_->HasPendingRetransmission());
1330 EXPECT_TRUE(stream_->HasBufferedData());
1331
1332 // This OnCanWrite causes [9, 27) to be sent.
1333 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1334 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1335 stream_->OnCanWrite();
1336 EXPECT_FALSE(stream_->HasBufferedData());
1337
1338 // Send a fin only frame.
1339 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1340 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1341 stream_->WriteOrBufferData("", true, nullptr);
1342
1343 // Lost [9, 27) and fin.
1344 stream_->OnStreamFrameLost(9, 18, false);
1345 stream_->OnStreamFrameLost(27, 0, true);
1346 EXPECT_TRUE(stream_->HasPendingRetransmission());
1347
1348 // Ack [9, 18).
1349 QuicByteCount newly_acked_length = 0;
1350 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
1351 &newly_acked_length));
1352 EXPECT_EQ(9u, newly_acked_length);
1353 EXPECT_FALSE(stream_->IsStreamFrameOutstanding(9, 3, false));
1354 EXPECT_TRUE(stream_->HasPendingRetransmission());
1355 // This OnCanWrite causes [18, 27) and fin to be retransmitted. Verify fin can
1356 // be bundled with data.
1357 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1358 .WillOnce(InvokeWithoutArgs([this]() {
1359 return MockQuicSession::ConsumeData(stream_, stream_->id(), 9u, 18u,
1360 FIN);
1361 }));
1362 stream_->OnCanWrite();
1363 EXPECT_FALSE(stream_->HasPendingRetransmission());
1364 // Lost [9, 18) again, but it is not considered as lost because kData2
1365 // has been acked.
1366 stream_->OnStreamFrameLost(9, 9, false);
1367 EXPECT_FALSE(stream_->HasPendingRetransmission());
1368 EXPECT_TRUE(stream_->IsStreamFrameOutstanding(27, 0, true));
1369}
1370
1371TEST_P(QuicStreamTest, CannotBundleLostFin) {
1372 Initialize();
1373
1374 // Send [0, 18) and fin.
1375 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1376 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
1377 stream_->WriteOrBufferData(kData1, false, nullptr);
1378 stream_->WriteOrBufferData(kData2, true, nullptr);
1379
1380 // Lost [0, 9) and fin.
1381 stream_->OnStreamFrameLost(0, 9, false);
1382 stream_->OnStreamFrameLost(18, 0, true);
1383
1384 // Retransmit lost data. Verify [0, 9) and fin are retransmitted in two
1385 // frames.
1386 InSequence s;
1387 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1388 .WillOnce(InvokeWithoutArgs([this]() {
1389 return MockQuicSession::ConsumeData(stream_, stream_->id(), 9u, 0u,
1390 NO_FIN);
1391 }));
1392 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1393 .WillOnce(Return(QuicConsumedData(0, true)));
1394 stream_->OnCanWrite();
1395}
1396
1397TEST_P(QuicStreamTest, MarkConnectionLevelWriteBlockedOnWindowUpdateFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001398 Initialize();
1399
renjietang39979d32019-09-13 10:02:13 -07001400 // Set the config to a small value so that a newly created stream has small
1401 // send flow control window.
1402 QuicConfigPeer::SetReceivedInitialStreamFlowControlWindow(session_->config(),
1403 100);
renjietang9bf25642019-10-10 10:21:15 -07001404 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesIncomingBidirectional(
1405 session_->config(), 100);
renjietang39979d32019-09-13 10:02:13 -07001406 auto stream = new TestStream(GetNthClientInitiatedBidirectionalStreamId(
1407 GetParam().transport_version, 2),
1408 session_.get(), BIDIRECTIONAL);
1409 session_->ActivateStream(QuicWrapUnique(stream));
1410
QUICHE teama6ef0a62019-03-07 20:34:33 -05001411 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1412 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
1413 EXPECT_CALL(*connection_, SendControlFrame(_))
bnc5b3c3be2019-06-25 10:37:09 -07001414 .WillOnce(Invoke(&ClearControlFrame));
vasilvvc48c8712019-03-11 13:38:16 -07001415 std::string data(1024, '.');
renjietang39979d32019-09-13 10:02:13 -07001416 stream->WriteOrBufferData(data, false, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001417 EXPECT_FALSE(HasWriteBlockedStreams());
1418
1419 QuicWindowUpdateFrame window_update(kInvalidControlFrameId, stream_->id(),
1420 1234);
1421
renjietang39979d32019-09-13 10:02:13 -07001422 stream->OnWindowUpdateFrame(window_update);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001423 // Verify stream is marked connection level write blocked.
1424 EXPECT_TRUE(HasWriteBlockedStreams());
renjietang39979d32019-09-13 10:02:13 -07001425 EXPECT_TRUE(stream->HasBufferedData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001426}
1427
1428// Regression test for b/73282665.
1429TEST_P(QuicStreamTest,
1430 MarkConnectionLevelWriteBlockedOnWindowUpdateFrameWithNoBufferedData) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001431 Initialize();
1432
renjietang39979d32019-09-13 10:02:13 -07001433 // Set the config to a small value so that a newly created stream has small
1434 // send flow control window.
1435 QuicConfigPeer::SetReceivedInitialStreamFlowControlWindow(session_->config(),
1436 100);
renjietang9bf25642019-10-10 10:21:15 -07001437 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesIncomingBidirectional(
1438 session_->config(), 100);
renjietang39979d32019-09-13 10:02:13 -07001439 auto stream = new TestStream(GetNthClientInitiatedBidirectionalStreamId(
1440 GetParam().transport_version, 2),
1441 session_.get(), BIDIRECTIONAL);
1442 session_->ActivateStream(QuicWrapUnique(stream));
1443
1444 std::string data(100, '.');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001445 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1446 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
1447 EXPECT_CALL(*connection_, SendControlFrame(_))
bnc5b3c3be2019-06-25 10:37:09 -07001448 .WillOnce(Invoke(&ClearControlFrame));
renjietang39979d32019-09-13 10:02:13 -07001449 stream->WriteOrBufferData(data, false, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001450 EXPECT_FALSE(HasWriteBlockedStreams());
1451
1452 QuicWindowUpdateFrame window_update(kInvalidControlFrameId, stream_->id(),
1453 120);
renjietang39979d32019-09-13 10:02:13 -07001454 stream->OnWindowUpdateFrame(window_update);
1455 EXPECT_FALSE(stream->HasBufferedData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001456 // Verify stream is marked as blocked although there is no buffered data.
1457 EXPECT_TRUE(HasWriteBlockedStreams());
1458}
1459
1460TEST_P(QuicStreamTest, RetransmitStreamData) {
1461 Initialize();
1462 InSequence s;
1463
1464 // Send [0, 18) with fin.
1465 EXPECT_CALL(*session_, WritevData(_, stream_->id(), _, _, _))
1466 .Times(2)
1467 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
1468 stream_->WriteOrBufferData(kData1, false, nullptr);
1469 stream_->WriteOrBufferData(kData1, true, nullptr);
1470 // Ack [10, 13).
1471 QuicByteCount newly_acked_length = 0;
1472 stream_->OnStreamFrameAcked(10, 3, false, QuicTime::Delta::Zero(),
1473 &newly_acked_length);
1474 EXPECT_EQ(3u, newly_acked_length);
1475 // Retransmit [0, 18) with fin, and only [0, 8) is consumed.
1476 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 10, 0, NO_FIN))
1477 .WillOnce(InvokeWithoutArgs([this]() {
1478 return MockQuicSession::ConsumeData(stream_, stream_->id(), 8, 0u,
1479 NO_FIN);
1480 }));
1481 EXPECT_FALSE(stream_->RetransmitStreamData(0, 18, true));
1482
1483 // Retransmit [0, 18) with fin, and all is consumed.
1484 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 10, 0, NO_FIN))
1485 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1486 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 5, 13, FIN))
1487 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1488 EXPECT_TRUE(stream_->RetransmitStreamData(0, 18, true));
1489
1490 // Retransmit [0, 8) with fin, and all is consumed.
1491 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 8, 0, NO_FIN))
1492 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1493 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 0, 18, FIN))
1494 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1495 EXPECT_TRUE(stream_->RetransmitStreamData(0, 8, true));
1496}
1497
1498TEST_P(QuicStreamTest, ResetStreamOnTtlExpiresRetransmitLostData) {
1499 Initialize();
1500
1501 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 200, 0, FIN))
1502 .WillOnce(Invoke(MockQuicSession::ConsumeData));
vasilvvc48c8712019-03-11 13:38:16 -07001503 std::string body(200, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001504 stream_->WriteOrBufferData(body, true, nullptr);
1505
1506 // Set TTL to be 1 s.
1507 QuicTime::Delta ttl = QuicTime::Delta::FromSeconds(1);
1508 ASSERT_TRUE(stream_->MaybeSetTtl(ttl));
1509 // Verify data gets retransmitted because TTL does not expire.
1510 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 100, 0, NO_FIN))
1511 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1512 EXPECT_TRUE(stream_->RetransmitStreamData(0, 100, false));
1513 stream_->OnStreamFrameLost(100, 100, true);
1514 EXPECT_TRUE(stream_->HasPendingRetransmission());
1515
1516 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
1517 // Verify stream gets reset because TTL expires.
1518 EXPECT_CALL(*session_, SendRstStream(_, QUIC_STREAM_TTL_EXPIRED, _)).Times(1);
1519 stream_->OnCanWrite();
1520}
1521
1522TEST_P(QuicStreamTest, ResetStreamOnTtlExpiresEarlyRetransmitData) {
1523 Initialize();
1524
1525 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 200, 0, FIN))
1526 .WillOnce(Invoke(MockQuicSession::ConsumeData));
vasilvvc48c8712019-03-11 13:38:16 -07001527 std::string body(200, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001528 stream_->WriteOrBufferData(body, true, nullptr);
1529
1530 // Set TTL to be 1 s.
1531 QuicTime::Delta ttl = QuicTime::Delta::FromSeconds(1);
1532 ASSERT_TRUE(stream_->MaybeSetTtl(ttl));
1533
1534 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
1535 // Verify stream gets reset because TTL expires.
1536 EXPECT_CALL(*session_, SendRstStream(_, QUIC_STREAM_TTL_EXPIRED, _)).Times(1);
1537 stream_->RetransmitStreamData(0, 100, false);
1538}
1539
1540// Test that QuicStream::StopSending A) is a no-op if the connection is not in
1541// version 99, B) that it properly invokes QuicSession::StopSending, and C) that
1542// the correct data is passed along, including getting the stream ID.
renjietang9bf25642019-10-10 10:21:15 -07001543TEST_P(QuicStreamTest, CheckStopSending) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001544 Initialize();
1545 const int kStopSendingCode = 123;
1546 // These must start as false.
bncc7d9e0c2019-04-16 10:22:15 -07001547 EXPECT_FALSE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001548 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
1549 // Expect to actually see a stop sending if and only if we are in version 99.
fkastenholz305e1732019-06-18 05:01:22 -07001550 if (VersionHasIetfQuicFrames(connection_->transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001551 EXPECT_CALL(*session_, SendStopSending(kStopSendingCode, stream_->id()))
1552 .Times(1);
1553 } else {
1554 EXPECT_CALL(*session_, SendStopSending(_, _)).Times(0);
1555 }
1556 stream_->SendStopSending(kStopSendingCode);
1557 // Sending a STOP_SENDING does not actually close the local stream.
1558 // Our implementation waits for the responding RESET_STREAM to effect the
1559 // closes. Therefore, read- and write-side closes should both be false.
bncc7d9e0c2019-04-16 10:22:15 -07001560 EXPECT_FALSE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001561 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
1562}
1563
1564// Test that OnStreamReset does one-way (read) closes if version 99, two way
1565// (read and write) if not version 99.
1566TEST_P(QuicStreamTest, OnStreamResetReadOrReadWrite) {
1567 Initialize();
bncc7d9e0c2019-04-16 10:22:15 -07001568 EXPECT_FALSE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001569 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
1570
1571 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
1572 QUIC_STREAM_CANCELLED, 1234);
1573 stream_->OnStreamReset(rst_frame);
fkastenholz305e1732019-06-18 05:01:22 -07001574 if (VersionHasIetfQuicFrames(connection_->transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001575 // Version 99/IETF QUIC should close just the read side.
1576 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
bncc7d9e0c2019-04-16 10:22:15 -07001577 EXPECT_FALSE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001578 } else {
1579 // Google QUIC should close both sides of the stream.
bncc7d9e0c2019-04-16 10:22:15 -07001580 EXPECT_TRUE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001581 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
1582 }
1583}
1584
renjietang28c04b72019-07-01 15:08:09 -07001585TEST_P(QuicStreamTest, WindowUpdateForReadOnlyStream) {
renjietang28c04b72019-07-01 15:08:09 -07001586 Initialize();
1587
1588 QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
1589 connection_->transport_version(), Perspective::IS_CLIENT);
1590 TestStream stream(stream_id, session_.get(), READ_UNIDIRECTIONAL);
1591 QuicWindowUpdateFrame window_update_frame(kInvalidControlFrameId, stream_id,
1592 0);
1593 EXPECT_CALL(
1594 *connection_,
1595 CloseConnection(
1596 QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM,
1597 "WindowUpdateFrame received on READ_UNIDIRECTIONAL stream.", _));
1598 stream.OnWindowUpdateFrame(window_update_frame);
1599}
1600
renjietang15afba32019-10-23 14:32:35 -07001601TEST_P(QuicStreamTest, RstStreamFrameChangesCloseOffset) {
renjietang15afba32019-10-23 14:32:35 -07001602 Initialize();
1603
1604 QuicStreamFrame stream_frame(stream_->id(), true, 0, "abc");
renjietangb38e6352019-10-24 09:38:20 -07001605 EXPECT_CALL(*stream_, OnDataAvailable());
renjietang15afba32019-10-23 14:32:35 -07001606 stream_->OnStreamFrame(stream_frame);
1607 QuicRstStreamFrame rst(kInvalidControlFrameId, stream_->id(),
1608 QUIC_STREAM_CANCELLED, 0u);
1609
1610 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_MULTIPLE_OFFSET, _, _));
1611 stream_->OnStreamReset(rst);
1612}
1613
QUICHE teama6ef0a62019-03-07 20:34:33 -05001614} // namespace
1615} // namespace test
1616} // namespace quic