blob: 47b1a5cc9e2b12092286b9dadc31d9d84aeb3b71 [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_sequencer.h"
6
7#include <algorithm>
8#include <cstdint>
9#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -070010#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include <utility>
12#include <vector>
13
14#include "net/third_party/quiche/src/quic/core/quic_stream.h"
15#include "net/third_party/quiche/src/quic/core/quic_utils.h"
16#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
17#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
18#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050019#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
20#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
21#include "net/third_party/quiche/src/quic/test_tools/quic_stream_sequencer_peer.h"
22#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
23
24using testing::_;
25using testing::AnyNumber;
26using testing::InSequence;
27
28namespace quic {
29namespace test {
30
31class MockStream : public QuicStreamSequencer::StreamInterface {
32 public:
33 MOCK_METHOD0(OnFinRead, void());
34 MOCK_METHOD0(OnDataAvailable, void());
35 MOCK_METHOD2(CloseConnectionWithDetails,
vasilvvc48c8712019-03-11 13:38:16 -070036 void(QuicErrorCode error, const std::string& details));
QUICHE teama6ef0a62019-03-07 20:34:33 -050037 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error));
38 MOCK_METHOD0(OnCanWrite, void());
39 MOCK_METHOD1(AddBytesConsumed, void(QuicByteCount bytes));
40
41 QuicStreamId id() const override { return 1; }
42
43 const QuicSocketAddress& PeerAddressOfLatestPacket() const override {
44 return peer_address_;
45 }
46
47 protected:
48 QuicSocketAddress peer_address_ =
49 QuicSocketAddress(QuicIpAddress::Any4(), 65535);
50};
51
52namespace {
53
54static const char kPayload[] =
55 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
56
57class QuicStreamSequencerTest : public QuicTest {
58 public:
59 void ConsumeData(size_t num_bytes) {
60 char buffer[1024];
61 ASSERT_GT(QUIC_ARRAYSIZE(buffer), num_bytes);
62 struct iovec iov;
63 iov.iov_base = buffer;
64 iov.iov_len = num_bytes;
65 ASSERT_EQ(static_cast<int>(num_bytes), sequencer_->Readv(&iov, 1));
66 }
67
68 protected:
69 QuicStreamSequencerTest()
70 : stream_(), sequencer_(new QuicStreamSequencer(&stream_)) {}
71
72 // Verify that the data in first region match with the expected[0].
vasilvvc48c8712019-03-11 13:38:16 -070073 bool VerifyReadableRegion(const std::vector<std::string>& expected) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050074 return VerifyReadableRegion(*sequencer_, expected);
75 }
76
77 // Verify that the data in each of currently readable regions match with each
78 // item given in |expected|.
vasilvvc48c8712019-03-11 13:38:16 -070079 bool VerifyReadableRegions(const std::vector<std::string>& expected) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050080 return VerifyReadableRegions(*sequencer_, expected);
81 }
82
83 bool VerifyIovecs(iovec* iovecs,
84 size_t num_iovecs,
vasilvvc48c8712019-03-11 13:38:16 -070085 const std::vector<std::string>& expected) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050086 return VerifyIovecs(*sequencer_, iovecs, num_iovecs, expected);
87 }
88
89 bool VerifyReadableRegion(const QuicStreamSequencer& sequencer,
vasilvvc48c8712019-03-11 13:38:16 -070090 const std::vector<std::string>& expected) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050091 iovec iovecs[1];
92 if (sequencer.GetReadableRegions(iovecs, 1)) {
93 return (VerifyIovecs(sequencer, iovecs, 1,
vasilvvc48c8712019-03-11 13:38:16 -070094 std::vector<std::string>{expected[0]}));
QUICHE teama6ef0a62019-03-07 20:34:33 -050095 }
96 return false;
97 }
98
99 // Verify that the data in each of currently readable regions match with each
100 // item given in |expected|.
101 bool VerifyReadableRegions(const QuicStreamSequencer& sequencer,
vasilvvc48c8712019-03-11 13:38:16 -0700102 const std::vector<std::string>& expected) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500103 iovec iovecs[5];
104 size_t num_iovecs =
105 sequencer.GetReadableRegions(iovecs, QUIC_ARRAYSIZE(iovecs));
106 return VerifyReadableRegion(sequencer, expected) &&
107 VerifyIovecs(sequencer, iovecs, num_iovecs, expected);
108 }
109
110 bool VerifyIovecs(const QuicStreamSequencer& sequencer,
111 iovec* iovecs,
112 size_t num_iovecs,
vasilvvc48c8712019-03-11 13:38:16 -0700113 const std::vector<std::string>& expected) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500114 int start_position = 0;
115 for (size_t i = 0; i < num_iovecs; ++i) {
116 if (!VerifyIovec(iovecs[i],
117 expected[0].substr(start_position, iovecs[i].iov_len))) {
118 return false;
119 }
120 start_position += iovecs[i].iov_len;
121 }
122 return true;
123 }
124
125 bool VerifyIovec(const iovec& iovec, QuicStringPiece expected) {
126 if (iovec.iov_len != expected.length()) {
127 QUIC_LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs "
128 << expected.length();
129 return false;
130 }
131 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) {
132 QUIC_LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base)
133 << " vs " << expected;
134 return false;
135 }
136 return true;
137 }
138
139 void OnFinFrame(QuicStreamOffset byte_offset, const char* data) {
140 QuicStreamFrame frame;
141 frame.stream_id = 1;
142 frame.offset = byte_offset;
143 frame.data_buffer = data;
144 frame.data_length = strlen(data);
145 frame.fin = true;
146 sequencer_->OnStreamFrame(frame);
147 }
148
149 void OnFrame(QuicStreamOffset byte_offset, const char* data) {
150 QuicStreamFrame frame;
151 frame.stream_id = 1;
152 frame.offset = byte_offset;
153 frame.data_buffer = data;
154 frame.data_length = strlen(data);
155 frame.fin = false;
156 sequencer_->OnStreamFrame(frame);
157 }
158
159 size_t NumBufferedBytes() {
160 return QuicStreamSequencerPeer::GetNumBufferedBytes(sequencer_.get());
161 }
162
163 testing::StrictMock<MockStream> stream_;
164 std::unique_ptr<QuicStreamSequencer> sequencer_;
165};
166
167// TODO(rch): reorder these tests so they build on each other.
168
169TEST_F(QuicStreamSequencerTest, RejectOldFrame) {
170 EXPECT_CALL(stream_, AddBytesConsumed(3));
171 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
172 ConsumeData(3);
173 }));
174
175 OnFrame(0, "abc");
176
177 EXPECT_EQ(0u, NumBufferedBytes());
178 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
179 // Ignore this - it matches a past packet number and we should not see it
180 // again.
181 OnFrame(0, "def");
182 EXPECT_EQ(0u, NumBufferedBytes());
183}
184
185TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) {
186 EXPECT_CALL(stream_, OnDataAvailable());
187
188 OnFrame(0, "abc");
189 EXPECT_EQ(3u, NumBufferedBytes());
190 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
191
192 // Ignore this - it matches a buffered frame.
193 // Right now there's no checking that the payload is consistent.
194 OnFrame(0, "def");
195 EXPECT_EQ(3u, NumBufferedBytes());
196}
197
198TEST_F(QuicStreamSequencerTest, FullFrameConsumed) {
199 EXPECT_CALL(stream_, AddBytesConsumed(3));
200 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
201 ConsumeData(3);
202 }));
203
204 OnFrame(0, "abc");
205 EXPECT_EQ(0u, NumBufferedBytes());
206 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
207}
208
209TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) {
210 sequencer_->SetBlockedUntilFlush();
211
212 OnFrame(0, "abc");
213 EXPECT_EQ(3u, NumBufferedBytes());
214 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
215
216 EXPECT_CALL(stream_, AddBytesConsumed(3));
217 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
218 ConsumeData(3);
219 }));
220 sequencer_->SetUnblocked();
221 EXPECT_EQ(0u, NumBufferedBytes());
222 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
223
224 EXPECT_CALL(stream_, AddBytesConsumed(3));
225 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
226 ConsumeData(3);
227 }));
228 EXPECT_FALSE(sequencer_->IsClosed());
229 OnFinFrame(3, "def");
230 EXPECT_TRUE(sequencer_->IsClosed());
231}
232
233TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) {
234 sequencer_->SetBlockedUntilFlush();
235
236 OnFinFrame(0, "abc");
237 EXPECT_EQ(3u, NumBufferedBytes());
238 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
239
240 EXPECT_CALL(stream_, AddBytesConsumed(3));
241 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
242 ConsumeData(3);
243 }));
244 EXPECT_FALSE(sequencer_->IsClosed());
245 sequencer_->SetUnblocked();
246 EXPECT_TRUE(sequencer_->IsClosed());
247 EXPECT_EQ(0u, NumBufferedBytes());
248 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
249}
250
251TEST_F(QuicStreamSequencerTest, EmptyFrame) {
252 EXPECT_CALL(stream_,
253 CloseConnectionWithDetails(QUIC_EMPTY_STREAM_FRAME_NO_FIN, _));
254 OnFrame(0, "");
255 EXPECT_EQ(0u, NumBufferedBytes());
256 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
257}
258
259TEST_F(QuicStreamSequencerTest, EmptyFinFrame) {
260 EXPECT_CALL(stream_, OnDataAvailable());
261 OnFinFrame(0, "");
262 EXPECT_EQ(0u, NumBufferedBytes());
263 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
264}
265
266TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) {
267 EXPECT_CALL(stream_, AddBytesConsumed(2));
268 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
269 ConsumeData(2);
270 }));
271
272 OnFrame(0, "abc");
273 EXPECT_EQ(1u, NumBufferedBytes());
274 EXPECT_EQ(2u, sequencer_->NumBytesConsumed());
275}
276
277TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) {
278 EXPECT_CALL(stream_, OnDataAvailable());
279
280 OnFrame(0, "abc");
281 EXPECT_EQ(3u, NumBufferedBytes());
282 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
283}
284
285TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) {
286 OnFrame(3, "abc");
287 EXPECT_EQ(3u, NumBufferedBytes());
288 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
289}
290
291TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) {
292 // Buffer the first
293 OnFrame(6, "ghi");
294 EXPECT_EQ(3u, NumBufferedBytes());
295 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
296 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
297 // Buffer the second
298 OnFrame(3, "def");
299 EXPECT_EQ(6u, NumBufferedBytes());
300 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
301 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
302
303 EXPECT_CALL(stream_, AddBytesConsumed(9));
304 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
305 ConsumeData(9);
306 }));
307
308 // Now process all of them at once.
309 OnFrame(0, "abc");
310 EXPECT_EQ(9u, sequencer_->NumBytesConsumed());
311 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
312
313 EXPECT_EQ(0u, NumBufferedBytes());
314}
315
316TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) {
317 InSequence s;
318
319 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
320 ConsumeData(3);
321 }));
322 EXPECT_CALL(stream_, AddBytesConsumed(3));
323 OnFinFrame(0, "abc");
324
325 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
326}
327
328TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) {
329 OnFinFrame(6, "");
330 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
331
332 OnFrame(3, "def");
333 EXPECT_CALL(stream_, AddBytesConsumed(6));
334 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
335 ConsumeData(6);
336 }));
337 EXPECT_FALSE(sequencer_->IsClosed());
338 OnFrame(0, "abc");
339 EXPECT_TRUE(sequencer_->IsClosed());
340}
341
342TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) {
343 OnFinFrame(3, "");
344 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
345
346 EXPECT_CALL(stream_, AddBytesConsumed(3));
347 EXPECT_CALL(stream_, OnDataAvailable()).WillOnce(testing::Invoke([this]() {
348 ConsumeData(3);
349 }));
350 EXPECT_FALSE(sequencer_->IsClosed());
351 OnFrame(0, "abc");
352 EXPECT_TRUE(sequencer_->IsClosed());
353}
354
355TEST_F(QuicStreamSequencerTest, TerminateWithReadv) {
356 char buffer[3];
357
358 OnFinFrame(3, "");
359 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
360
361 EXPECT_FALSE(sequencer_->IsClosed());
362
363 EXPECT_CALL(stream_, OnDataAvailable());
364 OnFrame(0, "abc");
365
366 EXPECT_CALL(stream_, AddBytesConsumed(3));
367 iovec iov = {&buffer[0], 3};
368 int bytes_read = sequencer_->Readv(&iov, 1);
369 EXPECT_EQ(3, bytes_read);
370 EXPECT_TRUE(sequencer_->IsClosed());
371}
372
373TEST_F(QuicStreamSequencerTest, MutipleOffsets) {
374 OnFinFrame(3, "");
375 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
376
377 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS));
378 OnFinFrame(5, "");
379 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
380
381 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS));
382 OnFinFrame(1, "");
383 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
384
385 OnFinFrame(3, "");
386 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
387}
388
389class QuicSequencerRandomTest : public QuicStreamSequencerTest {
390 public:
vasilvvc48c8712019-03-11 13:38:16 -0700391 typedef std::pair<int, std::string> Frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500392 typedef std::vector<Frame> FrameList;
393
394 void CreateFrames() {
395 int payload_size = QUIC_ARRAYSIZE(kPayload) - 1;
396 int remaining_payload = payload_size;
397 while (remaining_payload != 0) {
398 int size = std::min(OneToN(6), remaining_payload);
399 int index = payload_size - remaining_payload;
400 list_.push_back(
vasilvvc48c8712019-03-11 13:38:16 -0700401 std::make_pair(index, std::string(kPayload + index, size)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 remaining_payload -= size;
403 }
404 }
405
406 QuicSequencerRandomTest() {
407 uint64_t seed = QuicRandom::GetInstance()->RandUint64();
408 QUIC_LOG(INFO) << "**** The current seed is " << seed << " ****";
409 random_.set_seed(seed);
410
411 CreateFrames();
412 }
413
414 int OneToN(int n) { return random_.RandUint64() % n + 1; }
415
416 void ReadAvailableData() {
417 // Read all available data
418 char output[QUIC_ARRAYSIZE(kPayload) + 1];
419 iovec iov;
420 iov.iov_base = output;
421 iov.iov_len = QUIC_ARRAYSIZE(output);
422 int bytes_read = sequencer_->Readv(&iov, 1);
423 EXPECT_NE(0, bytes_read);
424 output_.append(output, bytes_read);
425 }
426
vasilvvc48c8712019-03-11 13:38:16 -0700427 std::string output_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500428 // Data which peek at using GetReadableRegion if we back up.
vasilvvc48c8712019-03-11 13:38:16 -0700429 std::string peeked_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500430 SimpleRandom random_;
431 FrameList list_;
432};
433
434// All frames are processed as soon as we have sequential data.
435// Infinite buffering, so all frames are acked right away.
436TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) {
437 EXPECT_CALL(stream_, OnDataAvailable())
438 .Times(AnyNumber())
439 .WillRepeatedly(
440 Invoke(this, &QuicSequencerRandomTest::ReadAvailableData));
441 QuicByteCount total_bytes_consumed = 0;
442 EXPECT_CALL(stream_, AddBytesConsumed(_))
443 .Times(AnyNumber())
444 .WillRepeatedly(
445 testing::Invoke([&total_bytes_consumed](QuicByteCount bytes) {
446 total_bytes_consumed += bytes;
447 }));
448
449 while (!list_.empty()) {
450 int index = OneToN(list_.size()) - 1;
451 QUIC_LOG(ERROR) << "Sending index " << index << " " << list_[index].second;
452 OnFrame(list_[index].first, list_[index].second.data());
453
454 list_.erase(list_.begin() + index);
455 }
456
457 ASSERT_EQ(QUIC_ARRAYSIZE(kPayload) - 1, output_.size());
458 EXPECT_EQ(kPayload, output_);
459 EXPECT_EQ(QUIC_ARRAYSIZE(kPayload) - 1, total_bytes_consumed);
460}
461
462TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingBackup) {
463 char buffer[10];
464 iovec iov[2];
465 iov[0].iov_base = &buffer[0];
466 iov[0].iov_len = 5;
467 iov[1].iov_base = &buffer[5];
468 iov[1].iov_len = 5;
469
470 EXPECT_CALL(stream_, OnDataAvailable()).Times(AnyNumber());
471 QuicByteCount total_bytes_consumed = 0;
472 EXPECT_CALL(stream_, AddBytesConsumed(_))
473 .Times(AnyNumber())
474 .WillRepeatedly(
475 testing::Invoke([&total_bytes_consumed](QuicByteCount bytes) {
476 total_bytes_consumed += bytes;
477 }));
478
479 while (output_.size() != QUIC_ARRAYSIZE(kPayload) - 1) {
480 if (!list_.empty() && OneToN(2) == 1) { // Send data
481 int index = OneToN(list_.size()) - 1;
482 OnFrame(list_[index].first, list_[index].second.data());
483 list_.erase(list_.begin() + index);
484 } else { // Read data
485 bool has_bytes = sequencer_->HasBytesToRead();
486 iovec peek_iov[20];
487 int iovs_peeked = sequencer_->GetReadableRegions(peek_iov, 20);
488 if (has_bytes) {
489 ASSERT_LT(0, iovs_peeked);
490 ASSERT_TRUE(sequencer_->GetReadableRegion(peek_iov));
491 } else {
492 ASSERT_EQ(0, iovs_peeked);
493 ASSERT_FALSE(sequencer_->GetReadableRegion(peek_iov));
494 }
495 int total_bytes_to_peek = QUIC_ARRAYSIZE(buffer);
496 for (int i = 0; i < iovs_peeked; ++i) {
497 int bytes_to_peek =
498 std::min<int>(peek_iov[i].iov_len, total_bytes_to_peek);
499 peeked_.append(static_cast<char*>(peek_iov[i].iov_base), bytes_to_peek);
500 total_bytes_to_peek -= bytes_to_peek;
501 if (total_bytes_to_peek == 0) {
502 break;
503 }
504 }
505 int bytes_read = sequencer_->Readv(iov, 2);
506 output_.append(buffer, bytes_read);
507 ASSERT_EQ(output_.size(), peeked_.size());
508 }
509 }
vasilvvc48c8712019-03-11 13:38:16 -0700510 EXPECT_EQ(std::string(kPayload), output_);
511 EXPECT_EQ(std::string(kPayload), peeked_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500512 EXPECT_EQ(QUIC_ARRAYSIZE(kPayload) - 1, total_bytes_consumed);
513}
514
515// Same as above, just using a different method for reading.
516TEST_F(QuicStreamSequencerTest, MarkConsumed) {
517 InSequence s;
518 EXPECT_CALL(stream_, OnDataAvailable());
519
520 OnFrame(0, "abc");
521 OnFrame(3, "def");
522 OnFrame(6, "ghi");
523
524 // abcdefghi buffered.
525 EXPECT_EQ(9u, sequencer_->NumBytesBuffered());
526
527 // Peek into the data.
vasilvvc48c8712019-03-11 13:38:16 -0700528 std::vector<std::string> expected = {"abcdefghi"};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500529 ASSERT_TRUE(VerifyReadableRegions(expected));
530
531 // Consume 1 byte.
532 EXPECT_CALL(stream_, AddBytesConsumed(1));
533 sequencer_->MarkConsumed(1);
534 // Verify data.
vasilvvc48c8712019-03-11 13:38:16 -0700535 std::vector<std::string> expected2 = {"bcdefghi"};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500536 ASSERT_TRUE(VerifyReadableRegions(expected2));
537 EXPECT_EQ(8u, sequencer_->NumBytesBuffered());
538
539 // Consume 2 bytes.
540 EXPECT_CALL(stream_, AddBytesConsumed(2));
541 sequencer_->MarkConsumed(2);
542 // Verify data.
vasilvvc48c8712019-03-11 13:38:16 -0700543 std::vector<std::string> expected3 = {"defghi"};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500544 ASSERT_TRUE(VerifyReadableRegions(expected3));
545 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
546
547 // Consume 5 bytes.
548 EXPECT_CALL(stream_, AddBytesConsumed(5));
549 sequencer_->MarkConsumed(5);
550 // Verify data.
vasilvvc48c8712019-03-11 13:38:16 -0700551 std::vector<std::string> expected4{"i"};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500552 ASSERT_TRUE(VerifyReadableRegions(expected4));
553 EXPECT_EQ(1u, sequencer_->NumBytesBuffered());
554}
555
556TEST_F(QuicStreamSequencerTest, MarkConsumedError) {
557 EXPECT_CALL(stream_, OnDataAvailable());
558
559 OnFrame(0, "abc");
560 OnFrame(9, "jklmnopqrstuvwxyz");
561
562 // Peek into the data. Only the first chunk should be readable because of the
563 // missing data.
vasilvvc48c8712019-03-11 13:38:16 -0700564 std::vector<std::string> expected{"abc"};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500565 ASSERT_TRUE(VerifyReadableRegions(expected));
566
567 // Now, attempt to mark consumed more data than was readable and expect the
568 // stream to be closed.
569 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM));
570 EXPECT_QUIC_BUG(sequencer_->MarkConsumed(4),
571 "Invalid argument to MarkConsumed."
572 " expect to consume: 4, but not enough bytes available.");
573}
574
575TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) {
576 InSequence s;
577 EXPECT_CALL(stream_, OnDataAvailable());
578
579 OnFrame(0, "abc");
580 OnFrame(3, "def");
581 // Missing packet: 6, ghi.
582 OnFrame(9, "jkl");
583
vasilvvc48c8712019-03-11 13:38:16 -0700584 std::vector<std::string> expected = {"abcdef"};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500585 ASSERT_TRUE(VerifyReadableRegions(expected));
586
587 EXPECT_CALL(stream_, AddBytesConsumed(6));
588 sequencer_->MarkConsumed(6);
589}
590
591TEST_F(QuicStreamSequencerTest, Move) {
592 InSequence s;
593 EXPECT_CALL(stream_, OnDataAvailable());
594
595 OnFrame(0, "abc");
596 OnFrame(3, "def");
597 OnFrame(6, "ghi");
598
599 // abcdefghi buffered.
600 EXPECT_EQ(9u, sequencer_->NumBytesBuffered());
601
602 // Peek into the data.
vasilvvc48c8712019-03-11 13:38:16 -0700603 std::vector<std::string> expected = {"abcdefghi"};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500604 ASSERT_TRUE(VerifyReadableRegions(expected));
605
606 QuicStreamSequencer sequencer2(std::move(*sequencer_));
607 ASSERT_TRUE(VerifyReadableRegions(sequencer2, expected));
608}
609
610TEST_F(QuicStreamSequencerTest, OverlappingFramesReceived) {
611 // The peer should never send us non-identical stream frames which contain
612 // overlapping byte ranges - if they do, we close the connection.
613 QuicStreamId id = 1;
614
615 QuicStreamFrame frame1(id, false, 1, QuicStringPiece("hello"));
616 sequencer_->OnStreamFrame(frame1);
617
618 QuicStreamFrame frame2(id, false, 2, QuicStringPiece("hello"));
619 EXPECT_CALL(stream_,
620 CloseConnectionWithDetails(QUIC_OVERLAPPING_STREAM_DATA, _))
621 .Times(0);
622 sequencer_->OnStreamFrame(frame2);
623}
624
625TEST_F(QuicStreamSequencerTest, DataAvailableOnOverlappingFrames) {
626 QuicStreamId id = 1;
vasilvvc48c8712019-03-11 13:38:16 -0700627 const std::string data(1000, '.');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500628
629 // Received [0, 1000).
630 QuicStreamFrame frame1(id, false, 0, data);
631 EXPECT_CALL(stream_, OnDataAvailable());
632 sequencer_->OnStreamFrame(frame1);
633 // Consume [0, 500).
634 EXPECT_CALL(stream_, AddBytesConsumed(500));
635 QuicStreamSequencerTest::ConsumeData(500);
636 EXPECT_EQ(500u, sequencer_->NumBytesConsumed());
637 EXPECT_EQ(500u, sequencer_->NumBytesBuffered());
638
639 // Received [500, 1500).
640 QuicStreamFrame frame2(id, false, 500, data);
641 // Do not call OnDataAvailable as there are readable bytes left in the buffer.
642 EXPECT_CALL(stream_, OnDataAvailable()).Times(0);
643 sequencer_->OnStreamFrame(frame2);
644 // Consume [1000, 1500).
645 EXPECT_CALL(stream_, AddBytesConsumed(1000));
646 QuicStreamSequencerTest::ConsumeData(1000);
647 EXPECT_EQ(1500u, sequencer_->NumBytesConsumed());
648 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
649
650 // Received [1498, 1503).
651 QuicStreamFrame frame3(id, false, 1498, QuicStringPiece("hello"));
652 EXPECT_CALL(stream_, OnDataAvailable());
653 sequencer_->OnStreamFrame(frame3);
654 EXPECT_CALL(stream_, AddBytesConsumed(3));
655 QuicStreamSequencerTest::ConsumeData(3);
656 EXPECT_EQ(1503u, sequencer_->NumBytesConsumed());
657 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
658
659 // Received [1000, 1005).
660 QuicStreamFrame frame4(id, false, 1000, QuicStringPiece("hello"));
661 EXPECT_CALL(stream_, OnDataAvailable()).Times(0);
662 sequencer_->OnStreamFrame(frame4);
663 EXPECT_EQ(1503u, sequencer_->NumBytesConsumed());
664 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
665}
666
667TEST_F(QuicStreamSequencerTest, OnDataAvailableWhenReadableBytesIncrease) {
668 sequencer_->set_level_triggered(true);
669 QuicStreamId id = 1;
670
671 // Received [0, 5).
672 QuicStreamFrame frame1(id, false, 0, "hello");
673 EXPECT_CALL(stream_, OnDataAvailable());
674 sequencer_->OnStreamFrame(frame1);
675 EXPECT_EQ(5u, sequencer_->NumBytesBuffered());
676
677 // Without consuming the buffer bytes, continue receiving [5, 11).
678 QuicStreamFrame frame2(id, false, 5, " world");
679 // OnDataAvailable should still be called because there are more data to read.
680 EXPECT_CALL(stream_, OnDataAvailable());
681 sequencer_->OnStreamFrame(frame2);
682 EXPECT_EQ(11u, sequencer_->NumBytesBuffered());
683
684 // Without consuming the buffer bytes, continue receiving [12, 13).
685 QuicStreamFrame frame3(id, false, 5, "a");
686 // OnDataAvailable shouldn't be called becasue there are still only 11 bytes
687 // available.
688 EXPECT_CALL(stream_, OnDataAvailable()).Times(0);
689 sequencer_->OnStreamFrame(frame3);
690 EXPECT_EQ(11u, sequencer_->NumBytesBuffered());
691}
692
693TEST_F(QuicStreamSequencerTest, ReadSingleFrame) {
694 EXPECT_CALL(stream_, OnDataAvailable());
695 OnFrame(0u, "abc");
vasilvvc48c8712019-03-11 13:38:16 -0700696 std::string actual;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500697 EXPECT_CALL(stream_, AddBytesConsumed(3));
698 sequencer_->Read(&actual);
699 EXPECT_EQ("abc", actual);
700 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
701}
702
703TEST_F(QuicStreamSequencerTest, ReadMultipleFramesWithMissingFrame) {
704 EXPECT_CALL(stream_, OnDataAvailable());
705 OnFrame(0u, "abc");
706 OnFrame(3u, "def");
707 OnFrame(6u, "ghi");
708 OnFrame(10u, "xyz"); // Byte 9 is missing.
vasilvvc48c8712019-03-11 13:38:16 -0700709 std::string actual;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500710 EXPECT_CALL(stream_, AddBytesConsumed(9));
711 sequencer_->Read(&actual);
712 EXPECT_EQ("abcdefghi", actual);
713 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
714}
715
716TEST_F(QuicStreamSequencerTest, ReadAndAppendToString) {
717 EXPECT_CALL(stream_, OnDataAvailable());
718 OnFrame(0u, "def");
719 OnFrame(3u, "ghi");
vasilvvc48c8712019-03-11 13:38:16 -0700720 std::string actual = "abc";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500721 EXPECT_CALL(stream_, AddBytesConsumed(6));
722 sequencer_->Read(&actual);
723 EXPECT_EQ("abcdefghi", actual);
724 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
725}
726
727TEST_F(QuicStreamSequencerTest, StopReading) {
728 EXPECT_CALL(stream_, OnDataAvailable()).Times(0);
729 EXPECT_CALL(stream_, OnFinRead());
730
731 EXPECT_CALL(stream_, AddBytesConsumed(0));
732 sequencer_->StopReading();
733
734 EXPECT_CALL(stream_, AddBytesConsumed(3));
735 OnFrame(0u, "abc");
736 EXPECT_CALL(stream_, AddBytesConsumed(3));
737 OnFrame(3u, "def");
738 EXPECT_CALL(stream_, AddBytesConsumed(3));
739 OnFinFrame(6u, "ghi");
740}
741
742TEST_F(QuicStreamSequencerTest, StopReadingWithLevelTriggered) {
743 if (GetQuicReloadableFlag(quic_stop_reading_when_level_triggered)) {
744 EXPECT_CALL(stream_, AddBytesConsumed(0));
745 EXPECT_CALL(stream_, AddBytesConsumed(3)).Times(3);
746 EXPECT_CALL(stream_, OnDataAvailable()).Times(0);
747 EXPECT_CALL(stream_, OnFinRead());
748 } else {
749 EXPECT_CALL(stream_, AddBytesConsumed(0));
750 EXPECT_CALL(stream_, OnDataAvailable()).Times(3);
751 }
752
753 sequencer_->set_level_triggered(true);
754 sequencer_->StopReading();
755
756 OnFrame(0u, "abc");
757 OnFrame(3u, "def");
758 OnFinFrame(6u, "ghi");
759}
760
761} // namespace
762} // namespace test
763} // namespace quic