blob: 3b0104e87fb6dbb6975c9d19682e9dfa5c729608 [file] [log] [blame]
[email protected]9c0b1352012-11-04 00:03:271// 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/quic/quic_stream_sequencer.h"
6
7#include <utility>
8#include <vector>
9
10#include "base/rand_util.h"
11#include "net/quic/reliable_quic_stream.h"
12#include "testing/gmock/include/gmock/gmock.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15using base::StringPiece;
16using std::min;
17using std::pair;
18using std::vector;
19using testing::_;
20using testing::AnyNumber;
21using testing::InSequence;
22using testing::Return;
23using testing::StrEq;
24
25namespace net {
[email protected]b1f287d2012-12-22 17:25:3926namespace test {
[email protected]9c0b1352012-11-04 00:03:2727
28class QuicStreamSequencerPeer : public QuicStreamSequencer {
29 public:
30 explicit QuicStreamSequencerPeer(ReliableQuicStream* stream)
31 : QuicStreamSequencer(stream) {
32 }
33
34 QuicStreamSequencerPeer(int32 max_mem, ReliableQuicStream* stream)
35 : QuicStreamSequencer(max_mem, stream) {}
36
37 virtual bool OnFrame(QuicStreamOffset byte_offset,
[email protected]044ac2b2012-11-13 21:41:0638 const char* data,
39 uint32 data_len) {
[email protected]9c0b1352012-11-04 00:03:2740 QuicStreamFrame frame;
41 frame.stream_id = 1;
42 frame.offset = byte_offset;
43 frame.data = StringPiece(data, data_len);
44 return OnStreamFrame(frame);
45 }
46
47 void SetMemoryLimit(size_t limit) {
48 max_frame_memory_ = limit;
49 }
50
[email protected]2ff600a2012-11-11 19:22:1951 const ReliableQuicStream* stream() const { return stream_; }
52 uint64 num_bytes_consumed() const { return num_bytes_consumed_; }
53 const FrameMap* frames() const { return &frames_; }
54 int32 max_frame_memory() const { return max_frame_memory_; }
55 QuicStreamOffset close_offset() const { return close_offset_; }
[email protected]9c0b1352012-11-04 00:03:2756};
57
58class MockStream : public ReliableQuicStream {
59 public:
60 MockStream(QuicSession* session, QuicStreamId id)
61 : ReliableQuicStream(id, session) {
62 }
63
64 MOCK_METHOD1(TerminateFromPeer, void(bool half_close));
65 MOCK_METHOD2(ProcessData, uint32(const char* data, uint32 data_len));
[email protected]74bda142013-03-31 02:49:1166 MOCK_METHOD1(Close, void(QuicRstStreamErrorCode error));
[email protected]a5d4eee22012-12-13 09:09:0167 MOCK_METHOD0(OnCanWrite, void());
[email protected]9c0b1352012-11-04 00:03:2768};
69
70namespace {
71
72static const char kPayload[] =
73 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
74
75class QuicStreamSequencerTest : public ::testing::Test {
76 protected:
77 QuicStreamSequencerTest()
78 : session_(NULL),
79 stream_(session_, 1),
80 sequencer_(new QuicStreamSequencerPeer(&stream_)) {
81 }
82
[email protected]c244c5a12013-05-07 20:55:0483 bool VerifyReadableRegions(const char** expected, size_t num_expected) {
84 iovec iovecs[5];
85 size_t num_iovecs = sequencer_->GetReadableRegions(iovecs,
86 arraysize(iovecs));
87 return VerifyIovecs(iovecs, num_iovecs, expected, num_expected);
88 }
89
90 bool VerifyIovecs(iovec* iovecs,
91 size_t num_iovecs,
92 const char** expected,
93 size_t num_expected) {
94 if (num_expected != num_iovecs) {
95 LOG(ERROR) << "Incorrect number of iovecs. Expected: "
96 << num_expected << " Actual: " << num_iovecs;
97 return false;
98 }
99 for (size_t i = 0; i < num_expected; ++i) {
100 if (!VerifyIovec(iovecs[i], expected[i])) {
101 return false;
102 }
103 }
104 return true;
105 }
106
107 bool VerifyIovec(const iovec& iovec, StringPiece expected) {
108 if (iovec.iov_len != expected.length()) {
109 LOG(ERROR) << "Invalid length: " << iovec.iov_len
110 << " vs " << expected.length();
111 return false;
112 }
113 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) {
114 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base)
115 << " vs " << expected.data();
116 return false;
117 }
118 return true;
119 }
120
[email protected]9c0b1352012-11-04 00:03:27121 QuicSession* session_;
122 testing::StrictMock<MockStream> stream_;
123 scoped_ptr<QuicStreamSequencerPeer> sequencer_;
124};
125
126TEST_F(QuicStreamSequencerTest, RejectOldFrame) {
127 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3))
128 .WillOnce(Return(3));
129
130 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
131 EXPECT_EQ(0u, sequencer_->frames()->size());
132 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
[email protected]9db443912013-02-25 05:27:03133 // Ignore this - it matches a past sequence number and we should not see it
[email protected]9c0b1352012-11-04 00:03:27134 // again.
[email protected]9db443912013-02-25 05:27:03135 EXPECT_TRUE(sequencer_->OnFrame(0, "def", 3));
[email protected]9c0b1352012-11-04 00:03:27136 EXPECT_EQ(0u, sequencer_->frames()->size());
137}
138
139TEST_F(QuicStreamSequencerTest, RejectOverlyLargeFrame) {
140 /*
141 EXPECT_DFATAL(sequencer_.reset(new QuicStreamSequencerPeer(2, &stream_)),
142 "Setting max frame memory to 2. "
143 "Some frames will be impossible to handle.");
144
145 EXPECT_DEBUG_DEATH(sequencer_->OnFrame(0, "abc", 3), "");
146 */
147}
148
149TEST_F(QuicStreamSequencerTest, DropFramePastBuffering) {
150 sequencer_->SetMemoryLimit(3);
151
152 EXPECT_FALSE(sequencer_->OnFrame(3, "abc", 3));
153}
154
155TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) {
156 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3));
157
158 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
159 EXPECT_EQ(1u, sequencer_->frames()->size());
160 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
161 // Ignore this - it matches a buffered frame.
162 // Right now there's no checking that the payload is consistent.
[email protected]9db443912013-02-25 05:27:03163 EXPECT_TRUE(sequencer_->OnFrame(0, "def", 3));
[email protected]9c0b1352012-11-04 00:03:27164 EXPECT_EQ(1u, sequencer_->frames()->size());
165}
166
167TEST_F(QuicStreamSequencerTest, FullFrameConsumed) {
[email protected]044ac2b2012-11-13 21:41:06168 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
[email protected]9c0b1352012-11-04 00:03:27169
170 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
171 EXPECT_EQ(0u, sequencer_->frames()->size());
172 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
173}
174
175TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) {
[email protected]044ac2b2012-11-13 21:41:06176 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(2));
[email protected]9c0b1352012-11-04 00:03:27177
178 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
179 EXPECT_EQ(1u, sequencer_->frames()->size());
180 EXPECT_EQ(2u, sequencer_->num_bytes_consumed());
181 EXPECT_EQ("c", sequencer_->frames()->find(2)->second);
182}
183
184TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) {
[email protected]044ac2b2012-11-13 21:41:06185 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
[email protected]9c0b1352012-11-04 00:03:27186
187 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
188 EXPECT_EQ(1u, sequencer_->frames()->size());
189 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
190 EXPECT_EQ("abc", sequencer_->frames()->find(0)->second);
191}
192
193TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) {
194 EXPECT_TRUE(sequencer_->OnFrame(3, "abc", 3));
195 EXPECT_EQ(1u, sequencer_->frames()->size());
196 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
197 EXPECT_EQ("abc", sequencer_->frames()->find(3)->second);
198}
199
200TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) {
201 // Buffer the first
202 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3));
203 EXPECT_EQ(1u, sequencer_->frames()->size());
204 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
205 // Buffer the second
206 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
207 EXPECT_EQ(2u, sequencer_->frames()->size());
208 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
209
210 InSequence s;
211 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
212 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
213 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3));
214
215 // Ack right away
216 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
217 EXPECT_EQ(9u, sequencer_->num_bytes_consumed());
218
219 EXPECT_EQ(0u, sequencer_->frames()->size());
220}
221
222TEST_F(QuicStreamSequencerTest, OutOfOrderFramesProcessedWithBuffering) {
223 sequencer_->SetMemoryLimit(9);
224
225 // Too far to buffer.
226 EXPECT_FALSE(sequencer_->OnFrame(9, "jkl", 3));
227
228 // We can afford to buffer this.
229 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3));
230 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
231
232 InSequence s;
233 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
234
235 // Ack right away
236 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
237 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
238
239 // We should be willing to buffer this now.
240 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl", 3));
241 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
242
243 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
244 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3));
245 EXPECT_CALL(stream_, ProcessData(StrEq("jkl"), 3)).WillOnce(Return(3));
246
247 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
248 EXPECT_EQ(12u, sequencer_->num_bytes_consumed());
249 EXPECT_EQ(0u, sequencer_->frames()->size());
250}
251
[email protected]c244c5a12013-05-07 20:55:04252TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) {
253 sequencer_->SetMemoryLimit(9);
254 char buffer[20];
255 iovec iov[2];
256 iov[0].iov_base = &buffer[0];
257 iov[0].iov_len = 1;
258 iov[1].iov_base = &buffer[1];
259 iov[1].iov_len = 2;
260
261 // Push abc - process.
262 // Push jkl - buffer (not next data)
263 // Push def - don't process.
264 // Push mno - drop (too far out)
265 // Push ghi - buffer (def not processed)
266 // Read 2.
267 // Push mno - buffer (not all read)
268 // Read all
269 // Push pqr - process
270
271 InSequence s;
272 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
273 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0));
274 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3));
275
276 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
277 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
278 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl", 3));
279 EXPECT_FALSE(sequencer_->OnFrame(12, "mno", 3));
280 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3));
281
282 // Read 3 bytes.
283 EXPECT_EQ(3, sequencer_->Readv(iov, 2));
284 EXPECT_EQ(0, strncmp(buffer, "def", 3));
285
286 // Now we have space to bufer this.
287 EXPECT_TRUE(sequencer_->OnFrame(12, "mno", 3));
288
289 // Read the remaining 9 bytes.
290 iov[1].iov_len = 19;
291 EXPECT_EQ(9, sequencer_->Readv(iov, 2));
292 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9));
293
294 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr", 3));
295}
296
297// Same as above, just using a different method for reading.
298TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) {
299 sequencer_->SetMemoryLimit(9);
300
301 InSequence s;
302 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
303 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0));
304 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3));
305
306 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
307 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
308 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl", 3));
309 EXPECT_FALSE(sequencer_->OnFrame(12, "mno", 3));
310 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3));
311
312 // Read 3 bytes.
313 const char* expected[] = {"def", "ghi", "jkl"};
314 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
315 char buffer[9];
316 iovec read_iov = { &buffer[0], 3 };
317 ASSERT_EQ(3, sequencer_->Readv(&read_iov, 1));
318
319 // Now we have space to bufer this.
320 EXPECT_TRUE(sequencer_->OnFrame(12, "mno", 3));
321
322 // Read the remaining 9 bytes.
323 const char* expected2[] = {"ghi", "jkl", "mno"};
324 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
325 read_iov.iov_len = 9;
326 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1));
327
328 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr", 3));
329}
330
331// Same as above, just using a different method for reading.
332TEST_F(QuicStreamSequencerTest, MarkConsumed) {
333 sequencer_->SetMemoryLimit(9);
334
335 InSequence s;
336 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
337
338 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
339 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
340 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3));
341
342 // Peek into the data.
343 const char* expected[] = {"abc", "def", "ghi"};
344 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
345
346 // Consume 1 byte.
347 sequencer_->MarkConsumed(1);
348 // Verify data.
349 const char* expected2[] = {"bc", "def", "ghi"};
350 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
351
352 // Consume 2 bytes.
353 sequencer_->MarkConsumed(2);
354 // Verify data.
355 const char* expected3[] = {"def", "ghi"};
356 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3)));
357
358 // Consume 5 bytes.
359 sequencer_->MarkConsumed(5);
360 // Verify data.
361 const char* expected4[] = {"i"};
362 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4)));
363}
364
[email protected]9c0b1352012-11-04 00:03:27365TEST_F(QuicStreamSequencerTest, BasicCloseOrdered) {
366 InSequence s;
367 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
368 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
369
370 EXPECT_CALL(stream_, TerminateFromPeer(false));
371 sequencer_->CloseStreamAtOffset(3, false);
372 EXPECT_EQ(3u, sequencer_->close_offset());
373}
374
375TEST_F(QuicStreamSequencerTest, BasicHalfOrdered) {
376 InSequence s;
377
378 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
379 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
380
381 EXPECT_CALL(stream_, TerminateFromPeer(true));
382 sequencer_->CloseStreamAtOffset(3, true);
383 EXPECT_EQ(3u, sequencer_->close_offset());
384}
385
386TEST_F(QuicStreamSequencerTest, BasicCloseUnordered) {
387 sequencer_->CloseStreamAtOffset(3, false);
388 EXPECT_EQ(3u, sequencer_->close_offset());
389
390 InSequence s;
391 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
392 EXPECT_CALL(stream_, TerminateFromPeer(false));
393
394 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
395}
396
397TEST_F(QuicStreamSequencerTest, BasicHalfUnorderedWithFlush) {
398 sequencer_->CloseStreamAtOffset(6, true);
399 EXPECT_EQ(6u, sequencer_->close_offset());
400 InSequence s;
401 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
402 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
403 EXPECT_CALL(stream_, TerminateFromPeer(true));
404
405 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
406 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
407}
408
409TEST_F(QuicStreamSequencerTest, BasicCloseUnorderedWithFlush) {
410 sequencer_->CloseStreamAtOffset(6, false);
411 EXPECT_EQ(6u, sequencer_->close_offset());
412
413 InSequence s;
414 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
415 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
416 EXPECT_CALL(stream_, TerminateFromPeer(false));
417
418 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3));
419 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
420}
421
422TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) {
423 sequencer_->CloseStreamAtOffset(3, true);
424 EXPECT_EQ(3u, sequencer_->close_offset());
425 InSequence s;
426 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
427 EXPECT_CALL(stream_, TerminateFromPeer(true));
428
429 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
430}
431
[email protected]044ac2b2012-11-13 21:41:06432TEST_F(QuicStreamSequencerTest, TerminateStreamBeforeCloseEqual) {
[email protected]9c0b1352012-11-04 00:03:27433 sequencer_->CloseStreamAtOffset(3, true);
434 EXPECT_EQ(3u, sequencer_->close_offset());
435
436 sequencer_->CloseStreamAtOffset(3, false);
437 EXPECT_EQ(3u, sequencer_->close_offset());
438
439 InSequence s;
440 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
441 EXPECT_CALL(stream_, TerminateFromPeer(false));
442 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
443}
444
445TEST_F(QuicStreamSequencerTest, CloseBeforeTermianteEqual) {
446 sequencer_->CloseStreamAtOffset(3, false);
447 EXPECT_EQ(3u, sequencer_->close_offset());
448
449 sequencer_->CloseStreamAtOffset(3, true);
450 EXPECT_EQ(3u, sequencer_->close_offset());
451
452 InSequence s;
453 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
454 EXPECT_CALL(stream_, TerminateFromPeer(false));
455 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
456}
457
[email protected]c244c5a12013-05-07 20:55:04458TEST_F(QuicStreamSequencerTest, TerminateWithReadv) {
459 char buffer[3];
460
461 sequencer_->CloseStreamAtOffset(3, true);
462 EXPECT_EQ(3u, sequencer_->close_offset());
463
464 EXPECT_FALSE(sequencer_->IsHalfClosed());
465
466 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
467 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
468
469 iovec iov = { &buffer[0], 3 };
470 int bytes_read = sequencer_->Readv(&iov, 1);
471 EXPECT_EQ(3, bytes_read);
472 EXPECT_TRUE(sequencer_->IsHalfClosed());
473 EXPECT_FALSE(sequencer_->IsClosed());
474}
475
476TEST_F(QuicStreamSequencerTest, CloseWithReadv) {
477 char buffer[3];
478
479 sequencer_->CloseStreamAtOffset(3, false);
480 EXPECT_EQ(3u, sequencer_->close_offset());
481
482 EXPECT_FALSE(sequencer_->IsClosed());
483
484 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
485 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3));
486
487 iovec iov = { &buffer[0], 3 };
488 int bytes_read = sequencer_->Readv(&iov, 1);
489 EXPECT_EQ(3, bytes_read);
490 EXPECT_TRUE(sequencer_->IsHalfClosed());
491 EXPECT_TRUE(sequencer_->IsClosed());
492}
493
[email protected]9c0b1352012-11-04 00:03:27494TEST_F(QuicStreamSequencerTest, MutipleOffsets) {
495 sequencer_->CloseStreamAtOffset(3, false);
496 EXPECT_EQ(3u, sequencer_->close_offset());
497
498 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS));
499 sequencer_->CloseStreamAtOffset(5, false);
500 EXPECT_EQ(3u, sequencer_->close_offset());
501
502 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS));
503 sequencer_->CloseStreamAtOffset(1, false);
504 EXPECT_EQ(3u, sequencer_->close_offset());
505
506 sequencer_->CloseStreamAtOffset(3, false);
507 EXPECT_EQ(3u, sequencer_->close_offset());
508}
509
510class QuicSequencerRandomTest : public QuicStreamSequencerTest {
511 public:
512 typedef pair<int, string> Frame;
513 typedef vector<Frame> FrameList;
514
515 void CreateFrames() {
516 int payload_size = arraysize(kPayload) - 1;
517 int remaining_payload = payload_size;
518 while (remaining_payload != 0) {
519 int size = min(OneToN(6), remaining_payload);
[email protected]044ac2b2012-11-13 21:41:06520 int index = payload_size - remaining_payload;
521 list_.push_back(make_pair(index, string(kPayload + index, size)));
[email protected]9c0b1352012-11-04 00:03:27522 remaining_payload -= size;
523 }
524 }
525
526 QuicSequencerRandomTest() {
[email protected]9c0b1352012-11-04 00:03:27527 CreateFrames();
528 }
529
530 int OneToN(int n) {
531 return base::RandInt(1, n);
532 }
533
534 int MaybeProcessMaybeBuffer(const char* data, uint32 len) {
535 int to_process = len;
536 if (base::RandUint64() % 2 != 0) {
537 to_process = base::RandInt(0, len);
538 }
539 output_.append(data, to_process);
[email protected]9c0b1352012-11-04 00:03:27540 return to_process;
541 }
542
543 string output_;
[email protected]9c0b1352012-11-04 00:03:27544 FrameList list_;
545};
546
547// All frames are processed as soon as we have sequential data.
548// Infinite buffering, so all frames are acked right away.
549TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) {
550 InSequence s;
551 for (size_t i = 0; i < list_.size(); ++i) {
552 string* data = &list_[i].second;
553 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size()))
554 .WillOnce(Return(data->size()));
555 }
556
557 while (list_.size() != 0) {
[email protected]044ac2b2012-11-13 21:41:06558 int index = OneToN(list_.size()) - 1;
559 LOG(ERROR) << "Sending index " << index << " "
560 << list_[index].second.data();
[email protected]9c0b1352012-11-04 00:03:27561 EXPECT_TRUE(sequencer_->OnFrame(
[email protected]044ac2b2012-11-13 21:41:06562 list_[index].first, list_[index].second.data(),
563 list_[index].second.size()));
564 list_.erase(list_.begin() + index);
[email protected]9c0b1352012-11-04 00:03:27565 }
566}
567
568// All frames are processed as soon as we have sequential data.
569// Buffering, so some frames are rejected.
570TEST_F(QuicSequencerRandomTest, RandomFramesDroppingNoBackup) {
571 sequencer_->SetMemoryLimit(26);
572
573 InSequence s;
574 for (size_t i = 0; i < list_.size(); ++i) {
575 string* data = &list_[i].second;
576 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size()))
577 .WillOnce(Return(data->size()));
578 }
579
580 while (list_.size() != 0) {
[email protected]044ac2b2012-11-13 21:41:06581 int index = OneToN(list_.size()) - 1;
582 LOG(ERROR) << "Sending index " << index << " "
583 << list_[index].second.data();
[email protected]9c0b1352012-11-04 00:03:27584 bool acked = sequencer_->OnFrame(
[email protected]044ac2b2012-11-13 21:41:06585 list_[index].first, list_[index].second.data(),
586 list_[index].second.size());
[email protected]9c0b1352012-11-04 00:03:27587 if (acked) {
[email protected]044ac2b2012-11-13 21:41:06588 list_.erase(list_.begin() + index);
[email protected]9c0b1352012-11-04 00:03:27589 }
590 }
591}
592
593} // namespace
[email protected]b1f287d2012-12-22 17:25:39594} // namespace test
[email protected]9c0b1352012-11-04 00:03:27595} // namespace net