blob: ebb0f2c6a25556e8f492ac0a42c2c60501a907aa [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"
QUICHE teama6ef0a62019-03-07 20:34:33 -050019#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
20#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
21#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
22#include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_storage.h"
23#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050024#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
25#include "net/third_party/quiche/src/quic/platform/api/quic_test_mem_slice_vector.h"
26#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h"
27#include "net/third_party/quiche/src/quic/test_tools/quic_connection_peer.h"
28#include "net/third_party/quiche/src/quic/test_tools/quic_flow_controller_peer.h"
29#include "net/third_party/quiche/src/quic/test_tools/quic_session_peer.h"
30#include "net/third_party/quiche/src/quic/test_tools/quic_stream_peer.h"
31#include "net/third_party/quiche/src/quic/test_tools/quic_stream_sequencer_peer.h"
32#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
bnc4e9283d2019-12-17 07:08:57 -080033#include "net/third_party/quiche/src/common/platform/api/quiche_arraysize.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) {
584 Initialize();
585
586 stream_->StopReading();
587
588 // Connection should not get terminated due to flow control errors.
589 EXPECT_CALL(*connection_,
590 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _))
591 .Times(0);
592 EXPECT_CALL(*connection_, SendControlFrame(_))
593 .Times(AtLeast(1))
bnc5b3c3be2019-06-25 10:37:09 -0700594 .WillRepeatedly(Invoke(&ClearControlFrame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500595
vasilvvc48c8712019-03-11 13:38:16 -0700596 std::string data(1000, 'x');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500597 for (QuicStreamOffset offset = 0;
598 offset < 2 * kInitialStreamFlowControlWindowForTest;
599 offset += data.length()) {
600 QuicStreamFrame frame(stream_->id(), false, offset, data);
601 stream_->OnStreamFrame(frame);
602 }
603 EXPECT_LT(
604 kInitialStreamFlowControlWindowForTest,
605 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller()));
606}
607
608TEST_P(QuicStreamTest, FinalByteOffsetFromFin) {
609 Initialize();
610
renjietang6c066562019-11-04 17:05:59 -0800611 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500612
renjietangb38e6352019-10-24 09:38:20 -0700613 QuicStreamFrame stream_frame_no_fin(stream_->id(), false, 1234, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500614 stream_->OnStreamFrame(stream_frame_no_fin);
renjietang6c066562019-11-04 17:05:59 -0800615 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500616
renjietangb38e6352019-10-24 09:38:20 -0700617 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500618 stream_->OnStreamFrame(stream_frame_with_fin);
renjietang6c066562019-11-04 17:05:59 -0800619 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500620}
621
622TEST_P(QuicStreamTest, FinalByteOffsetFromRst) {
623 Initialize();
624
renjietang6c066562019-11-04 17:05:59 -0800625 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500626 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
627 QUIC_STREAM_CANCELLED, 1234);
628 stream_->OnStreamReset(rst_frame);
renjietang6c066562019-11-04 17:05:59 -0800629 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500630}
631
632TEST_P(QuicStreamTest, InvalidFinalByteOffsetFromRst) {
633 Initialize();
634
renjietang6c066562019-11-04 17:05:59 -0800635 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500636 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
637 QUIC_STREAM_CANCELLED, 0xFFFFFFFFFFFF);
638 // Stream should not accept the frame, and the connection should be closed.
639 EXPECT_CALL(*connection_,
640 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
641 stream_->OnStreamReset(rst_frame);
renjietang6c066562019-11-04 17:05:59 -0800642 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500643 stream_->OnClose();
644}
645
646TEST_P(QuicStreamTest, FinalByteOffsetFromZeroLengthStreamFrame) {
647 // When receiving Trailers, an empty stream frame is created with the FIN set,
648 // and is passed to OnStreamFrame. The Trailers may be sent in advance of
649 // queued body bytes being sent, and thus the final byte offset may exceed
650 // current flow control limits. Flow control should only be concerned with
651 // data that has actually been sent/received, so verify that flow control
652 // ignores such a stream frame.
653 Initialize();
654
renjietang6c066562019-11-04 17:05:59 -0800655 EXPECT_FALSE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500656 const QuicStreamOffset kByteOffsetExceedingFlowControlWindow =
657 kInitialSessionFlowControlWindowForTest + 1;
658 const QuicStreamOffset current_stream_flow_control_offset =
659 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller());
660 const QuicStreamOffset current_connection_flow_control_offset =
661 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller());
662 ASSERT_GT(kByteOffsetExceedingFlowControlWindow,
663 current_stream_flow_control_offset);
664 ASSERT_GT(kByteOffsetExceedingFlowControlWindow,
665 current_connection_flow_control_offset);
666 QuicStreamFrame zero_length_stream_frame_with_fin(
667 stream_->id(), /*fin=*/true, kByteOffsetExceedingFlowControlWindow,
dmcardlecf0bfcf2019-12-13 08:08:21 -0800668 quiche::QuicheStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500669 EXPECT_EQ(0, zero_length_stream_frame_with_fin.data_length);
670
671 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
672 stream_->OnStreamFrame(zero_length_stream_frame_with_fin);
renjietang6c066562019-11-04 17:05:59 -0800673 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500674
675 // The flow control receive offset values should not have changed.
676 EXPECT_EQ(
677 current_stream_flow_control_offset,
678 QuicFlowControllerPeer::ReceiveWindowOffset(stream_->flow_controller()));
679 EXPECT_EQ(
680 current_connection_flow_control_offset,
681 QuicFlowControllerPeer::ReceiveWindowOffset(session_->flow_controller()));
682}
683
684TEST_P(QuicStreamTest, OnStreamResetOffsetOverflow) {
685 Initialize();
686 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
687 QUIC_STREAM_CANCELLED, kMaxStreamLength + 1);
688 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
689 stream_->OnStreamReset(rst_frame);
690}
691
692TEST_P(QuicStreamTest, OnStreamFrameUpperLimit) {
693 Initialize();
694
695 // Modify receive window offset and sequencer buffer total_bytes_read_ to
696 // avoid flow control violation.
697 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
698 kMaxStreamLength + 5u);
699 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(),
700 kMaxStreamLength + 5u);
701 QuicStreamSequencerPeer::SetFrameBufferTotalBytesRead(
702 QuicStreamPeer::sequencer(stream_), kMaxStreamLength - 10u);
703
704 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _))
705 .Times(0);
renjietangb38e6352019-10-24 09:38:20 -0700706 QuicStreamFrame stream_frame(stream_->id(), false, kMaxStreamLength - 1, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500707 stream_->OnStreamFrame(stream_frame);
renjietangb38e6352019-10-24 09:38:20 -0700708 QuicStreamFrame stream_frame2(stream_->id(), true, kMaxStreamLength, "");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500709 stream_->OnStreamFrame(stream_frame2);
710}
711
712TEST_P(QuicStreamTest, StreamTooLong) {
713 Initialize();
714 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _))
715 .Times(1);
renjietangb38e6352019-10-24 09:38:20 -0700716 QuicStreamFrame stream_frame(stream_->id(), false, kMaxStreamLength, ".");
dmcardlecf0bfcf2019-12-13 08:08:21 -0800717 EXPECT_QUIC_PEER_BUG(
718 stream_->OnStreamFrame(stream_frame),
719 quiche::QuicheStrCat("Receive stream frame on stream ", stream_->id(),
720 " reaches max stream length"));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500721}
722
renjietang9bf25642019-10-10 10:21:15 -0700723TEST_P(QuicStreamTest, SetDrainingIncomingOutgoing) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500724 // Don't have incoming data consumed.
725 Initialize();
726
727 // Incoming data with FIN.
renjietangb38e6352019-10-24 09:38:20 -0700728 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500729 stream_->OnStreamFrame(stream_frame_with_fin);
730 // The FIN has been received but not consumed.
renjietang6c066562019-11-04 17:05:59 -0800731 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500732 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
733 EXPECT_FALSE(stream_->reading_stopped());
734
735 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
736
737 // Outgoing data with FIN.
738 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
739 .WillOnce(InvokeWithoutArgs([this]() {
740 return MockQuicSession::ConsumeData(stream_, stream_->id(), 2u, 0u,
741 FIN);
742 }));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800743 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 2), true,
744 nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500745 EXPECT_TRUE(stream_->write_side_closed());
746
747 EXPECT_EQ(1u, QuicSessionPeer::GetDrainingStreams(session_.get())
748 ->count(kTestStreamId));
749 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
750}
751
renjietang9bf25642019-10-10 10:21:15 -0700752TEST_P(QuicStreamTest, SetDrainingOutgoingIncoming) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500753 // Don't have incoming data consumed.
754 Initialize();
755
756 // Outgoing data with FIN.
757 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _))
758 .WillOnce(InvokeWithoutArgs([this]() {
759 return MockQuicSession::ConsumeData(stream_, stream_->id(), 2u, 0u,
760 FIN);
761 }));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800762 stream_->WriteOrBufferData(quiche::QuicheStringPiece(kData1, 2), true,
763 nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500764 EXPECT_TRUE(stream_->write_side_closed());
765
766 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
767
768 // Incoming data with FIN.
renjietangb38e6352019-10-24 09:38:20 -0700769 QuicStreamFrame stream_frame_with_fin(stream_->id(), true, 1234, ".");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500770 stream_->OnStreamFrame(stream_frame_with_fin);
771 // The FIN has been received but not consumed.
renjietang6c066562019-11-04 17:05:59 -0800772 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500773 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
774 EXPECT_FALSE(stream_->reading_stopped());
775
776 EXPECT_EQ(1u, QuicSessionPeer::GetDrainingStreams(session_.get())
777 ->count(kTestStreamId));
778 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
779}
780
781TEST_P(QuicStreamTest, EarlyResponseFinHandling) {
782 // Verify that if the server completes the response before reading the end of
783 // the request, the received FIN is recorded.
784
785 Initialize();
786 EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
787 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
788 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
789
790 // Receive data for the request.
renjietangb38e6352019-10-24 09:38:20 -0700791 EXPECT_CALL(*stream_, OnDataAvailable()).Times(1);
792 QuicStreamFrame frame1(stream_->id(), false, 0, "Start");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500793 stream_->OnStreamFrame(frame1);
794 // When QuicSimpleServerStream sends the response, it calls
795 // QuicStream::CloseReadSide() first.
796 QuicStreamPeer::CloseReadSide(stream_);
797 // Send data and FIN for the response.
798 stream_->WriteOrBufferData(kData1, false, nullptr);
799 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
800 // Receive remaining data and FIN for the request.
renjietangb38e6352019-10-24 09:38:20 -0700801 QuicStreamFrame frame2(stream_->id(), true, 0, "End");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500802 stream_->OnStreamFrame(frame2);
803 EXPECT_TRUE(stream_->fin_received());
renjietang6c066562019-11-04 17:05:59 -0800804 EXPECT_TRUE(stream_->HasReceivedFinalOffset());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500805}
806
807TEST_P(QuicStreamTest, StreamWaitsForAcks) {
808 Initialize();
809 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
810 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
811 // Stream is not waiting for acks initially.
812 EXPECT_FALSE(stream_->IsWaitingForAcks());
813 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
zhongyi9fa2be32019-09-10 12:39:01 -0700814 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500815
816 // Send kData1.
817 stream_->WriteOrBufferData(kData1, false, nullptr);
fayang8265a2a2019-10-16 11:23:51 -0700818 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500819 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
820 EXPECT_TRUE(stream_->IsWaitingForAcks());
821 QuicByteCount newly_acked_length = 0;
822 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
823 &newly_acked_length));
824 EXPECT_EQ(9u, newly_acked_length);
825 // Stream is not waiting for acks as all sent data is acked.
826 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700827 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500828 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
829
830 // Send kData2.
831 stream_->WriteOrBufferData(kData2, false, nullptr);
832 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700833 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500834 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
835 // Send FIN.
836 stream_->WriteOrBufferData("", true, nullptr);
837 // Fin only frame is not stored in send buffer.
838 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
839
840 // kData2 is retransmitted.
841 stream_->OnStreamFrameRetransmitted(9, 9, false);
842
843 // kData2 is acked.
844 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
845 &newly_acked_length));
846 EXPECT_EQ(9u, newly_acked_length);
847 // Stream is waiting for acks as FIN is not acked.
848 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700849 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500850 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
851
852 // FIN is acked.
853 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 0, true, QuicTime::Delta::Zero(),
854 &newly_acked_length));
855 EXPECT_EQ(0u, newly_acked_length);
856 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700857 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500858 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
859}
860
861TEST_P(QuicStreamTest, StreamDataGetAckedOutOfOrder) {
862 Initialize();
863 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
864 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
865 // Send data.
866 stream_->WriteOrBufferData(kData1, false, nullptr);
867 stream_->WriteOrBufferData(kData1, false, nullptr);
868 stream_->WriteOrBufferData(kData1, false, nullptr);
869 stream_->WriteOrBufferData("", true, nullptr);
870 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
871 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700872 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500873 QuicByteCount newly_acked_length = 0;
874 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
875 &newly_acked_length));
fayang8265a2a2019-10-16 11:23:51 -0700876 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500877 EXPECT_EQ(9u, newly_acked_length);
878 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
879 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 9, false, QuicTime::Delta::Zero(),
880 &newly_acked_length));
fayang8265a2a2019-10-16 11:23:51 -0700881 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500882 EXPECT_EQ(9u, newly_acked_length);
883 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
884 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
885 &newly_acked_length));
fayang8265a2a2019-10-16 11:23:51 -0700886 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500887 EXPECT_EQ(9u, newly_acked_length);
888 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
889 // FIN is not acked yet.
890 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700891 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500892 EXPECT_TRUE(stream_->OnStreamFrameAcked(27, 0, true, QuicTime::Delta::Zero(),
893 &newly_acked_length));
894 EXPECT_EQ(0u, newly_acked_length);
895 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700896 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500897}
898
899TEST_P(QuicStreamTest, CancelStream) {
900 Initialize();
901 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
902 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
903 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700904 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500905 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
906
907 stream_->WriteOrBufferData(kData1, false, nullptr);
908 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700909 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500910 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
911 // Cancel stream.
912 stream_->Reset(QUIC_STREAM_NO_ERROR);
913 // stream still waits for acks as the error code is QUIC_STREAM_NO_ERROR, and
914 // data is going to be retransmitted.
915 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700916 EXPECT_TRUE(session_->HasUnackedStreamData());
zhongyi1b2f7832019-06-14 13:31:34 -0700917 EXPECT_CALL(*connection_,
918 OnStreamReset(stream_->id(), QUIC_STREAM_CANCELLED));
renjietangeab92852019-10-25 12:16:14 -0700919 EXPECT_CALL(*connection_, SendControlFrame(_))
920 .Times(AtLeast(1))
921 .WillRepeatedly(Invoke(&ClearControlFrame));
zhongyi1b2f7832019-06-14 13:31:34 -0700922 EXPECT_CALL(*session_, SendRstStream(stream_->id(), QUIC_STREAM_CANCELLED, 9))
923 .WillOnce(InvokeWithoutArgs([this]() {
renjietang61cc2452019-11-26 10:57:10 -0800924 session_->ReallySendRstStream(stream_->id(), QUIC_STREAM_CANCELLED,
925 stream_->stream_bytes_written());
zhongyi1b2f7832019-06-14 13:31:34 -0700926 }));
927
QUICHE teama6ef0a62019-03-07 20:34:33 -0500928 stream_->Reset(QUIC_STREAM_CANCELLED);
929 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
930 // Stream stops waiting for acks as data is not going to be retransmitted.
931 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700932 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500933}
934
935TEST_P(QuicStreamTest, RstFrameReceivedStreamNotFinishSending) {
renjietang9bf25642019-10-10 10:21:15 -0700936 if (VersionHasIetfQuicFrames(GetParam().transport_version)) {
937 // In IETF QUIC, receiving a RESET_STREAM will only close the read side. The
938 // stream itself is not closed and will not send reset.
939 return;
940 }
941
QUICHE teama6ef0a62019-03-07 20:34:33 -0500942 Initialize();
943 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
944 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
945 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700946 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500947 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
948
949 stream_->WriteOrBufferData(kData1, false, nullptr);
950 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700951 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500952 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
953
954 // RST_STREAM received.
955 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
956 QUIC_STREAM_CANCELLED, 9);
957 EXPECT_CALL(*session_,
958 SendRstStream(stream_->id(), QUIC_RST_ACKNOWLEDGEMENT, 9));
959 stream_->OnStreamReset(rst_frame);
960 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
961 // Stream stops waiting for acks as it does not finish sending and rst is
962 // sent.
963 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700964 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500965}
966
967TEST_P(QuicStreamTest, RstFrameReceivedStreamFinishSending) {
968 Initialize();
969 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
970 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
971 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700972 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500973 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
974
975 stream_->WriteOrBufferData(kData1, true, nullptr);
976 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700977 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500978
979 // RST_STREAM received.
980 EXPECT_CALL(*session_, SendRstStream(_, _, _)).Times(0);
981 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
982 QUIC_STREAM_CANCELLED, 1234);
983 stream_->OnStreamReset(rst_frame);
984 // Stream still waits for acks as it finishes sending and has unacked data.
985 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -0700986 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500987 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
988}
989
990TEST_P(QuicStreamTest, ConnectionClosed) {
991 Initialize();
992 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
993 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
994 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -0700995 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500996 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
997
998 stream_->WriteOrBufferData(kData1, false, nullptr);
999 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -07001000 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001001 EXPECT_CALL(*session_,
1002 SendRstStream(stream_->id(), QUIC_RST_ACKNOWLEDGEMENT, 9));
1003 stream_->OnConnectionClosed(QUIC_INTERNAL_ERROR,
1004 ConnectionCloseSource::FROM_SELF);
1005 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1006 // Stream stops waiting for acks as connection is going to close.
1007 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -07001008 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001009}
1010
1011TEST_P(QuicStreamTest, CanWriteNewDataAfterData) {
wub49855982019-05-01 14:16:26 -07001012 SetQuicFlag(FLAGS_quic_buffered_data_threshold, 100);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001013 Initialize();
1014 EXPECT_TRUE(stream_->CanWriteNewDataAfterData(99));
1015 EXPECT_FALSE(stream_->CanWriteNewDataAfterData(100));
1016}
1017
1018TEST_P(QuicStreamTest, WriteBufferedData) {
1019 // Set buffered data low water mark to be 100.
wub49855982019-05-01 14:16:26 -07001020 SetQuicFlag(FLAGS_quic_buffered_data_threshold, 100);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001021
1022 Initialize();
vasilvvc48c8712019-03-11 13:38:16 -07001023 std::string data(1024, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001024 EXPECT_TRUE(stream_->CanWriteNewData());
1025
1026 // Testing WriteOrBufferData.
1027 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1028 .WillOnce(InvokeWithoutArgs([this]() {
1029 return MockQuicSession::ConsumeData(stream_, stream_->id(), 100u, 0u,
1030 NO_FIN);
1031 }));
1032 stream_->WriteOrBufferData(data, false, nullptr);
1033 stream_->WriteOrBufferData(data, false, nullptr);
1034 stream_->WriteOrBufferData(data, false, nullptr);
zhongyi1b2f7832019-06-14 13:31:34 -07001035 EXPECT_TRUE(stream_->IsWaitingForAcks());
1036
QUICHE teama6ef0a62019-03-07 20:34:33 -05001037 // Verify all data is saved.
1038 EXPECT_EQ(3 * data.length() - 100, stream_->BufferedDataBytes());
1039
1040 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1041 .WillOnce(InvokeWithoutArgs([this]() {
1042 return MockQuicSession::ConsumeData(stream_, stream_->id(), 100, 100u,
1043 NO_FIN);
1044 }));
1045 // Buffered data size > threshold, do not ask upper layer for more data.
1046 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(0);
1047 stream_->OnCanWrite();
1048 EXPECT_EQ(3 * data.length() - 200, stream_->BufferedDataBytes());
1049 EXPECT_FALSE(stream_->CanWriteNewData());
1050
1051 // Send buffered data to make buffered data size < threshold.
1052 size_t data_to_write = 3 * data.length() - 200 -
1053 GetQuicFlag(FLAGS_quic_buffered_data_threshold) + 1;
1054 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1055 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1056 return MockQuicSession::ConsumeData(stream_, stream_->id(),
1057 data_to_write, 200u, NO_FIN);
1058 }));
1059 // Buffered data size < threshold, ask upper layer for more data.
1060 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1061 stream_->OnCanWrite();
dschinazi696ee602019-04-25 16:05:35 -07001062 EXPECT_EQ(static_cast<uint64_t>(
1063 GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001064 stream_->BufferedDataBytes());
1065 EXPECT_TRUE(stream_->CanWriteNewData());
1066
1067 // Flush all buffered data.
1068 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1069 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1070 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1071 stream_->OnCanWrite();
1072 EXPECT_EQ(0u, stream_->BufferedDataBytes());
1073 EXPECT_FALSE(stream_->HasBufferedData());
1074 EXPECT_TRUE(stream_->CanWriteNewData());
1075
1076 // Testing Writev.
1077 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1078 .WillOnce(Return(QuicConsumedData(0, false)));
1079 struct iovec iov = {const_cast<char*>(data.data()), data.length()};
1080 QuicMemSliceStorage storage(
1081 &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
1082 1024);
1083 QuicConsumedData consumed = stream_->WriteMemSlices(storage.ToSpan(), false);
1084
1085 // There is no buffered data before, all data should be consumed without
1086 // respecting buffered data upper limit.
1087 EXPECT_EQ(data.length(), consumed.bytes_consumed);
1088 EXPECT_FALSE(consumed.fin_consumed);
1089 EXPECT_EQ(data.length(), stream_->BufferedDataBytes());
1090 EXPECT_FALSE(stream_->CanWriteNewData());
1091
1092 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(0);
1093 QuicMemSliceStorage storage2(
1094 &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
1095 1024);
1096 consumed = stream_->WriteMemSlices(storage2.ToSpan(), false);
1097 // No Data can be consumed as buffered data is beyond upper limit.
1098 EXPECT_EQ(0u, consumed.bytes_consumed);
1099 EXPECT_FALSE(consumed.fin_consumed);
1100 EXPECT_EQ(data.length(), stream_->BufferedDataBytes());
1101
1102 data_to_write =
1103 data.length() - GetQuicFlag(FLAGS_quic_buffered_data_threshold) + 1;
1104 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1105 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1106 return MockQuicSession::ConsumeData(stream_, stream_->id(),
1107 data_to_write, 0u, NO_FIN);
1108 }));
1109
1110 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1111 stream_->OnCanWrite();
dschinazi696ee602019-04-25 16:05:35 -07001112 EXPECT_EQ(static_cast<uint64_t>(
1113 GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001114 stream_->BufferedDataBytes());
1115 EXPECT_TRUE(stream_->CanWriteNewData());
1116
1117 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(0);
1118 // All data can be consumed as buffered data is below upper limit.
1119 QuicMemSliceStorage storage3(
1120 &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
1121 1024);
1122 consumed = stream_->WriteMemSlices(storage3.ToSpan(), false);
1123 EXPECT_EQ(data.length(), consumed.bytes_consumed);
1124 EXPECT_FALSE(consumed.fin_consumed);
1125 EXPECT_EQ(data.length() + GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1,
1126 stream_->BufferedDataBytes());
1127 EXPECT_FALSE(stream_->CanWriteNewData());
1128}
1129
1130TEST_P(QuicStreamTest, WritevDataReachStreamLimit) {
1131 Initialize();
vasilvvc48c8712019-03-11 13:38:16 -07001132 std::string data("aaaaa");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001133 QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - data.length(),
1134 stream_);
1135 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1136 .WillOnce(Invoke(&(MockQuicSession::ConsumeData)));
1137 struct iovec iov = {const_cast<char*>(data.data()), 5u};
1138 QuicMemSliceStorage storage(
1139 &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
1140 1024);
1141 QuicConsumedData consumed = stream_->WriteMemSlices(storage.ToSpan(), false);
1142 EXPECT_EQ(data.length(), consumed.bytes_consumed);
1143 struct iovec iov2 = {const_cast<char*>(data.data()), 1u};
1144 QuicMemSliceStorage storage2(
1145 &iov2, 1,
1146 session_->connection()->helper()->GetStreamSendBufferAllocator(), 1024);
1147 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
1148 EXPECT_QUIC_BUG(stream_->WriteMemSlices(storage2.ToSpan(), false),
1149 "Write too many data via stream");
1150}
1151
1152TEST_P(QuicStreamTest, WriteMemSlices) {
1153 // Set buffered data low water mark to be 100.
wub49855982019-05-01 14:16:26 -07001154 SetQuicFlag(FLAGS_quic_buffered_data_threshold, 100);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001155
1156 Initialize();
1157 char data[1024];
1158 std::vector<std::pair<char*, size_t>> buffers;
bnc4e9283d2019-12-17 07:08:57 -08001159 buffers.push_back(std::make_pair(data, QUICHE_ARRAYSIZE(data)));
1160 buffers.push_back(std::make_pair(data, QUICHE_ARRAYSIZE(data)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001161 QuicTestMemSliceVector vector1(buffers);
1162 QuicTestMemSliceVector vector2(buffers);
1163 QuicMemSliceSpan span1 = vector1.span();
1164 QuicMemSliceSpan span2 = vector2.span();
1165
1166 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1167 .WillOnce(InvokeWithoutArgs([this]() {
1168 return MockQuicSession::ConsumeData(stream_, stream_->id(), 100u, 0u,
1169 NO_FIN);
1170 }));
1171 // There is no buffered data before, all data should be consumed.
1172 QuicConsumedData consumed = stream_->WriteMemSlices(span1, false);
1173 EXPECT_EQ(2048u, consumed.bytes_consumed);
1174 EXPECT_FALSE(consumed.fin_consumed);
bnc4e9283d2019-12-17 07:08:57 -08001175 EXPECT_EQ(2 * QUICHE_ARRAYSIZE(data) - 100, stream_->BufferedDataBytes());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001176 EXPECT_FALSE(stream_->fin_buffered());
1177
1178 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(0);
1179 // No Data can be consumed as buffered data is beyond upper limit.
1180 consumed = stream_->WriteMemSlices(span2, true);
1181 EXPECT_EQ(0u, consumed.bytes_consumed);
1182 EXPECT_FALSE(consumed.fin_consumed);
bnc4e9283d2019-12-17 07:08:57 -08001183 EXPECT_EQ(2 * QUICHE_ARRAYSIZE(data) - 100, stream_->BufferedDataBytes());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001184 EXPECT_FALSE(stream_->fin_buffered());
1185
bnc4e9283d2019-12-17 07:08:57 -08001186 size_t data_to_write = 2 * QUICHE_ARRAYSIZE(data) - 100 -
QUICHE teama6ef0a62019-03-07 20:34:33 -05001187 GetQuicFlag(FLAGS_quic_buffered_data_threshold) + 1;
1188 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1189 .WillOnce(InvokeWithoutArgs([this, data_to_write]() {
1190 return MockQuicSession::ConsumeData(stream_, stream_->id(),
1191 data_to_write, 100u, NO_FIN);
1192 }));
1193 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
1194 stream_->OnCanWrite();
dschinazi696ee602019-04-25 16:05:35 -07001195 EXPECT_EQ(static_cast<uint64_t>(
1196 GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001197 stream_->BufferedDataBytes());
1198 // Try to write slices2 again.
1199 EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(0);
1200 consumed = stream_->WriteMemSlices(span2, true);
1201 EXPECT_EQ(2048u, consumed.bytes_consumed);
1202 EXPECT_TRUE(consumed.fin_consumed);
bnc4e9283d2019-12-17 07:08:57 -08001203 EXPECT_EQ(2 * QUICHE_ARRAYSIZE(data) +
QUICHE teama6ef0a62019-03-07 20:34:33 -05001204 GetQuicFlag(FLAGS_quic_buffered_data_threshold) - 1,
1205 stream_->BufferedDataBytes());
1206 EXPECT_TRUE(stream_->fin_buffered());
1207
1208 // Flush all buffered data.
1209 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1210 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1211 stream_->OnCanWrite();
1212 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(0);
1213 EXPECT_FALSE(stream_->HasBufferedData());
1214 EXPECT_TRUE(stream_->write_side_closed());
1215}
1216
1217TEST_P(QuicStreamTest, WriteMemSlicesReachStreamLimit) {
1218 Initialize();
1219 QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - 5u, stream_);
1220 char data[5];
1221 std::vector<std::pair<char*, size_t>> buffers;
bnc4e9283d2019-12-17 07:08:57 -08001222 buffers.push_back(std::make_pair(data, QUICHE_ARRAYSIZE(data)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001223 QuicTestMemSliceVector vector1(buffers);
1224 QuicMemSliceSpan span1 = vector1.span();
1225 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1226 .WillOnce(InvokeWithoutArgs([this]() {
1227 return MockQuicSession::ConsumeData(stream_, stream_->id(), 5u, 0u,
1228 NO_FIN);
1229 }));
1230 // There is no buffered data before, all data should be consumed.
1231 QuicConsumedData consumed = stream_->WriteMemSlices(span1, false);
1232 EXPECT_EQ(5u, consumed.bytes_consumed);
1233
1234 std::vector<std::pair<char*, size_t>> buffers2;
1235 buffers2.push_back(std::make_pair(data, 1u));
1236 QuicTestMemSliceVector vector2(buffers);
1237 QuicMemSliceSpan span2 = vector2.span();
1238 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
1239 EXPECT_QUIC_BUG(stream_->WriteMemSlices(span2, false),
1240 "Write too many data via stream");
1241}
1242
1243TEST_P(QuicStreamTest, StreamDataGetAckedMultipleTimes) {
1244 Initialize();
1245 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1246 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
zhongyi1b2f7832019-06-14 13:31:34 -07001247 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -07001248 EXPECT_FALSE(session_->HasUnackedStreamData());
zhongyi1b2f7832019-06-14 13:31:34 -07001249
QUICHE teama6ef0a62019-03-07 20:34:33 -05001250 // Send [0, 27) and fin.
1251 stream_->WriteOrBufferData(kData1, false, nullptr);
1252 stream_->WriteOrBufferData(kData1, false, nullptr);
1253 stream_->WriteOrBufferData(kData1, true, nullptr);
1254 EXPECT_EQ(3u, QuicStreamPeer::SendBuffer(stream_).size());
1255 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -07001256 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001257 // Ack [0, 9), [5, 22) and [18, 26)
1258 // Verify [0, 9) 9 bytes are acked.
1259 QuicByteCount newly_acked_length = 0;
1260 EXPECT_TRUE(stream_->OnStreamFrameAcked(0, 9, false, QuicTime::Delta::Zero(),
1261 &newly_acked_length));
1262 EXPECT_EQ(9u, newly_acked_length);
1263 EXPECT_EQ(2u, QuicStreamPeer::SendBuffer(stream_).size());
1264 // Verify [9, 22) 13 bytes are acked.
1265 EXPECT_TRUE(stream_->OnStreamFrameAcked(5, 17, false, QuicTime::Delta::Zero(),
1266 &newly_acked_length));
1267 EXPECT_EQ(13u, newly_acked_length);
1268 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1269 // Verify [22, 26) 4 bytes are acked.
1270 EXPECT_TRUE(stream_->OnStreamFrameAcked(18, 8, false, QuicTime::Delta::Zero(),
1271 &newly_acked_length));
1272 EXPECT_EQ(4u, newly_acked_length);
1273 EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream_).size());
1274 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -07001275 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001276
1277 // Ack [0, 27). Verify [26, 27) 1 byte is acked.
1278 EXPECT_TRUE(stream_->OnStreamFrameAcked(26, 1, false, QuicTime::Delta::Zero(),
1279 &newly_acked_length));
1280 EXPECT_EQ(1u, newly_acked_length);
1281 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1282 EXPECT_TRUE(stream_->IsWaitingForAcks());
fayang8265a2a2019-10-16 11:23:51 -07001283 EXPECT_TRUE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001284
1285 // Ack Fin.
1286 EXPECT_TRUE(stream_->OnStreamFrameAcked(27, 0, true, QuicTime::Delta::Zero(),
1287 &newly_acked_length));
1288 EXPECT_EQ(0u, newly_acked_length);
1289 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1290 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -07001291 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001292
1293 // Ack [10, 27) and fin. No new data is acked.
1294 EXPECT_FALSE(stream_->OnStreamFrameAcked(
1295 10, 17, true, QuicTime::Delta::Zero(), &newly_acked_length));
1296 EXPECT_EQ(0u, newly_acked_length);
1297 EXPECT_EQ(0u, QuicStreamPeer::SendBuffer(stream_).size());
1298 EXPECT_FALSE(stream_->IsWaitingForAcks());
zhongyi9fa2be32019-09-10 12:39:01 -07001299 EXPECT_FALSE(session_->HasUnackedStreamData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001300}
1301
1302TEST_P(QuicStreamTest, OnStreamFrameLost) {
1303 Initialize();
1304
1305 // Send [0, 9).
1306 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1307 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1308 stream_->WriteOrBufferData(kData1, false, nullptr);
1309 EXPECT_FALSE(stream_->HasBufferedData());
1310 EXPECT_TRUE(stream_->IsStreamFrameOutstanding(0, 9, false));
1311
1312 // Try to send [9, 27), but connection is blocked.
1313 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1314 .WillOnce(Return(QuicConsumedData(0, false)));
1315 stream_->WriteOrBufferData(kData2, false, nullptr);
1316 stream_->WriteOrBufferData(kData2, false, nullptr);
1317 EXPECT_TRUE(stream_->HasBufferedData());
1318 EXPECT_FALSE(stream_->HasPendingRetransmission());
1319
1320 // Lost [0, 9). When stream gets a chance to write, only lost data is
1321 // transmitted.
1322 stream_->OnStreamFrameLost(0, 9, false);
1323 EXPECT_TRUE(stream_->HasPendingRetransmission());
1324 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1325 .WillOnce(Invoke(MockQuicSession::ConsumeData));
renjietangb38e6352019-10-24 09:38:20 -07001326 EXPECT_CALL(*stream_, OnCanWriteNewData()).Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001327 stream_->OnCanWrite();
1328 EXPECT_FALSE(stream_->HasPendingRetransmission());
1329 EXPECT_TRUE(stream_->HasBufferedData());
1330
1331 // This OnCanWrite causes [9, 27) to be sent.
1332 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1333 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1334 stream_->OnCanWrite();
1335 EXPECT_FALSE(stream_->HasBufferedData());
1336
1337 // Send a fin only frame.
1338 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1339 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1340 stream_->WriteOrBufferData("", true, nullptr);
1341
1342 // Lost [9, 27) and fin.
1343 stream_->OnStreamFrameLost(9, 18, false);
1344 stream_->OnStreamFrameLost(27, 0, true);
1345 EXPECT_TRUE(stream_->HasPendingRetransmission());
1346
1347 // Ack [9, 18).
1348 QuicByteCount newly_acked_length = 0;
1349 EXPECT_TRUE(stream_->OnStreamFrameAcked(9, 9, false, QuicTime::Delta::Zero(),
1350 &newly_acked_length));
1351 EXPECT_EQ(9u, newly_acked_length);
1352 EXPECT_FALSE(stream_->IsStreamFrameOutstanding(9, 3, false));
1353 EXPECT_TRUE(stream_->HasPendingRetransmission());
1354 // This OnCanWrite causes [18, 27) and fin to be retransmitted. Verify fin can
1355 // be bundled with data.
1356 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1357 .WillOnce(InvokeWithoutArgs([this]() {
1358 return MockQuicSession::ConsumeData(stream_, stream_->id(), 9u, 18u,
1359 FIN);
1360 }));
1361 stream_->OnCanWrite();
1362 EXPECT_FALSE(stream_->HasPendingRetransmission());
1363 // Lost [9, 18) again, but it is not considered as lost because kData2
1364 // has been acked.
1365 stream_->OnStreamFrameLost(9, 9, false);
1366 EXPECT_FALSE(stream_->HasPendingRetransmission());
1367 EXPECT_TRUE(stream_->IsStreamFrameOutstanding(27, 0, true));
1368}
1369
1370TEST_P(QuicStreamTest, CannotBundleLostFin) {
1371 Initialize();
1372
1373 // Send [0, 18) and fin.
1374 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1375 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
1376 stream_->WriteOrBufferData(kData1, false, nullptr);
1377 stream_->WriteOrBufferData(kData2, true, nullptr);
1378
1379 // Lost [0, 9) and fin.
1380 stream_->OnStreamFrameLost(0, 9, false);
1381 stream_->OnStreamFrameLost(18, 0, true);
1382
1383 // Retransmit lost data. Verify [0, 9) and fin are retransmitted in two
1384 // frames.
1385 InSequence s;
1386 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1387 .WillOnce(InvokeWithoutArgs([this]() {
1388 return MockQuicSession::ConsumeData(stream_, stream_->id(), 9u, 0u,
1389 NO_FIN);
1390 }));
1391 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1392 .WillOnce(Return(QuicConsumedData(0, true)));
1393 stream_->OnCanWrite();
1394}
1395
1396TEST_P(QuicStreamTest, MarkConnectionLevelWriteBlockedOnWindowUpdateFrame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001397 Initialize();
1398
renjietang39979d32019-09-13 10:02:13 -07001399 // Set the config to a small value so that a newly created stream has small
1400 // send flow control window.
1401 QuicConfigPeer::SetReceivedInitialStreamFlowControlWindow(session_->config(),
1402 100);
renjietang9bf25642019-10-10 10:21:15 -07001403 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesIncomingBidirectional(
1404 session_->config(), 100);
renjietang39979d32019-09-13 10:02:13 -07001405 auto stream = new TestStream(GetNthClientInitiatedBidirectionalStreamId(
1406 GetParam().transport_version, 2),
1407 session_.get(), BIDIRECTIONAL);
1408 session_->ActivateStream(QuicWrapUnique(stream));
1409
QUICHE teama6ef0a62019-03-07 20:34:33 -05001410 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1411 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
1412 EXPECT_CALL(*connection_, SendControlFrame(_))
bnc5b3c3be2019-06-25 10:37:09 -07001413 .WillOnce(Invoke(&ClearControlFrame));
vasilvvc48c8712019-03-11 13:38:16 -07001414 std::string data(1024, '.');
renjietang39979d32019-09-13 10:02:13 -07001415 stream->WriteOrBufferData(data, false, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001416 EXPECT_FALSE(HasWriteBlockedStreams());
1417
1418 QuicWindowUpdateFrame window_update(kInvalidControlFrameId, stream_->id(),
1419 1234);
1420
renjietang39979d32019-09-13 10:02:13 -07001421 stream->OnWindowUpdateFrame(window_update);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001422 // Verify stream is marked connection level write blocked.
1423 EXPECT_TRUE(HasWriteBlockedStreams());
renjietang39979d32019-09-13 10:02:13 -07001424 EXPECT_TRUE(stream->HasBufferedData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001425}
1426
1427// Regression test for b/73282665.
1428TEST_P(QuicStreamTest,
1429 MarkConnectionLevelWriteBlockedOnWindowUpdateFrameWithNoBufferedData) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001430 Initialize();
1431
renjietang39979d32019-09-13 10:02:13 -07001432 // Set the config to a small value so that a newly created stream has small
1433 // send flow control window.
1434 QuicConfigPeer::SetReceivedInitialStreamFlowControlWindow(session_->config(),
1435 100);
renjietang9bf25642019-10-10 10:21:15 -07001436 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesIncomingBidirectional(
1437 session_->config(), 100);
renjietang39979d32019-09-13 10:02:13 -07001438 auto stream = new TestStream(GetNthClientInitiatedBidirectionalStreamId(
1439 GetParam().transport_version, 2),
1440 session_.get(), BIDIRECTIONAL);
1441 session_->ActivateStream(QuicWrapUnique(stream));
1442
1443 std::string data(100, '.');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001444 EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
1445 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
1446 EXPECT_CALL(*connection_, SendControlFrame(_))
bnc5b3c3be2019-06-25 10:37:09 -07001447 .WillOnce(Invoke(&ClearControlFrame));
renjietang39979d32019-09-13 10:02:13 -07001448 stream->WriteOrBufferData(data, false, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001449 EXPECT_FALSE(HasWriteBlockedStreams());
1450
1451 QuicWindowUpdateFrame window_update(kInvalidControlFrameId, stream_->id(),
1452 120);
renjietang39979d32019-09-13 10:02:13 -07001453 stream->OnWindowUpdateFrame(window_update);
1454 EXPECT_FALSE(stream->HasBufferedData());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001455 // Verify stream is marked as blocked although there is no buffered data.
1456 EXPECT_TRUE(HasWriteBlockedStreams());
1457}
1458
1459TEST_P(QuicStreamTest, RetransmitStreamData) {
1460 Initialize();
1461 InSequence s;
1462
1463 // Send [0, 18) with fin.
1464 EXPECT_CALL(*session_, WritevData(_, stream_->id(), _, _, _))
1465 .Times(2)
1466 .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
1467 stream_->WriteOrBufferData(kData1, false, nullptr);
1468 stream_->WriteOrBufferData(kData1, true, nullptr);
1469 // Ack [10, 13).
1470 QuicByteCount newly_acked_length = 0;
1471 stream_->OnStreamFrameAcked(10, 3, false, QuicTime::Delta::Zero(),
1472 &newly_acked_length);
1473 EXPECT_EQ(3u, newly_acked_length);
1474 // Retransmit [0, 18) with fin, and only [0, 8) is consumed.
1475 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 10, 0, NO_FIN))
1476 .WillOnce(InvokeWithoutArgs([this]() {
1477 return MockQuicSession::ConsumeData(stream_, stream_->id(), 8, 0u,
1478 NO_FIN);
1479 }));
1480 EXPECT_FALSE(stream_->RetransmitStreamData(0, 18, true));
1481
1482 // Retransmit [0, 18) with fin, and all is consumed.
1483 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 10, 0, NO_FIN))
1484 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1485 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 5, 13, FIN))
1486 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1487 EXPECT_TRUE(stream_->RetransmitStreamData(0, 18, true));
1488
1489 // Retransmit [0, 8) with fin, and all is consumed.
1490 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 8, 0, NO_FIN))
1491 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1492 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 0, 18, FIN))
1493 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1494 EXPECT_TRUE(stream_->RetransmitStreamData(0, 8, true));
1495}
1496
1497TEST_P(QuicStreamTest, ResetStreamOnTtlExpiresRetransmitLostData) {
1498 Initialize();
1499
1500 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 200, 0, FIN))
1501 .WillOnce(Invoke(MockQuicSession::ConsumeData));
vasilvvc48c8712019-03-11 13:38:16 -07001502 std::string body(200, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001503 stream_->WriteOrBufferData(body, true, nullptr);
1504
1505 // Set TTL to be 1 s.
1506 QuicTime::Delta ttl = QuicTime::Delta::FromSeconds(1);
1507 ASSERT_TRUE(stream_->MaybeSetTtl(ttl));
1508 // Verify data gets retransmitted because TTL does not expire.
1509 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 100, 0, NO_FIN))
1510 .WillOnce(Invoke(MockQuicSession::ConsumeData));
1511 EXPECT_TRUE(stream_->RetransmitStreamData(0, 100, false));
1512 stream_->OnStreamFrameLost(100, 100, true);
1513 EXPECT_TRUE(stream_->HasPendingRetransmission());
1514
1515 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
1516 // Verify stream gets reset because TTL expires.
1517 EXPECT_CALL(*session_, SendRstStream(_, QUIC_STREAM_TTL_EXPIRED, _)).Times(1);
1518 stream_->OnCanWrite();
1519}
1520
1521TEST_P(QuicStreamTest, ResetStreamOnTtlExpiresEarlyRetransmitData) {
1522 Initialize();
1523
1524 EXPECT_CALL(*session_, WritevData(_, stream_->id(), 200, 0, FIN))
1525 .WillOnce(Invoke(MockQuicSession::ConsumeData));
vasilvvc48c8712019-03-11 13:38:16 -07001526 std::string body(200, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001527 stream_->WriteOrBufferData(body, true, nullptr);
1528
1529 // Set TTL to be 1 s.
1530 QuicTime::Delta ttl = QuicTime::Delta::FromSeconds(1);
1531 ASSERT_TRUE(stream_->MaybeSetTtl(ttl));
1532
1533 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
1534 // Verify stream gets reset because TTL expires.
1535 EXPECT_CALL(*session_, SendRstStream(_, QUIC_STREAM_TTL_EXPIRED, _)).Times(1);
1536 stream_->RetransmitStreamData(0, 100, false);
1537}
1538
1539// Test that QuicStream::StopSending A) is a no-op if the connection is not in
1540// version 99, B) that it properly invokes QuicSession::StopSending, and C) that
1541// the correct data is passed along, including getting the stream ID.
renjietang9bf25642019-10-10 10:21:15 -07001542TEST_P(QuicStreamTest, CheckStopSending) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001543 Initialize();
1544 const int kStopSendingCode = 123;
1545 // These must start as false.
bncc7d9e0c2019-04-16 10:22:15 -07001546 EXPECT_FALSE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001547 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
1548 // Expect to actually see a stop sending if and only if we are in version 99.
fkastenholz305e1732019-06-18 05:01:22 -07001549 if (VersionHasIetfQuicFrames(connection_->transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001550 EXPECT_CALL(*session_, SendStopSending(kStopSendingCode, stream_->id()))
1551 .Times(1);
1552 } else {
1553 EXPECT_CALL(*session_, SendStopSending(_, _)).Times(0);
1554 }
1555 stream_->SendStopSending(kStopSendingCode);
1556 // Sending a STOP_SENDING does not actually close the local stream.
1557 // Our implementation waits for the responding RESET_STREAM to effect the
1558 // closes. Therefore, read- and write-side closes should both be false.
bncc7d9e0c2019-04-16 10:22:15 -07001559 EXPECT_FALSE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001560 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
1561}
1562
1563// Test that OnStreamReset does one-way (read) closes if version 99, two way
1564// (read and write) if not version 99.
1565TEST_P(QuicStreamTest, OnStreamResetReadOrReadWrite) {
1566 Initialize();
bncc7d9e0c2019-04-16 10:22:15 -07001567 EXPECT_FALSE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001568 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
1569
1570 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream_->id(),
1571 QUIC_STREAM_CANCELLED, 1234);
1572 stream_->OnStreamReset(rst_frame);
fkastenholz305e1732019-06-18 05:01:22 -07001573 if (VersionHasIetfQuicFrames(connection_->transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001574 // Version 99/IETF QUIC should close just the read side.
1575 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
bncc7d9e0c2019-04-16 10:22:15 -07001576 EXPECT_FALSE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001577 } else {
1578 // Google QUIC should close both sides of the stream.
bncc7d9e0c2019-04-16 10:22:15 -07001579 EXPECT_TRUE(stream_->write_side_closed());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001580 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
1581 }
1582}
1583
renjietang28c04b72019-07-01 15:08:09 -07001584TEST_P(QuicStreamTest, WindowUpdateForReadOnlyStream) {
renjietang28c04b72019-07-01 15:08:09 -07001585 Initialize();
1586
1587 QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
1588 connection_->transport_version(), Perspective::IS_CLIENT);
1589 TestStream stream(stream_id, session_.get(), READ_UNIDIRECTIONAL);
1590 QuicWindowUpdateFrame window_update_frame(kInvalidControlFrameId, stream_id,
1591 0);
1592 EXPECT_CALL(
1593 *connection_,
1594 CloseConnection(
1595 QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM,
1596 "WindowUpdateFrame received on READ_UNIDIRECTIONAL stream.", _));
1597 stream.OnWindowUpdateFrame(window_update_frame);
1598}
1599
renjietang15afba32019-10-23 14:32:35 -07001600TEST_P(QuicStreamTest, RstStreamFrameChangesCloseOffset) {
renjietang15afba32019-10-23 14:32:35 -07001601 Initialize();
1602
1603 QuicStreamFrame stream_frame(stream_->id(), true, 0, "abc");
renjietangb38e6352019-10-24 09:38:20 -07001604 EXPECT_CALL(*stream_, OnDataAvailable());
renjietang15afba32019-10-23 14:32:35 -07001605 stream_->OnStreamFrame(stream_frame);
1606 QuicRstStreamFrame rst(kInvalidControlFrameId, stream_->id(),
1607 QUIC_STREAM_CANCELLED, 0u);
1608
1609 EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_MULTIPLE_OFFSET, _, _));
1610 stream_->OnStreamReset(rst);
1611}
1612
QUICHE teama6ef0a62019-03-07 20:34:33 -05001613} // namespace
1614} // namespace test
1615} // namespace quic