Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: net/quic/quic_packet_generator_test.cc

Issue 992733002: Remove //net (except for Android test stuff) and sdch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_packet_generator.cc ('k') | net/quic/quic_packet_writer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // 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_packet_generator.h"
6
7 #include <string>
8
9 #include "net/quic/crypto/crypto_protocol.h"
10 #include "net/quic/crypto/null_encrypter.h"
11 #include "net/quic/crypto/quic_decrypter.h"
12 #include "net/quic/crypto/quic_encrypter.h"
13 #include "net/quic/quic_flags.h"
14 #include "net/quic/quic_utils.h"
15 #include "net/quic/test_tools/quic_packet_creator_peer.h"
16 #include "net/quic/test_tools/quic_packet_generator_peer.h"
17 #include "net/quic/test_tools/quic_test_utils.h"
18 #include "net/quic/test_tools/simple_quic_framer.h"
19 #include "net/test/gtest_util.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22
23 using base::StringPiece;
24 using std::string;
25 using testing::InSequence;
26 using testing::Return;
27 using testing::SaveArg;
28 using testing::StrictMock;
29 using testing::_;
30
31 namespace net {
32 namespace test {
33 namespace {
34
35 const int64 kMinFecTimeoutMs = 5u;
36
37 class MockDelegate : public QuicPacketGenerator::DelegateInterface {
38 public:
39 MockDelegate() {}
40 ~MockDelegate() override {}
41
42 MOCK_METHOD3(ShouldGeneratePacket,
43 bool(TransmissionType transmission_type,
44 HasRetransmittableData retransmittable,
45 IsHandshake handshake));
46 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*));
47 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*));
48 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet));
49 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool));
50
51 void SetCanWriteAnything() {
52 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
53 .WillRepeatedly(Return(true));
54 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
55 NO_RETRANSMITTABLE_DATA, _))
56 .WillRepeatedly(Return(true));
57 }
58
59 void SetCanNotWrite() {
60 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
61 .WillRepeatedly(Return(false));
62 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
63 NO_RETRANSMITTABLE_DATA, _))
64 .WillRepeatedly(Return(false));
65 }
66
67 // Use this when only ack frames should be allowed to be written.
68 void SetCanWriteOnlyNonRetransmittable() {
69 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
70 .WillRepeatedly(Return(false));
71 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
72 NO_RETRANSMITTABLE_DATA, _))
73 .WillRepeatedly(Return(true));
74 }
75
76 private:
77 DISALLOW_COPY_AND_ASSIGN(MockDelegate);
78 };
79
80 // Simple struct for describing the contents of a packet.
81 // Useful in conjunction with a SimpleQuicFrame for validating that a packet
82 // contains the expected frames.
83 struct PacketContents {
84 PacketContents()
85 : num_ack_frames(0),
86 num_connection_close_frames(0),
87 num_goaway_frames(0),
88 num_rst_stream_frames(0),
89 num_stop_waiting_frames(0),
90 num_stream_frames(0),
91 fec_group(0) {
92 }
93
94 size_t num_ack_frames;
95 size_t num_connection_close_frames;
96 size_t num_goaway_frames;
97 size_t num_rst_stream_frames;
98 size_t num_stop_waiting_frames;
99 size_t num_stream_frames;
100
101 QuicFecGroupNumber fec_group;
102 };
103
104 } // namespace
105
106 class QuicPacketGeneratorTest : public ::testing::Test {
107 protected:
108 QuicPacketGeneratorTest()
109 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false),
110 generator_(42, &framer_, &random_, &delegate_),
111 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)),
112 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
113 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
114 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
115 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
116 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
117 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
118 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
119 packet8_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {}
120
121 ~QuicPacketGeneratorTest() override {
122 delete packet_.packet;
123 delete packet_.retransmittable_frames;
124 delete packet2_.packet;
125 delete packet2_.retransmittable_frames;
126 delete packet3_.packet;
127 delete packet3_.retransmittable_frames;
128 delete packet4_.packet;
129 delete packet4_.retransmittable_frames;
130 delete packet5_.packet;
131 delete packet5_.retransmittable_frames;
132 delete packet6_.packet;
133 delete packet6_.retransmittable_frames;
134 delete packet7_.packet;
135 delete packet7_.retransmittable_frames;
136 delete packet8_.packet;
137 delete packet8_.retransmittable_frames;
138 }
139
140 QuicRstStreamFrame* CreateRstStreamFrame() {
141 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0);
142 }
143
144 QuicGoAwayFrame* CreateGoAwayFrame() {
145 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string());
146 }
147
148 void CheckPacketContains(const PacketContents& contents,
149 const SerializedPacket& packet) {
150 size_t num_retransmittable_frames = contents.num_connection_close_frames +
151 contents.num_goaway_frames + contents.num_rst_stream_frames +
152 contents.num_stream_frames;
153 size_t num_frames = contents.num_ack_frames +
154 contents.num_stop_waiting_frames +
155 num_retransmittable_frames;
156
157 if (num_retransmittable_frames == 0) {
158 ASSERT_TRUE(packet.retransmittable_frames == nullptr);
159 } else {
160 ASSERT_TRUE(packet.retransmittable_frames != nullptr);
161 EXPECT_EQ(num_retransmittable_frames,
162 packet.retransmittable_frames->frames().size());
163 }
164
165 ASSERT_TRUE(packet.packet != nullptr);
166 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet));
167 EXPECT_EQ(num_frames, simple_framer_.num_frames());
168 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
169 EXPECT_EQ(contents.num_connection_close_frames,
170 simple_framer_.connection_close_frames().size());
171 EXPECT_EQ(contents.num_goaway_frames,
172 simple_framer_.goaway_frames().size());
173 EXPECT_EQ(contents.num_rst_stream_frames,
174 simple_framer_.rst_stream_frames().size());
175 EXPECT_EQ(contents.num_stream_frames,
176 simple_framer_.stream_frames().size());
177 EXPECT_EQ(contents.num_stop_waiting_frames,
178 simple_framer_.stop_waiting_frames().size());
179 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group);
180 }
181
182 void CheckPacketHasSingleStreamFrame(const SerializedPacket& packet) {
183 ASSERT_TRUE(packet.retransmittable_frames != nullptr);
184 EXPECT_EQ(1u, packet.retransmittable_frames->frames().size());
185 ASSERT_TRUE(packet.packet != nullptr);
186 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet));
187 EXPECT_EQ(1u, simple_framer_.num_frames());
188 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
189 }
190
191 void CheckPacketIsFec(const SerializedPacket& packet,
192 QuicPacketSequenceNumber fec_group) {
193 ASSERT_TRUE(packet.retransmittable_frames == nullptr);
194 ASSERT_TRUE(packet.packet != nullptr);
195 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet));
196 EXPECT_TRUE(simple_framer_.header().fec_flag);
197 EXPECT_EQ(fec_group, simple_framer_.fec_data().fec_group);
198 }
199
200 IOVector CreateData(size_t len) {
201 data_array_.reset(new char[len]);
202 memset(data_array_.get(), '?', len);
203 IOVector data;
204 data.Append(data_array_.get(), len);
205 return data;
206 }
207
208 QuicFramer framer_;
209 MockRandom random_;
210 StrictMock<MockDelegate> delegate_;
211 QuicPacketGenerator generator_;
212 QuicPacketCreator* creator_;
213 SimpleQuicFramer simple_framer_;
214 SerializedPacket packet_;
215 SerializedPacket packet2_;
216 SerializedPacket packet3_;
217 SerializedPacket packet4_;
218 SerializedPacket packet5_;
219 SerializedPacket packet6_;
220 SerializedPacket packet7_;
221 SerializedPacket packet8_;
222
223 private:
224 scoped_ptr<char[]> data_array_;
225 };
226
227 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate {
228 public:
229 MOCK_METHOD1(OnFrameAddedToPacket,
230 void(const QuicFrame&));
231 };
232
233 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) {
234 delegate_.SetCanNotWrite();
235
236 generator_.SetShouldSendAck(false);
237 EXPECT_TRUE(generator_.HasQueuedFrames());
238 }
239
240 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) {
241 StrictMock<MockDebugDelegate> debug_delegate;
242
243 generator_.set_debug_delegate(&debug_delegate);
244 delegate_.SetCanWriteOnlyNonRetransmittable();
245 generator_.StartBatchOperations();
246
247 EXPECT_CALL(delegate_, PopulateAckFrame(_));
248 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1);
249
250 generator_.SetShouldSendAck(false);
251 EXPECT_TRUE(generator_.HasQueuedFrames());
252 }
253
254 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) {
255 delegate_.SetCanWriteOnlyNonRetransmittable();
256
257 EXPECT_CALL(delegate_, PopulateAckFrame(_));
258 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
259
260 generator_.SetShouldSendAck(false);
261 EXPECT_FALSE(generator_.HasQueuedFrames());
262
263 PacketContents contents;
264 contents.num_ack_frames = 1;
265 CheckPacketContains(contents, packet_);
266 }
267
268 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) {
269 // Make sure that calling SetShouldSendAck multiple times does not result in a
270 // crash. Previously this would result in multiple QuicFrames queued in the
271 // packet generator, with all but the last with internal pointers to freed
272 // memory.
273 delegate_.SetCanWriteAnything();
274
275 // Only one AckFrame should be created.
276 EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1);
277 EXPECT_CALL(delegate_, OnSerializedPacket(_))
278 .Times(1)
279 .WillOnce(SaveArg<0>(&packet_));
280
281 generator_.StartBatchOperations();
282 generator_.SetShouldSendAck(false);
283 generator_.SetShouldSendAck(false);
284 generator_.FinishBatchOperations();
285 }
286
287 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) {
288 delegate_.SetCanNotWrite();
289
290 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
291 EXPECT_TRUE(generator_.HasQueuedFrames());
292 }
293
294 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) {
295 delegate_.SetCanWriteOnlyNonRetransmittable();
296
297 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
298 EXPECT_TRUE(generator_.HasQueuedFrames());
299 }
300
301 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) {
302 delegate_.SetCanWriteAnything();
303 generator_.StartBatchOperations();
304
305 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
306 EXPECT_TRUE(generator_.HasQueuedFrames());
307 }
308
309 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) {
310 delegate_.SetCanNotWrite();
311 generator_.StartBatchOperations();
312
313 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
314 EXPECT_TRUE(generator_.HasQueuedFrames());
315 generator_.FinishBatchOperations();
316 EXPECT_TRUE(generator_.HasQueuedFrames());
317
318 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
319 generator_.FlushAllQueuedFrames();
320 EXPECT_FALSE(generator_.HasQueuedFrames());
321
322 PacketContents contents;
323 contents.num_rst_stream_frames = 1;
324 CheckPacketContains(contents, packet_);
325 }
326
327 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) {
328 delegate_.SetCanWriteAnything();
329
330 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
331
332 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
333 EXPECT_FALSE(generator_.HasQueuedFrames());
334
335 PacketContents contents;
336 contents.num_rst_stream_frames = 1;
337 CheckPacketContains(contents, packet_);
338 }
339
340 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) {
341 delegate_.SetCanNotWrite();
342
343 QuicConsumedData consumed = generator_.ConsumeData(
344 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr);
345 EXPECT_EQ(0u, consumed.bytes_consumed);
346 EXPECT_FALSE(consumed.fin_consumed);
347 EXPECT_FALSE(generator_.HasQueuedFrames());
348 }
349
350 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) {
351 delegate_.SetCanWriteAnything();
352 generator_.StartBatchOperations();
353
354 QuicConsumedData consumed = generator_.ConsumeData(
355 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr);
356 EXPECT_EQ(3u, consumed.bytes_consumed);
357 EXPECT_TRUE(consumed.fin_consumed);
358 EXPECT_TRUE(generator_.HasQueuedFrames());
359 }
360
361 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) {
362 delegate_.SetCanWriteAnything();
363
364 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
365 QuicConsumedData consumed = generator_.ConsumeData(
366 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr);
367 EXPECT_EQ(3u, consumed.bytes_consumed);
368 EXPECT_TRUE(consumed.fin_consumed);
369 EXPECT_FALSE(generator_.HasQueuedFrames());
370
371 PacketContents contents;
372 contents.num_stream_frames = 1;
373 CheckPacketContains(contents, packet_);
374 }
375
376 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) {
377 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0,
378 false, MAY_FEC_PROTECT, nullptr),
379 "Attempt to consume empty data without FIN.");
380 }
381
382 TEST_F(QuicPacketGeneratorTest,
383 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
384 delegate_.SetCanWriteAnything();
385 generator_.StartBatchOperations();
386
387 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true,
388 MAY_FEC_PROTECT, nullptr);
389 QuicConsumedData consumed = generator_.ConsumeData(
390 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr);
391 EXPECT_EQ(4u, consumed.bytes_consumed);
392 EXPECT_FALSE(consumed.fin_consumed);
393 EXPECT_TRUE(generator_.HasQueuedFrames());
394 }
395
396 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) {
397 delegate_.SetCanWriteAnything();
398 generator_.StartBatchOperations();
399
400 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true,
401 MAY_FEC_PROTECT, nullptr);
402 QuicConsumedData consumed = generator_.ConsumeData(
403 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr);
404 EXPECT_EQ(4u, consumed.bytes_consumed);
405 EXPECT_FALSE(consumed.fin_consumed);
406 EXPECT_TRUE(generator_.HasQueuedFrames());
407
408 // Now both frames will be flushed out.
409 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
410 generator_.FinishBatchOperations();
411 EXPECT_FALSE(generator_.HasQueuedFrames());
412
413 PacketContents contents;
414 contents.num_stream_frames = 2;
415 CheckPacketContains(contents, packet_);
416 }
417
418 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnMaxGroupSize) {
419 delegate_.SetCanWriteAnything();
420
421 // Send FEC every two packets.
422 creator_->set_max_packets_per_fec_group(2);
423
424 {
425 InSequence dummy;
426 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
427 SaveArg<0>(&packet_));
428 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
429 SaveArg<0>(&packet2_));
430 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
431 SaveArg<0>(&packet3_));
432 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
433 SaveArg<0>(&packet4_));
434 }
435
436 // Send enough data to create 3 packets: two full and one partial. Send with
437 // MUST_FEC_PROTECT flag.
438 size_t data_len = 2 * kDefaultMaxPacketSize + 100;
439 QuicConsumedData consumed = generator_.ConsumeData(
440 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr);
441 EXPECT_EQ(data_len, consumed.bytes_consumed);
442 EXPECT_TRUE(consumed.fin_consumed);
443 EXPECT_FALSE(generator_.HasQueuedFrames());
444
445 CheckPacketHasSingleStreamFrame(packet_);
446 CheckPacketHasSingleStreamFrame(packet2_);
447 CheckPacketIsFec(packet3_, 1);
448 CheckPacketHasSingleStreamFrame(packet4_);
449 EXPECT_TRUE(creator_->IsFecProtected());
450
451 // The FEC packet under construction will be sent when one more packet is sent
452 // (since FEC group size is 2), or when OnFecTimeout is called. Send more data
453 // with MAY_FEC_PROTECT. This packet should also be protected, and FEC packet
454 // is sent since FEC group size is reached.
455 {
456 InSequence dummy;
457 EXPECT_CALL(delegate_, OnSerializedPacket(_))
458 .WillOnce(SaveArg<0>(&packet5_));
459 EXPECT_CALL(delegate_, OnSerializedPacket(_))
460 .WillOnce(SaveArg<0>(&packet6_));
461 }
462 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
463 nullptr);
464 EXPECT_EQ(1u, consumed.bytes_consumed);
465 CheckPacketHasSingleStreamFrame(packet5_);
466 CheckPacketIsFec(packet6_, 4);
467 EXPECT_FALSE(creator_->IsFecProtected());
468 }
469
470 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnTimeout) {
471 delegate_.SetCanWriteAnything();
472 creator_->set_max_packets_per_fec_group(1000);
473
474 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the
475 // creator FEC protects all data.
476 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
477 QuicConsumedData consumed = generator_.ConsumeData(3, CreateData(1u), 0, true,
478 MUST_FEC_PROTECT, nullptr);
479 EXPECT_EQ(1u, consumed.bytes_consumed);
480 EXPECT_TRUE(consumed.fin_consumed);
481 CheckPacketHasSingleStreamFrame(packet_);
482 EXPECT_TRUE(creator_->IsFecProtected());
483
484 // Send more data with MAY_FEC_PROTECT. This packet should also be protected,
485 // and FEC packet is not yet sent.
486 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_));
487 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
488 nullptr);
489 EXPECT_EQ(1u, consumed.bytes_consumed);
490 CheckPacketHasSingleStreamFrame(packet2_);
491 EXPECT_TRUE(creator_->IsFecProtected());
492
493 // Calling OnFecTimeout should cause the FEC packet to be emitted.
494 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_));
495 generator_.OnFecTimeout();
496 CheckPacketIsFec(packet3_, 1);
497 EXPECT_FALSE(creator_->IsFecProtected());
498
499 // Subsequent data is protected under the next FEC group. Send enough data to
500 // create 2 more packets: one full and one partial.
501 {
502 InSequence dummy;
503 EXPECT_CALL(delegate_, OnSerializedPacket(_))
504 .WillOnce(SaveArg<0>(&packet4_));
505 EXPECT_CALL(delegate_, OnSerializedPacket(_))
506 .WillOnce(SaveArg<0>(&packet5_));
507 }
508 size_t data_len = kDefaultMaxPacketSize + 1;
509 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
510 MUST_FEC_PROTECT, nullptr);
511 EXPECT_EQ(data_len, consumed.bytes_consumed);
512 EXPECT_TRUE(consumed.fin_consumed);
513 CheckPacketHasSingleStreamFrame(packet4_);
514 CheckPacketHasSingleStreamFrame(packet5_);
515 EXPECT_TRUE(creator_->IsFecProtected());
516
517 // Calling OnFecTimeout should cause the FEC packet to be emitted.
518 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_));
519 generator_.OnFecTimeout();
520 CheckPacketIsFec(packet6_, 4);
521 EXPECT_FALSE(creator_->IsFecProtected());
522 }
523
524 TEST_F(QuicPacketGeneratorTest, GetFecTimeoutFiniteOnlyOnFirstPacketInGroup) {
525 delegate_.SetCanWriteAnything();
526 creator_->set_max_packets_per_fec_group(6);
527
528 // Send enough data to create 2 packets: one full and one partial. Send with
529 // MUST_FEC_PROTECT flag. No FEC packet is emitted yet, but the creator FEC
530 // protects all data.
531 {
532 InSequence dummy;
533 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
534 SaveArg<0>(&packet_));
535 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
536 SaveArg<0>(&packet2_));
537 }
538 size_t data_len = 1 * kDefaultMaxPacketSize + 100;
539 QuicConsumedData consumed = generator_.ConsumeData(
540 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr);
541 EXPECT_EQ(data_len, consumed.bytes_consumed);
542 EXPECT_TRUE(consumed.fin_consumed);
543 EXPECT_FALSE(generator_.HasQueuedFrames());
544 CheckPacketHasSingleStreamFrame(packet_);
545 CheckPacketHasSingleStreamFrame(packet2_);
546 EXPECT_TRUE(creator_->IsFecProtected());
547
548 // GetFecTimeout returns finite timeout only for first packet in group.
549 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs),
550 generator_.GetFecTimeout(/*sequence_number=*/1u));
551 EXPECT_EQ(QuicTime::Delta::Infinite(),
552 generator_.GetFecTimeout(/*sequence_number=*/2u));
553
554 // Send more data with MAY_FEC_PROTECT. This packet should also be protected,
555 // and FEC packet is not yet sent.
556 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_));
557 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
558 nullptr);
559 CheckPacketHasSingleStreamFrame(packet3_);
560 EXPECT_TRUE(creator_->IsFecProtected());
561
562 // GetFecTimeout returns finite timeout only for first packet in group.
563 EXPECT_EQ(QuicTime::Delta::Infinite(),
564 generator_.GetFecTimeout(/*sequence_number=*/3u));
565
566 // Calling OnFecTimeout should cause the FEC packet to be emitted.
567 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet4_));
568 generator_.OnFecTimeout();
569 CheckPacketIsFec(packet4_, /*fec_group=*/1u);
570 EXPECT_FALSE(creator_->IsFecProtected());
571
572 // Subsequent data is protected under the next FEC group. Send enough data to
573 // create 2 more packets: one full and one partial.
574 {
575 InSequence dummy;
576 EXPECT_CALL(delegate_, OnSerializedPacket(_))
577 .WillOnce(SaveArg<0>(&packet5_));
578 EXPECT_CALL(delegate_, OnSerializedPacket(_))
579 .WillOnce(SaveArg<0>(&packet6_));
580 }
581 data_len = kDefaultMaxPacketSize + 1u;
582 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
583 MUST_FEC_PROTECT, nullptr);
584 EXPECT_EQ(data_len, consumed.bytes_consumed);
585 EXPECT_TRUE(consumed.fin_consumed);
586 CheckPacketHasSingleStreamFrame(packet5_);
587 CheckPacketHasSingleStreamFrame(packet6_);
588 EXPECT_TRUE(creator_->IsFecProtected());
589
590 // GetFecTimeout returns finite timeout for first packet in the new group.
591 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs),
592 generator_.GetFecTimeout(/*sequence_number=*/5u));
593 EXPECT_EQ(QuicTime::Delta::Infinite(),
594 generator_.GetFecTimeout(/*sequence_number=*/6u));
595
596 // Calling OnFecTimeout should cause the FEC packet to be emitted.
597 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet7_));
598 generator_.OnFecTimeout();
599 CheckPacketIsFec(packet7_, /*fec_group=*/5u);
600 EXPECT_FALSE(creator_->IsFecProtected());
601
602 // Send more data with MAY_FEC_PROTECT. No FEC protection, so GetFecTimeout
603 // returns infinite.
604 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet8_));
605 consumed = generator_.ConsumeData(9, CreateData(1u), 0, true, MAY_FEC_PROTECT,
606 nullptr);
607 CheckPacketHasSingleStreamFrame(packet8_);
608 EXPECT_FALSE(creator_->IsFecProtected());
609 EXPECT_EQ(QuicTime::Delta::Infinite(),
610 generator_.GetFecTimeout(/*sequence_number=*/8u));
611 }
612
613 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
614 // Set the packet size be enough for two stream frames with 0 stream offset,
615 // but not enough for a stream frame of 0 offset and one with non-zero offset.
616 size_t length =
617 NullEncrypter().GetCiphertextSize(0) +
618 GetPacketHeaderSize(creator_->connection_id_length(), true,
619 creator_->next_sequence_number_length(),
620 NOT_IN_FEC_GROUP) +
621 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger
622 // than the GetMinStreamFrameSize.
623 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 +
624 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1;
625 creator_->set_max_packet_length(length);
626 delegate_.SetCanWriteAnything();
627 {
628 InSequence dummy;
629 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
630 SaveArg<0>(&packet_));
631 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
632 SaveArg<0>(&packet2_));
633 }
634 generator_.StartBatchOperations();
635 // Queue enough data to prevent a stream frame with a non-zero offset from
636 // fitting.
637 QuicConsumedData consumed =
638 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 0, false,
639 MAY_FEC_PROTECT, nullptr);
640 EXPECT_EQ(3u, consumed.bytes_consumed);
641 EXPECT_FALSE(consumed.fin_consumed);
642 EXPECT_TRUE(generator_.HasQueuedFrames());
643
644 // This frame will not fit with the existing frame, causing the queued frame
645 // to be serialized, and it will not fit with another frame like it, so it is
646 // serialized by itself.
647 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3,
648 true, MAY_FEC_PROTECT, nullptr);
649 EXPECT_EQ(3u, consumed.bytes_consumed);
650 EXPECT_TRUE(consumed.fin_consumed);
651 EXPECT_FALSE(generator_.HasQueuedFrames());
652
653 PacketContents contents;
654 contents.num_stream_frames = 1;
655 CheckPacketContains(contents, packet_);
656 CheckPacketContains(contents, packet2_);
657 }
658
659 TEST_F(QuicPacketGeneratorTest, NoFecPacketSentWhenBatchEnds) {
660 delegate_.SetCanWriteAnything();
661 creator_->set_max_packets_per_fec_group(6);
662
663 generator_.StartBatchOperations();
664
665 generator_.ConsumeData(3, MakeIOVector("foo"), 2, true, MUST_FEC_PROTECT,
666 nullptr);
667 QuicConsumedData consumed = generator_.ConsumeData(
668 5, MakeIOVector("quux"), 7, false, MUST_FEC_PROTECT, nullptr);
669 EXPECT_EQ(4u, consumed.bytes_consumed);
670 EXPECT_FALSE(consumed.fin_consumed);
671 EXPECT_TRUE(generator_.HasQueuedFrames());
672
673 // Now both frames will be flushed out, but FEC packet is not yet sent.
674 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
675 generator_.FinishBatchOperations();
676 EXPECT_FALSE(generator_.HasQueuedFrames());
677
678 PacketContents contents;
679 contents.num_stream_frames = 2u;
680 contents.fec_group = 1u;
681 CheckPacketContains(contents, packet_);
682
683 // Forcing FEC timeout causes FEC packet to be emitted.
684 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_));
685 generator_.OnFecTimeout();
686 CheckPacketIsFec(packet2_, /*fec_group=*/1u);
687 }
688
689 TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) {
690 EXPECT_EQ(QuicTime::Delta::Zero(),
691 QuicPacketGeneratorPeer::GetFecTimeout(&generator_));
692 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300));
693 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
694 QuicPacketGeneratorPeer::GetFecTimeout(&generator_));
695 }
696
697 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) {
698 delegate_.SetCanWriteAnything();
699 creator_->set_max_packets_per_fec_group(50);
700 EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
701 EXPECT_FALSE(creator_->IsFecGroupOpen());
702
703 // On reduced cwnd.
704 generator_.OnCongestionWindowChange(7);
705 EXPECT_EQ(3u, creator_->max_packets_per_fec_group());
706
707 // On increased cwnd.
708 generator_.OnCongestionWindowChange(100);
709 EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
710
711 // On collapsed cwnd.
712 generator_.OnCongestionWindowChange(1);
713 EXPECT_EQ(2u, creator_->max_packets_per_fec_group());
714 }
715
716 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) {
717 delegate_.SetCanWriteAnything();
718 generator_.StartBatchOperations();
719 creator_->set_max_packets_per_fec_group(50);
720 EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
721 EXPECT_FALSE(creator_->IsFecGroupOpen());
722
723 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 3 packets
724 // are sent, one is queued in the creator.
725 {
726 InSequence dummy;
727 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
728 SaveArg<0>(&packet_));
729 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
730 SaveArg<0>(&packet2_));
731 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
732 SaveArg<0>(&packet3_));
733 }
734 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
735 QuicConsumedData consumed = generator_.ConsumeData(
736 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr);
737 EXPECT_EQ(data_len, consumed.bytes_consumed);
738 EXPECT_TRUE(creator_->IsFecGroupOpen());
739
740 // Change FEC groupsize.
741 generator_.OnCongestionWindowChange(2);
742 EXPECT_EQ(2u, creator_->max_packets_per_fec_group());
743
744 // Send enough data to trigger one unprotected data packet, causing the FEC
745 // packet to also be sent.
746 {
747 InSequence dummy;
748 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
749 SaveArg<0>(&packet4_));
750 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
751 SaveArg<0>(&packet5_));
752 }
753 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0,
754 true, MAY_FEC_PROTECT, nullptr);
755 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed);
756 // Verify that one FEC packet was sent.
757 CheckPacketIsFec(packet5_, /*fec_group=*/1u);
758 EXPECT_FALSE(creator_->IsFecGroupOpen());
759 EXPECT_FALSE(creator_->IsFecProtected());
760 }
761
762 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) {
763 delegate_.SetCanWriteAnything();
764 creator_->set_max_packets_per_fec_group(2);
765 EXPECT_FALSE(creator_->IsFecProtected());
766
767 // Send one unprotected data packet.
768 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
769 SaveArg<0>(&packet_));
770 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
771 MAY_FEC_PROTECT, nullptr);
772 EXPECT_EQ(1u, consumed.bytes_consumed);
773 EXPECT_FALSE(generator_.HasQueuedFrames());
774 EXPECT_FALSE(creator_->IsFecProtected());
775 // Verify that one data packet was sent.
776 PacketContents contents;
777 contents.num_stream_frames = 1;
778 CheckPacketContains(contents, packet_);
779
780 {
781 InSequence dummy;
782 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
783 SaveArg<0>(&packet2_));
784 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
785 SaveArg<0>(&packet3_));
786 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
787 SaveArg<0>(&packet4_));
788 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
789 SaveArg<0>(&packet5_));
790 }
791 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag.
792 size_t data_len = 2 * kDefaultMaxPacketSize + 100;
793 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
794 MUST_FEC_PROTECT, nullptr);
795 EXPECT_EQ(data_len, consumed.bytes_consumed);
796 EXPECT_FALSE(generator_.HasQueuedFrames());
797
798 // Verify that packets sent were 3 data and 1 FEC.
799 CheckPacketHasSingleStreamFrame(packet2_);
800 CheckPacketHasSingleStreamFrame(packet3_);
801 CheckPacketIsFec(packet4_, /*fec_group=*/2u);
802 CheckPacketHasSingleStreamFrame(packet5_);
803
804 // Calling OnFecTimeout should emit the pending FEC packet.
805 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_));
806 generator_.OnFecTimeout();
807 CheckPacketIsFec(packet6_, /*fec_group=*/5u);
808
809 // Send one unprotected data packet.
810 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
811 SaveArg<0>(&packet7_));
812 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT,
813 nullptr);
814 EXPECT_EQ(1u, consumed.bytes_consumed);
815 EXPECT_FALSE(generator_.HasQueuedFrames());
816 EXPECT_FALSE(creator_->IsFecProtected());
817 // Verify that one unprotected data packet was sent.
818 CheckPacketContains(contents, packet7_);
819 }
820
821 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) {
822 delegate_.SetCanWriteAnything();
823 // Enable FEC.
824 creator_->set_max_packets_per_fec_group(2);
825
826 generator_.StartBatchOperations();
827 // Queue enough data to prevent a stream frame with a non-zero offset from
828 // fitting.
829 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
830 MAY_FEC_PROTECT, nullptr);
831 EXPECT_EQ(1u, consumed.bytes_consumed);
832 EXPECT_TRUE(creator_->HasPendingFrames());
833
834 // Queue protected data for sending. Should cause queued frames to be flushed.
835 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
836 SaveArg<0>(&packet_));
837 EXPECT_FALSE(creator_->IsFecProtected());
838 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
839 MUST_FEC_PROTECT, nullptr);
840 EXPECT_EQ(1u, consumed.bytes_consumed);
841 PacketContents contents;
842 contents.num_stream_frames = 1;
843 // Transmitted packet was not FEC protected.
844 CheckPacketContains(contents, packet_);
845 EXPECT_TRUE(creator_->IsFecProtected());
846 EXPECT_TRUE(creator_->HasPendingFrames());
847 }
848
849 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) {
850 // Enable FEC.
851 creator_->set_max_packets_per_fec_group(2);
852
853 // Queue control frames in generator.
854 delegate_.SetCanNotWrite();
855 generator_.SetShouldSendAck(true);
856 delegate_.SetCanWriteAnything();
857 generator_.StartBatchOperations();
858
859 // Set up frames to write into the creator when control frames are written.
860 EXPECT_CALL(delegate_, PopulateAckFrame(_));
861 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_));
862
863 // Generator should have queued control frames, and creator should be empty.
864 EXPECT_TRUE(generator_.HasQueuedFrames());
865 EXPECT_FALSE(creator_->HasPendingFrames());
866 EXPECT_FALSE(creator_->IsFecProtected());
867
868 // Queue protected data for sending. Should cause queued frames to be flushed.
869 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
870 SaveArg<0>(&packet_));
871 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
872 MUST_FEC_PROTECT, nullptr);
873 EXPECT_EQ(1u, consumed.bytes_consumed);
874 PacketContents contents;
875 contents.num_ack_frames = 1;
876 contents.num_stop_waiting_frames = 1;
877 CheckPacketContains(contents, packet_);
878
879 // FEC protection should be on in creator.
880 EXPECT_TRUE(creator_->IsFecProtected());
881 }
882
883 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) {
884 delegate_.SetCanWriteAnything();
885
886 // Enable FEC.
887 creator_->set_max_packets_per_fec_group(2);
888 EXPECT_FALSE(creator_->IsFecProtected());
889
890 // Queue stream frame to be protected in creator.
891 generator_.StartBatchOperations();
892 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
893 MUST_FEC_PROTECT, nullptr);
894 EXPECT_EQ(1u, consumed.bytes_consumed);
895 // Creator has a pending protected frame.
896 EXPECT_TRUE(creator_->HasPendingFrames());
897 EXPECT_TRUE(creator_->IsFecProtected());
898
899 // Add enough unprotected data to exceed size of current packet, so that
900 // current packet is sent. Both frames will be sent out in a single packet.
901 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
902 size_t data_len = kDefaultMaxPacketSize;
903 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
904 MAY_FEC_PROTECT, nullptr);
905 EXPECT_EQ(data_len, consumed.bytes_consumed);
906 PacketContents contents;
907 contents.num_stream_frames = 2u;
908 contents.fec_group = 1u;
909 CheckPacketContains(contents, packet_);
910 // FEC protection should still be on in creator.
911 EXPECT_TRUE(creator_->IsFecProtected());
912 }
913
914 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) {
915 delegate_.SetCanWriteAnything();
916
917 // Enable FEC.
918 creator_->set_max_packets_per_fec_group(2);
919 EXPECT_FALSE(creator_->IsFecProtected());
920
921 // Send first packet, FEC protected.
922 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
923 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
924 MUST_FEC_PROTECT, nullptr);
925 EXPECT_EQ(1u, consumed.bytes_consumed);
926 PacketContents contents;
927 contents.num_stream_frames = 1u;
928 contents.fec_group = 1u;
929 CheckPacketContains(contents, packet_);
930
931 // FEC should still be on in creator.
932 EXPECT_TRUE(creator_->IsFecProtected());
933
934 // Send unprotected data to cause second packet to be sent, which gets
935 // protected because it happens to fall within an open FEC group. Data packet
936 // will be followed by FEC packet.
937 {
938 InSequence dummy;
939 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
940 SaveArg<0>(&packet2_));
941 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
942 SaveArg<0>(&packet3_));
943 }
944 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
945 nullptr);
946 EXPECT_EQ(1u, consumed.bytes_consumed);
947 contents.num_stream_frames = 1u;
948 CheckPacketContains(contents, packet2_);
949 CheckPacketIsFec(packet3_, /*fec_group=*/1u);
950
951 // FEC protection should be off in creator.
952 EXPECT_FALSE(creator_->IsFecProtected());
953 }
954
955 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) {
956 delegate_.SetCanWriteAnything();
957 generator_.StartBatchOperations();
958
959 // Enable FEC.
960 creator_->set_max_packets_per_fec_group(2);
961 EXPECT_FALSE(creator_->IsFecProtected());
962
963 // Queue one byte of FEC protected data.
964 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
965 MUST_FEC_PROTECT, nullptr);
966 EXPECT_TRUE(creator_->HasPendingFrames());
967
968 // Add more unprotected data causing first packet to be sent, FEC protected.
969 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
970 SaveArg<0>(&packet_));
971 size_t data_len = kDefaultMaxPacketSize;
972 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
973 MAY_FEC_PROTECT, nullptr);
974 EXPECT_EQ(data_len, consumed.bytes_consumed);
975 PacketContents contents;
976 contents.num_stream_frames = 2u;
977 contents.fec_group = 1u;
978 CheckPacketContains(contents, packet_);
979
980 // FEC group is still open in creator.
981 EXPECT_TRUE(creator_->IsFecProtected());
982
983 // Add data that should be protected, large enough to cause second packet to
984 // be sent. Data packet should be followed by FEC packet.
985 {
986 InSequence dummy;
987 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
988 SaveArg<0>(&packet2_));
989 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
990 SaveArg<0>(&packet3_));
991 }
992 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
993 MUST_FEC_PROTECT, nullptr);
994 EXPECT_EQ(data_len, consumed.bytes_consumed);
995 CheckPacketContains(contents, packet2_);
996 CheckPacketIsFec(packet3_, /*fec_group=*/1u);
997
998 // FEC protection should remain on in creator.
999 EXPECT_TRUE(creator_->IsFecProtected());
1000 }
1001
1002 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) {
1003 delegate_.SetCanNotWrite();
1004
1005 generator_.SetShouldSendAck(false);
1006 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
1007 EXPECT_TRUE(generator_.HasQueuedFrames());
1008
1009 delegate_.SetCanWriteAnything();
1010
1011 generator_.StartBatchOperations();
1012
1013 // When the first write operation is invoked, the ack frame will be returned.
1014 EXPECT_CALL(delegate_, PopulateAckFrame(_));
1015
1016 // Send some data and a control frame
1017 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT,
1018 nullptr);
1019 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
1020
1021 // All five frames will be flushed out in a single packet.
1022 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
1023 generator_.FinishBatchOperations();
1024 EXPECT_FALSE(generator_.HasQueuedFrames());
1025
1026 PacketContents contents;
1027 contents.num_ack_frames = 1;
1028 contents.num_goaway_frames = 1;
1029 contents.num_rst_stream_frames = 1;
1030 contents.num_stream_frames = 1;
1031 CheckPacketContains(contents, packet_);
1032 }
1033
1034 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) {
1035 delegate_.SetCanNotWrite();
1036
1037 generator_.SetShouldSendAck(false);
1038 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
1039 EXPECT_TRUE(generator_.HasQueuedFrames());
1040
1041 delegate_.SetCanWriteAnything();
1042
1043 generator_.StartBatchOperations();
1044
1045 // When the first write operation is invoked, the ack frame will be returned.
1046 EXPECT_CALL(delegate_, PopulateAckFrame(_));
1047
1048 {
1049 InSequence dummy;
1050 // All five frames will be flushed out in a single packet
1051 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
1052 SaveArg<0>(&packet_));
1053 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
1054 SaveArg<0>(&packet2_));
1055 }
1056
1057 // Send enough data to exceed one packet
1058 size_t data_len = kDefaultMaxPacketSize + 100;
1059 QuicConsumedData consumed = generator_.ConsumeData(
1060 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr);
1061 EXPECT_EQ(data_len, consumed.bytes_consumed);
1062 EXPECT_TRUE(consumed.fin_consumed);
1063 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
1064
1065 generator_.FinishBatchOperations();
1066 EXPECT_FALSE(generator_.HasQueuedFrames());
1067
1068 // The first packet should have the queued data and part of the stream data.
1069 PacketContents contents;
1070 contents.num_ack_frames = 1;
1071 contents.num_rst_stream_frames = 1;
1072 contents.num_stream_frames = 1;
1073 CheckPacketContains(contents, packet_);
1074
1075 // The second should have the remainder of the stream data.
1076 PacketContents contents2;
1077 contents2.num_goaway_frames = 1;
1078 contents2.num_stream_frames = 1;
1079 CheckPacketContains(contents2, packet2_);
1080 }
1081
1082 TEST_F(QuicPacketGeneratorTest, TestConnectionIdLength) {
1083 generator_.SetConnectionIdLength(0);
1084 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length());
1085 generator_.SetConnectionIdLength(1);
1086 EXPECT_EQ(PACKET_1BYTE_CONNECTION_ID, creator_->connection_id_length());
1087 generator_.SetConnectionIdLength(2);
1088 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length());
1089 generator_.SetConnectionIdLength(3);
1090 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length());
1091 generator_.SetConnectionIdLength(4);
1092 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length());
1093 generator_.SetConnectionIdLength(5);
1094 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
1095 generator_.SetConnectionIdLength(6);
1096 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
1097 generator_.SetConnectionIdLength(7);
1098 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
1099 generator_.SetConnectionIdLength(8);
1100 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
1101 generator_.SetConnectionIdLength(9);
1102 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
1103 }
1104
1105 } // namespace test
1106 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_generator.cc ('k') | net/quic/quic_packet_writer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698