blob: 21568d6065371133b815b847553974a5334050d0 [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)
[email protected]48878092013-07-26 14:51:5635 : QuicStreamSequencer(max_mem, stream) {
36 }
[email protected]9c0b1352012-11-04 00:03:2737
[email protected]48878092013-07-26 14:51:5638 virtual bool OnFinFrame(QuicStreamOffset byte_offset,
39 const char* data) {
[email protected]9c0b1352012-11-04 00:03:2740 QuicStreamFrame frame;
41 frame.stream_id = 1;
42 frame.offset = byte_offset;
[email protected]48878092013-07-26 14:51:5643 frame.data = StringPiece(data);
44 frame.fin = true;
45 return OnStreamFrame(frame);
46 }
47
48 virtual bool OnFrame(QuicStreamOffset byte_offset,
49 const char* data) {
50 QuicStreamFrame frame;
51 frame.stream_id = 1;
52 frame.offset = byte_offset;
53 frame.data = StringPiece(data);
54 frame.fin = false;
[email protected]9c0b1352012-11-04 00:03:2755 return OnStreamFrame(frame);
56 }
57
58 void SetMemoryLimit(size_t limit) {
59 max_frame_memory_ = limit;
60 }
[email protected]2ff600a2012-11-11 19:22:1961 uint64 num_bytes_consumed() const { return num_bytes_consumed_; }
62 const FrameMap* frames() const { return &frames_; }
[email protected]2ff600a2012-11-11 19:22:1963 QuicStreamOffset close_offset() const { return close_offset_; }
[email protected]9c0b1352012-11-04 00:03:2764};
65
66class MockStream : public ReliableQuicStream {
67 public:
68 MockStream(QuicSession* session, QuicStreamId id)
69 : ReliableQuicStream(id, session) {
70 }
71
72 MOCK_METHOD1(TerminateFromPeer, void(bool half_close));
73 MOCK_METHOD2(ProcessData, uint32(const char* data, uint32 data_len));
[email protected]24e5bc52013-09-18 15:36:5874 MOCK_METHOD2(ConnectionClose, void(QuicErrorCode error, bool from_peer));
[email protected]74bda142013-03-31 02:49:1175 MOCK_METHOD1(Close, void(QuicRstStreamErrorCode error));
[email protected]a5d4eee22012-12-13 09:09:0176 MOCK_METHOD0(OnCanWrite, void());
[email protected]9c0b1352012-11-04 00:03:2777};
78
79namespace {
80
81static const char kPayload[] =
82 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
83
84class QuicStreamSequencerTest : public ::testing::Test {
85 protected:
86 QuicStreamSequencerTest()
87 : session_(NULL),
88 stream_(session_, 1),
89 sequencer_(new QuicStreamSequencerPeer(&stream_)) {
90 }
91
[email protected]c244c5a12013-05-07 20:55:0492 bool VerifyReadableRegions(const char** expected, size_t num_expected) {
93 iovec iovecs[5];
94 size_t num_iovecs = sequencer_->GetReadableRegions(iovecs,
95 arraysize(iovecs));
96 return VerifyIovecs(iovecs, num_iovecs, expected, num_expected);
97 }
98
99 bool VerifyIovecs(iovec* iovecs,
100 size_t num_iovecs,
101 const char** expected,
102 size_t num_expected) {
103 if (num_expected != num_iovecs) {
104 LOG(ERROR) << "Incorrect number of iovecs. Expected: "
105 << num_expected << " Actual: " << num_iovecs;
106 return false;
107 }
108 for (size_t i = 0; i < num_expected; ++i) {
109 if (!VerifyIovec(iovecs[i], expected[i])) {
110 return false;
111 }
112 }
113 return true;
114 }
115
116 bool VerifyIovec(const iovec& iovec, StringPiece expected) {
117 if (iovec.iov_len != expected.length()) {
118 LOG(ERROR) << "Invalid length: " << iovec.iov_len
119 << " vs " << expected.length();
120 return false;
121 }
122 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) {
123 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base)
124 << " vs " << expected.data();
125 return false;
126 }
127 return true;
128 }
129
[email protected]9c0b1352012-11-04 00:03:27130 QuicSession* session_;
131 testing::StrictMock<MockStream> stream_;
132 scoped_ptr<QuicStreamSequencerPeer> sequencer_;
133};
134
135TEST_F(QuicStreamSequencerTest, RejectOldFrame) {
136 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3))
137 .WillOnce(Return(3));
138
[email protected]48878092013-07-26 14:51:56139 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27140 EXPECT_EQ(0u, sequencer_->frames()->size());
141 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
[email protected]9db443912013-02-25 05:27:03142 // Ignore this - it matches a past sequence number and we should not see it
[email protected]9c0b1352012-11-04 00:03:27143 // again.
[email protected]48878092013-07-26 14:51:56144 EXPECT_TRUE(sequencer_->OnFrame(0, "def"));
[email protected]9c0b1352012-11-04 00:03:27145 EXPECT_EQ(0u, sequencer_->frames()->size());
146}
147
148TEST_F(QuicStreamSequencerTest, RejectOverlyLargeFrame) {
[email protected]6dcb5502013-07-27 23:55:09149 // TODO(rch): enable when chromium supports EXPECT_DFATAL.
[email protected]9c0b1352012-11-04 00:03:27150 /*
151 EXPECT_DFATAL(sequencer_.reset(new QuicStreamSequencerPeer(2, &stream_)),
152 "Setting max frame memory to 2. "
153 "Some frames will be impossible to handle.");
154
[email protected]48878092013-07-26 14:51:56155 EXPECT_DEBUG_DEATH(sequencer_->OnFrame(0, "abc"), "");
[email protected]9c0b1352012-11-04 00:03:27156 */
157}
158
159TEST_F(QuicStreamSequencerTest, DropFramePastBuffering) {
160 sequencer_->SetMemoryLimit(3);
161
[email protected]48878092013-07-26 14:51:56162 EXPECT_FALSE(sequencer_->OnFrame(3, "abc"));
[email protected]9c0b1352012-11-04 00:03:27163}
164
165TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) {
166 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3));
167
[email protected]48878092013-07-26 14:51:56168 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27169 EXPECT_EQ(1u, sequencer_->frames()->size());
170 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
171 // Ignore this - it matches a buffered frame.
172 // Right now there's no checking that the payload is consistent.
[email protected]48878092013-07-26 14:51:56173 EXPECT_TRUE(sequencer_->OnFrame(0, "def"));
[email protected]9c0b1352012-11-04 00:03:27174 EXPECT_EQ(1u, sequencer_->frames()->size());
175}
176
177TEST_F(QuicStreamSequencerTest, FullFrameConsumed) {
[email protected]044ac2b2012-11-13 21:41:06178 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
[email protected]9c0b1352012-11-04 00:03:27179
[email protected]48878092013-07-26 14:51:56180 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27181 EXPECT_EQ(0u, sequencer_->frames()->size());
182 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
183}
184
[email protected]48878092013-07-26 14:51:56185TEST_F(QuicStreamSequencerTest, EmptyFrame) {
[email protected]24e5bc52013-09-18 15:36:58186 EXPECT_CALL(stream_, ConnectionClose(QUIC_INVALID_STREAM_FRAME, false));
187 EXPECT_FALSE(sequencer_->OnFrame(0, ""));
[email protected]48878092013-07-26 14:51:56188 EXPECT_EQ(0u, sequencer_->frames()->size());
189 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
190}
191
192TEST_F(QuicStreamSequencerTest, EmptyFinFrame) {
193 EXPECT_CALL(stream_, TerminateFromPeer(true));
194 EXPECT_TRUE(sequencer_->OnFinFrame(0, ""));
195 EXPECT_EQ(0u, sequencer_->frames()->size());
196 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
197}
198
[email protected]9c0b1352012-11-04 00:03:27199TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) {
[email protected]044ac2b2012-11-13 21:41:06200 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(2));
[email protected]9c0b1352012-11-04 00:03:27201
[email protected]48878092013-07-26 14:51:56202 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27203 EXPECT_EQ(1u, sequencer_->frames()->size());
204 EXPECT_EQ(2u, sequencer_->num_bytes_consumed());
205 EXPECT_EQ("c", sequencer_->frames()->find(2)->second);
206}
207
208TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) {
[email protected]044ac2b2012-11-13 21:41:06209 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
[email protected]9c0b1352012-11-04 00:03:27210
[email protected]48878092013-07-26 14:51:56211 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27212 EXPECT_EQ(1u, sequencer_->frames()->size());
213 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
214 EXPECT_EQ("abc", sequencer_->frames()->find(0)->second);
215}
216
217TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) {
[email protected]48878092013-07-26 14:51:56218 EXPECT_TRUE(sequencer_->OnFrame(3, "abc"));
[email protected]9c0b1352012-11-04 00:03:27219 EXPECT_EQ(1u, sequencer_->frames()->size());
220 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
221 EXPECT_EQ("abc", sequencer_->frames()->find(3)->second);
222}
223
224TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) {
225 // Buffer the first
[email protected]48878092013-07-26 14:51:56226 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
[email protected]9c0b1352012-11-04 00:03:27227 EXPECT_EQ(1u, sequencer_->frames()->size());
228 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
229 // Buffer the second
[email protected]48878092013-07-26 14:51:56230 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
[email protected]9c0b1352012-11-04 00:03:27231 EXPECT_EQ(2u, sequencer_->frames()->size());
232 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
233
234 InSequence s;
235 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
236 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
237 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3));
238
239 // Ack right away
[email protected]48878092013-07-26 14:51:56240 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27241 EXPECT_EQ(9u, sequencer_->num_bytes_consumed());
242
243 EXPECT_EQ(0u, sequencer_->frames()->size());
244}
245
246TEST_F(QuicStreamSequencerTest, OutOfOrderFramesProcessedWithBuffering) {
247 sequencer_->SetMemoryLimit(9);
248
249 // Too far to buffer.
[email protected]48878092013-07-26 14:51:56250 EXPECT_FALSE(sequencer_->OnFrame(9, "jkl"));
[email protected]9c0b1352012-11-04 00:03:27251
252 // We can afford to buffer this.
[email protected]48878092013-07-26 14:51:56253 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
[email protected]9c0b1352012-11-04 00:03:27254 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
255
256 InSequence s;
257 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
258
259 // Ack right away
[email protected]48878092013-07-26 14:51:56260 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27261 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
262
263 // We should be willing to buffer this now.
[email protected]48878092013-07-26 14:51:56264 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl"));
[email protected]9c0b1352012-11-04 00:03:27265 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
266
267 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
268 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3));
269 EXPECT_CALL(stream_, ProcessData(StrEq("jkl"), 3)).WillOnce(Return(3));
270
[email protected]48878092013-07-26 14:51:56271 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
[email protected]9c0b1352012-11-04 00:03:27272 EXPECT_EQ(12u, sequencer_->num_bytes_consumed());
273 EXPECT_EQ(0u, sequencer_->frames()->size());
274}
275
[email protected]c244c5a12013-05-07 20:55:04276TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) {
277 sequencer_->SetMemoryLimit(9);
278 char buffer[20];
279 iovec iov[2];
280 iov[0].iov_base = &buffer[0];
281 iov[0].iov_len = 1;
282 iov[1].iov_base = &buffer[1];
283 iov[1].iov_len = 2;
284
285 // Push abc - process.
286 // Push jkl - buffer (not next data)
287 // Push def - don't process.
288 // Push mno - drop (too far out)
289 // Push ghi - buffer (def not processed)
290 // Read 2.
291 // Push mno - buffer (not all read)
292 // Read all
293 // Push pqr - process
294
295 InSequence s;
296 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
297 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0));
298 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3));
299
[email protected]48878092013-07-26 14:51:56300 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
301 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
302 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl"));
303 EXPECT_FALSE(sequencer_->OnFrame(12, "mno"));
304 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
[email protected]c244c5a12013-05-07 20:55:04305
306 // Read 3 bytes.
307 EXPECT_EQ(3, sequencer_->Readv(iov, 2));
308 EXPECT_EQ(0, strncmp(buffer, "def", 3));
309
310 // Now we have space to bufer this.
[email protected]48878092013-07-26 14:51:56311 EXPECT_TRUE(sequencer_->OnFrame(12, "mno"));
[email protected]c244c5a12013-05-07 20:55:04312
313 // Read the remaining 9 bytes.
314 iov[1].iov_len = 19;
315 EXPECT_EQ(9, sequencer_->Readv(iov, 2));
316 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9));
317
[email protected]48878092013-07-26 14:51:56318 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr"));
[email protected]c244c5a12013-05-07 20:55:04319}
320
321// Same as above, just using a different method for reading.
322TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) {
323 sequencer_->SetMemoryLimit(9);
324
325 InSequence s;
326 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
327 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0));
328 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3));
329
[email protected]48878092013-07-26 14:51:56330 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
331 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
332 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl"));
333 EXPECT_FALSE(sequencer_->OnFrame(12, "mno"));
334 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
[email protected]c244c5a12013-05-07 20:55:04335
336 // Read 3 bytes.
337 const char* expected[] = {"def", "ghi", "jkl"};
338 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
339 char buffer[9];
340 iovec read_iov = { &buffer[0], 3 };
341 ASSERT_EQ(3, sequencer_->Readv(&read_iov, 1));
342
343 // Now we have space to bufer this.
[email protected]48878092013-07-26 14:51:56344 EXPECT_TRUE(sequencer_->OnFrame(12, "mno"));
[email protected]c244c5a12013-05-07 20:55:04345
346 // Read the remaining 9 bytes.
347 const char* expected2[] = {"ghi", "jkl", "mno"};
348 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
349 read_iov.iov_len = 9;
350 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1));
351
[email protected]48878092013-07-26 14:51:56352 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr"));
[email protected]c244c5a12013-05-07 20:55:04353}
354
355// Same as above, just using a different method for reading.
356TEST_F(QuicStreamSequencerTest, MarkConsumed) {
357 sequencer_->SetMemoryLimit(9);
358
359 InSequence s;
360 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
361
[email protected]48878092013-07-26 14:51:56362 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
363 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
364 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
[email protected]c244c5a12013-05-07 20:55:04365
366 // Peek into the data.
367 const char* expected[] = {"abc", "def", "ghi"};
368 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
369
370 // Consume 1 byte.
371 sequencer_->MarkConsumed(1);
372 // Verify data.
373 const char* expected2[] = {"bc", "def", "ghi"};
374 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
375
376 // Consume 2 bytes.
377 sequencer_->MarkConsumed(2);
378 // Verify data.
379 const char* expected3[] = {"def", "ghi"};
380 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3)));
381
382 // Consume 5 bytes.
383 sequencer_->MarkConsumed(5);
384 // Verify data.
385 const char* expected4[] = {"i"};
386 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4)));
387}
388
[email protected]6dcb5502013-07-27 23:55:09389TEST_F(QuicStreamSequencerTest, MarkConsumedError) {
390 // TODO(rch): enable when chromium supports EXPECT_DFATAL.
391 /*
392 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
393
394 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
395 EXPECT_TRUE(sequencer_->OnFrame(9, "jklmnopqrstuvwxyz"));
396
397 // Peek into the data. Only the first chunk should be readable
398 // because of the missing data.
399 const char* expected[] = {"abc"};
400 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
401
402 // Now, attempt to mark consumed more data than was readable
403 // and expect the stream to be closed.
[email protected]24e5bc52013-09-18 15:36:58404 EXPECT_CALL(stream_, Close(QUIC_ERROR_PROCESSING_STREAM));
[email protected]6dcb5502013-07-27 23:55:09405 EXPECT_DFATAL(sequencer_->MarkConsumed(4),
406 "Invalid argument to MarkConsumed. num_bytes_consumed_: 3 "
407 "end_offset: 4 offset: 9 length: 17");
408 */
409}
410
411TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) {
412 InSequence s;
413 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
414
415 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
416 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
417 // Missing packet: 6, ghi
418 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl"));
419
420 const char* expected[] = {"abc", "def"};
421 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
422
423 sequencer_->MarkConsumed(6);
424}
425
[email protected]4e49b6a2013-06-18 16:39:28426TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) {
[email protected]9c0b1352012-11-04 00:03:27427 InSequence s;
428
429 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
[email protected]9c0b1352012-11-04 00:03:27430 EXPECT_CALL(stream_, TerminateFromPeer(true));
[email protected]48878092013-07-26 14:51:56431 EXPECT_TRUE(sequencer_->OnFinFrame(0, "abc"));
432
[email protected]9c0b1352012-11-04 00:03:27433 EXPECT_EQ(3u, sequencer_->close_offset());
434}
435
[email protected]4e49b6a2013-06-18 16:39:28436TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) {
[email protected]48878092013-07-26 14:51:56437 sequencer_->OnFinFrame(6, "");
[email protected]9c0b1352012-11-04 00:03:27438 EXPECT_EQ(6u, sequencer_->close_offset());
439 InSequence s;
440 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
441 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
442 EXPECT_CALL(stream_, TerminateFromPeer(true));
443
[email protected]48878092013-07-26 14:51:56444 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
445 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27446}
447
[email protected]9c0b1352012-11-04 00:03:27448TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) {
[email protected]48878092013-07-26 14:51:56449 sequencer_->OnFinFrame(3, "");
[email protected]9c0b1352012-11-04 00:03:27450 EXPECT_EQ(3u, sequencer_->close_offset());
451 InSequence s;
452 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
453 EXPECT_CALL(stream_, TerminateFromPeer(true));
454
[email protected]48878092013-07-26 14:51:56455 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]9c0b1352012-11-04 00:03:27456}
457
[email protected]c244c5a12013-05-07 20:55:04458TEST_F(QuicStreamSequencerTest, TerminateWithReadv) {
459 char buffer[3];
460
[email protected]48878092013-07-26 14:51:56461 sequencer_->OnFinFrame(3, "");
[email protected]c244c5a12013-05-07 20:55:04462 EXPECT_EQ(3u, sequencer_->close_offset());
463
464 EXPECT_FALSE(sequencer_->IsHalfClosed());
465
466 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
[email protected]48878092013-07-26 14:51:56467 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
[email protected]c244c5a12013-05-07 20:55:04468
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());
[email protected]c244c5a12013-05-07 20:55:04473}
474
[email protected]9c0b1352012-11-04 00:03:27475TEST_F(QuicStreamSequencerTest, MutipleOffsets) {
[email protected]48878092013-07-26 14:51:56476 sequencer_->OnFinFrame(3, "");
[email protected]9c0b1352012-11-04 00:03:27477 EXPECT_EQ(3u, sequencer_->close_offset());
478
479 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS));
[email protected]48878092013-07-26 14:51:56480 sequencer_->OnFinFrame(5, "");
[email protected]9c0b1352012-11-04 00:03:27481 EXPECT_EQ(3u, sequencer_->close_offset());
482
483 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS));
[email protected]48878092013-07-26 14:51:56484 sequencer_->OnFinFrame(1, "");
[email protected]9c0b1352012-11-04 00:03:27485 EXPECT_EQ(3u, sequencer_->close_offset());
486
[email protected]48878092013-07-26 14:51:56487 sequencer_->OnFinFrame(3, "");
[email protected]9c0b1352012-11-04 00:03:27488 EXPECT_EQ(3u, sequencer_->close_offset());
489}
490
491class QuicSequencerRandomTest : public QuicStreamSequencerTest {
492 public:
493 typedef pair<int, string> Frame;
494 typedef vector<Frame> FrameList;
495
496 void CreateFrames() {
497 int payload_size = arraysize(kPayload) - 1;
498 int remaining_payload = payload_size;
499 while (remaining_payload != 0) {
500 int size = min(OneToN(6), remaining_payload);
[email protected]044ac2b2012-11-13 21:41:06501 int index = payload_size - remaining_payload;
502 list_.push_back(make_pair(index, string(kPayload + index, size)));
[email protected]9c0b1352012-11-04 00:03:27503 remaining_payload -= size;
504 }
505 }
506
507 QuicSequencerRandomTest() {
[email protected]9c0b1352012-11-04 00:03:27508 CreateFrames();
509 }
510
511 int OneToN(int n) {
512 return base::RandInt(1, n);
513 }
514
515 int MaybeProcessMaybeBuffer(const char* data, uint32 len) {
516 int to_process = len;
517 if (base::RandUint64() % 2 != 0) {
518 to_process = base::RandInt(0, len);
519 }
520 output_.append(data, to_process);
[email protected]9c0b1352012-11-04 00:03:27521 return to_process;
522 }
523
524 string output_;
[email protected]9c0b1352012-11-04 00:03:27525 FrameList list_;
526};
527
528// All frames are processed as soon as we have sequential data.
529// Infinite buffering, so all frames are acked right away.
530TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) {
531 InSequence s;
532 for (size_t i = 0; i < list_.size(); ++i) {
533 string* data = &list_[i].second;
534 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size()))
535 .WillOnce(Return(data->size()));
536 }
537
538 while (list_.size() != 0) {
[email protected]044ac2b2012-11-13 21:41:06539 int index = OneToN(list_.size()) - 1;
540 LOG(ERROR) << "Sending index " << index << " "
541 << list_[index].second.data();
[email protected]48878092013-07-26 14:51:56542 EXPECT_TRUE(sequencer_->OnFrame(list_[index].first,
543 list_[index].second.data()));
544
[email protected]044ac2b2012-11-13 21:41:06545 list_.erase(list_.begin() + index);
[email protected]9c0b1352012-11-04 00:03:27546 }
547}
548
549// All frames are processed as soon as we have sequential data.
550// Buffering, so some frames are rejected.
551TEST_F(QuicSequencerRandomTest, RandomFramesDroppingNoBackup) {
552 sequencer_->SetMemoryLimit(26);
553
554 InSequence s;
555 for (size_t i = 0; i < list_.size(); ++i) {
556 string* data = &list_[i].second;
557 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size()))
558 .WillOnce(Return(data->size()));
559 }
560
561 while (list_.size() != 0) {
[email protected]044ac2b2012-11-13 21:41:06562 int index = OneToN(list_.size()) - 1;
563 LOG(ERROR) << "Sending index " << index << " "
564 << list_[index].second.data();
[email protected]48878092013-07-26 14:51:56565 bool acked = sequencer_->OnFrame(list_[index].first,
566 list_[index].second.data());
567
[email protected]9c0b1352012-11-04 00:03:27568 if (acked) {
[email protected]044ac2b2012-11-13 21:41:06569 list_.erase(list_.begin() + index);
[email protected]9c0b1352012-11-04 00:03:27570 }
571 }
572}
573
574} // namespace
[email protected]b1f287d2012-12-22 17:25:39575} // namespace test
[email protected]9c0b1352012-11-04 00:03:27576} // namespace net