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.
5 #include "net/quic/quic_packet_generator.h"
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_utils.h"
14 #include "net/quic/test_tools/quic_test_utils.h"
15 #include "net/quic/test_tools/simple_quic_framer.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
19 using base::StringPiece
;
21 using testing::InSequence
;
22 using testing::Return
;
23 using testing::SaveArg
;
24 using testing::StrictMock
;
31 class MockDelegate
: public QuicPacketGenerator::DelegateInterface
{
34 virtual ~MockDelegate() {}
36 MOCK_METHOD3(ShouldGeneratePacket
,
37 bool(TransmissionType transmission_type
,
38 HasRetransmittableData retransmittable
,
39 IsHandshake handshake
));
40 MOCK_METHOD0(CreateAckFrame
, QuicAckFrame
*());
41 MOCK_METHOD0(CreateFeedbackFrame
, QuicCongestionFeedbackFrame
*());
42 MOCK_METHOD1(OnSerializedPacket
, bool(const SerializedPacket
& packet
));
43 MOCK_METHOD2(CloseConnection
, void(QuicErrorCode
, bool));
45 void SetCanWriteAnything() {
46 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION
, _
, _
))
47 .WillRepeatedly(Return(true));
48 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION
,
49 NO_RETRANSMITTABLE_DATA
, _
))
50 .WillRepeatedly(Return(true));
53 void SetCanNotWrite() {
54 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION
, _
, _
))
55 .WillRepeatedly(Return(false));
56 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION
,
57 NO_RETRANSMITTABLE_DATA
, _
))
58 .WillRepeatedly(Return(false));
61 // Use this when only ack and feedback frames should be allowed to be written.
62 void SetCanWriteOnlyNonRetransmittable() {
63 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION
, _
, _
))
64 .WillRepeatedly(Return(false));
65 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION
,
66 NO_RETRANSMITTABLE_DATA
, _
))
67 .WillRepeatedly(Return(true));
71 DISALLOW_COPY_AND_ASSIGN(MockDelegate
);
74 // Simple struct for describing the contents of a packet.
75 // Useful in conjunction with a SimpleQuicFrame for validating
76 // that a packet contains the expected frames.
77 struct PacketContents
{
80 num_connection_close_frames(0),
81 num_feedback_frames(0),
83 num_rst_stream_frames(0),
88 size_t num_ack_frames
;
89 size_t num_connection_close_frames
;
90 size_t num_feedback_frames
;
91 size_t num_goaway_frames
;
92 size_t num_rst_stream_frames
;
93 size_t num_stream_frames
;
95 QuicFecGroupNumber fec_group
;
100 class QuicPacketGeneratorTest
: public ::testing::Test
{
102 QuicPacketGeneratorTest()
103 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false),
104 creator_(42, &framer_
, &random_
, false),
105 generator_(&delegate_
, NULL
, &creator_
),
106 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER
, NULL
, 0, NULL
),
107 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER
, NULL
, 0, NULL
),
108 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER
, NULL
, 0, NULL
),
109 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER
, NULL
, 0, NULL
),
110 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER
, NULL
, 0, NULL
) {
113 ~QuicPacketGeneratorTest() {
114 delete packet_
.packet
;
115 delete packet_
.retransmittable_frames
;
116 delete packet2_
.packet
;
117 delete packet2_
.retransmittable_frames
;
118 delete packet3_
.packet
;
119 delete packet3_
.retransmittable_frames
;
120 delete packet4_
.packet
;
121 delete packet4_
.retransmittable_frames
;
122 delete packet5_
.packet
;
123 delete packet5_
.retransmittable_frames
;
126 QuicAckFrame
* CreateAckFrame() {
127 // TODO(rch): Initialize this so it can be verified later.
128 return new QuicAckFrame(0, QuicTime::Zero(), 0);
131 QuicCongestionFeedbackFrame
* CreateFeedbackFrame() {
132 QuicCongestionFeedbackFrame
* frame
= new QuicCongestionFeedbackFrame
;
133 frame
->type
= kFixRate
;
134 frame
->fix_rate
.bitrate
= QuicBandwidth::FromBytesPerSecond(42);
138 QuicRstStreamFrame
* CreateRstStreamFrame() {
139 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR
);
142 QuicGoAwayFrame
* CreateGoAwayFrame() {
143 return new QuicGoAwayFrame(QUIC_NO_ERROR
, 1, string());
146 void CheckPacketContains(const PacketContents
& contents
,
147 const SerializedPacket
& packet
) {
148 size_t num_retransmittable_frames
= contents
.num_connection_close_frames
+
149 contents
.num_goaway_frames
+ contents
.num_rst_stream_frames
+
150 contents
.num_stream_frames
;
151 size_t num_frames
= contents
.num_feedback_frames
+ contents
.num_ack_frames
+
152 num_retransmittable_frames
;
154 if (num_retransmittable_frames
== 0) {
155 ASSERT_TRUE(packet
.retransmittable_frames
== NULL
);
157 ASSERT_TRUE(packet
.retransmittable_frames
!= NULL
);
158 EXPECT_EQ(num_retransmittable_frames
,
159 packet
.retransmittable_frames
->frames().size());
162 ASSERT_TRUE(packet
.packet
!= NULL
);
163 ASSERT_TRUE(simple_framer_
.ProcessPacket(*packet
.packet
));
164 EXPECT_EQ(num_frames
, simple_framer_
.num_frames());
165 EXPECT_EQ(contents
.num_ack_frames
, simple_framer_
.ack_frames().size());
166 EXPECT_EQ(contents
.num_connection_close_frames
,
167 simple_framer_
.connection_close_frames().size());
168 EXPECT_EQ(contents
.num_feedback_frames
,
169 simple_framer_
.feedback_frames().size());
170 EXPECT_EQ(contents
.num_goaway_frames
,
171 simple_framer_
.goaway_frames().size());
172 EXPECT_EQ(contents
.num_rst_stream_frames
,
173 simple_framer_
.rst_stream_frames().size());
174 EXPECT_EQ(contents
.num_stream_frames
,
175 simple_framer_
.stream_frames().size());
176 EXPECT_EQ(contents
.fec_group
, simple_framer_
.header().fec_group
);
179 void CheckPacketHasSingleStreamFrame(const SerializedPacket
& packet
) {
180 ASSERT_TRUE(packet
.retransmittable_frames
!= NULL
);
181 EXPECT_EQ(1u, packet
.retransmittable_frames
->frames().size());
182 ASSERT_TRUE(packet
.packet
!= NULL
);
183 ASSERT_TRUE(simple_framer_
.ProcessPacket(*packet
.packet
));
184 EXPECT_EQ(1u, simple_framer_
.num_frames());
185 EXPECT_EQ(1u, simple_framer_
.stream_frames().size());
188 void CheckPacketIsFec(const SerializedPacket
& packet
,
189 QuicPacketSequenceNumber fec_group
) {
190 ASSERT_TRUE(packet
.retransmittable_frames
== NULL
);
191 ASSERT_TRUE(packet
.packet
!= NULL
);
192 ASSERT_TRUE(simple_framer_
.ProcessPacket(*packet
.packet
));
193 EXPECT_TRUE(simple_framer_
.header().fec_flag
);
194 EXPECT_EQ(fec_group
, simple_framer_
.fec_data().fec_group
);
197 IOVector
CreateData(size_t len
) {
198 data_array_
.reset(new char[len
]);
199 memset(data_array_
.get(), '?', len
);
201 data
.Append(data_array_
.get(), len
);
207 QuicPacketCreator creator_
;
208 StrictMock
<MockDelegate
> delegate_
;
209 QuicPacketGenerator generator_
;
210 SimpleQuicFramer simple_framer_
;
211 SerializedPacket packet_
;
212 SerializedPacket packet2_
;
213 SerializedPacket packet3_
;
214 SerializedPacket packet4_
;
215 SerializedPacket packet5_
;
218 scoped_ptr
<char[]> data_array_
;
221 class MockDebugDelegate
: public QuicPacketGenerator::DebugDelegateInterface
{
223 MOCK_METHOD1(OnFrameAddedToPacket
,
224 void(const QuicFrame
&));
227 TEST_F(QuicPacketGeneratorTest
, ShouldSendAck_NotWritable
) {
228 delegate_
.SetCanNotWrite();
230 generator_
.SetShouldSendAck(false);
231 EXPECT_TRUE(generator_
.HasQueuedFrames());
234 TEST_F(QuicPacketGeneratorTest
, ShouldSendAck_WritableAndShouldNotFlush
) {
235 StrictMock
<MockDebugDelegate
> debug_delegate
;
237 generator_
.set_debug_delegate(&debug_delegate
);
238 delegate_
.SetCanWriteOnlyNonRetransmittable();
239 generator_
.StartBatchOperations();
241 EXPECT_CALL(delegate_
, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
242 EXPECT_CALL(debug_delegate
, OnFrameAddedToPacket(_
)).Times(1);
244 generator_
.SetShouldSendAck(false);
245 EXPECT_TRUE(generator_
.HasQueuedFrames());
248 TEST_F(QuicPacketGeneratorTest
, ShouldSendAck_WritableAndShouldFlush
) {
249 delegate_
.SetCanWriteOnlyNonRetransmittable();
251 EXPECT_CALL(delegate_
, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
252 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
253 DoAll(SaveArg
<0>(&packet_
), Return(true)));
255 generator_
.SetShouldSendAck(false);
256 EXPECT_FALSE(generator_
.HasQueuedFrames());
258 PacketContents contents
;
259 contents
.num_ack_frames
= 1;
260 CheckPacketContains(contents
, packet_
);
263 TEST_F(QuicPacketGeneratorTest
,
264 ShouldSendAckWithFeedback_WritableAndShouldNotFlush
) {
265 delegate_
.SetCanWriteOnlyNonRetransmittable();
266 generator_
.StartBatchOperations();
268 EXPECT_CALL(delegate_
, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
269 EXPECT_CALL(delegate_
, CreateFeedbackFrame()).WillOnce(
270 Return(CreateFeedbackFrame()));
272 generator_
.SetShouldSendAck(true);
273 EXPECT_TRUE(generator_
.HasQueuedFrames());
276 TEST_F(QuicPacketGeneratorTest
,
277 ShouldSendAckWithFeedback_WritableAndShouldFlush
) {
278 delegate_
.SetCanWriteOnlyNonRetransmittable();
280 EXPECT_CALL(delegate_
, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
281 EXPECT_CALL(delegate_
, CreateFeedbackFrame()).WillOnce(
282 Return(CreateFeedbackFrame()));
284 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
285 DoAll(SaveArg
<0>(&packet_
), Return(true)));
287 generator_
.SetShouldSendAck(true);
288 EXPECT_FALSE(generator_
.HasQueuedFrames());
290 PacketContents contents
;
291 contents
.num_ack_frames
= 1;
292 contents
.num_feedback_frames
= 1;
293 CheckPacketContains(contents
, packet_
);
296 TEST_F(QuicPacketGeneratorTest
, AddControlFrame_NotWritable
) {
297 delegate_
.SetCanNotWrite();
299 generator_
.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
300 EXPECT_TRUE(generator_
.HasQueuedFrames());
303 TEST_F(QuicPacketGeneratorTest
, AddControlFrame_OnlyAckWritable
) {
304 delegate_
.SetCanWriteOnlyNonRetransmittable();
306 generator_
.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
307 EXPECT_TRUE(generator_
.HasQueuedFrames());
310 TEST_F(QuicPacketGeneratorTest
, AddControlFrame_WritableAndShouldNotFlush
) {
311 delegate_
.SetCanWriteAnything();
312 generator_
.StartBatchOperations();
314 generator_
.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
315 EXPECT_TRUE(generator_
.HasQueuedFrames());
318 TEST_F(QuicPacketGeneratorTest
, AddControlFrame_NotWritableBatchThenFlush
) {
319 delegate_
.SetCanNotWrite();
320 generator_
.StartBatchOperations();
322 generator_
.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
323 EXPECT_TRUE(generator_
.HasQueuedFrames());
324 generator_
.FinishBatchOperations();
325 EXPECT_TRUE(generator_
.HasQueuedFrames());
327 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
328 DoAll(SaveArg
<0>(&packet_
), Return(true)));
329 generator_
.FlushAllQueuedFrames();
330 EXPECT_FALSE(generator_
.HasQueuedFrames());
332 PacketContents contents
;
333 contents
.num_rst_stream_frames
= 1;
334 CheckPacketContains(contents
, packet_
);
337 TEST_F(QuicPacketGeneratorTest
, AddControlFrame_WritableAndShouldFlush
) {
338 delegate_
.SetCanWriteAnything();
340 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
341 DoAll(SaveArg
<0>(&packet_
), Return(true)));
343 generator_
.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
344 EXPECT_FALSE(generator_
.HasQueuedFrames());
346 PacketContents contents
;
347 contents
.num_rst_stream_frames
= 1;
348 CheckPacketContains(contents
, packet_
);
351 TEST_F(QuicPacketGeneratorTest
, ConsumeData_NotWritable
) {
352 delegate_
.SetCanNotWrite();
354 QuicConsumedData consumed
= generator_
.ConsumeData(1, MakeIOVector("foo"), 2,
356 EXPECT_EQ(0u, consumed
.bytes_consumed
);
357 EXPECT_FALSE(consumed
.fin_consumed
);
358 EXPECT_FALSE(generator_
.HasQueuedFrames());
361 TEST_F(QuicPacketGeneratorTest
, ConsumeData_WritableAndShouldNotFlush
) {
362 delegate_
.SetCanWriteAnything();
363 generator_
.StartBatchOperations();
365 QuicConsumedData consumed
= generator_
.ConsumeData(1, MakeIOVector("foo"), 2,
367 EXPECT_EQ(3u, consumed
.bytes_consumed
);
368 EXPECT_TRUE(consumed
.fin_consumed
);
369 EXPECT_TRUE(generator_
.HasQueuedFrames());
372 TEST_F(QuicPacketGeneratorTest
, ConsumeData_WritableAndShouldFlush
) {
373 delegate_
.SetCanWriteAnything();
375 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
376 DoAll(SaveArg
<0>(&packet_
), Return(true)));
377 QuicConsumedData consumed
= generator_
.ConsumeData(1, MakeIOVector("foo"), 2,
379 EXPECT_EQ(3u, consumed
.bytes_consumed
);
380 EXPECT_TRUE(consumed
.fin_consumed
);
381 EXPECT_FALSE(generator_
.HasQueuedFrames());
383 PacketContents contents
;
384 contents
.num_stream_frames
= 1;
385 CheckPacketContains(contents
, packet_
);
388 TEST_F(QuicPacketGeneratorTest
,
389 ConsumeDataMultipleTimes_WritableAndShouldNotFlush
) {
390 delegate_
.SetCanWriteAnything();
391 generator_
.StartBatchOperations();
393 generator_
.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL
);
394 QuicConsumedData consumed
= generator_
.ConsumeData(3, MakeIOVector("quux"), 7,
396 EXPECT_EQ(4u, consumed
.bytes_consumed
);
397 EXPECT_FALSE(consumed
.fin_consumed
);
398 EXPECT_TRUE(generator_
.HasQueuedFrames());
401 TEST_F(QuicPacketGeneratorTest
, ConsumeData_BatchOperations
) {
402 delegate_
.SetCanWriteAnything();
403 generator_
.StartBatchOperations();
405 generator_
.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL
);
406 QuicConsumedData consumed
= generator_
.ConsumeData(3, MakeIOVector("quux"), 7,
408 EXPECT_EQ(4u, consumed
.bytes_consumed
);
409 EXPECT_FALSE(consumed
.fin_consumed
);
410 EXPECT_TRUE(generator_
.HasQueuedFrames());
412 // Now both frames will be flushed out.
413 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
414 DoAll(SaveArg
<0>(&packet_
), Return(true)));
415 generator_
.FinishBatchOperations();
416 EXPECT_FALSE(generator_
.HasQueuedFrames());
418 PacketContents contents
;
419 contents
.num_stream_frames
= 2;
420 CheckPacketContains(contents
, packet_
);
423 TEST_F(QuicPacketGeneratorTest
, ConsumeDataFEC
) {
424 delegate_
.SetCanWriteAnything();
426 // Send FEC every two packets.
427 creator_
.options()->max_packets_per_fec_group
= 2;
431 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
432 DoAll(SaveArg
<0>(&packet_
), Return(true)));
433 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
434 DoAll(SaveArg
<0>(&packet2_
), Return(true)));
435 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
436 DoAll(SaveArg
<0>(&packet3_
), Return(true)));
437 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
438 DoAll(SaveArg
<0>(&packet4_
), Return(true)));
439 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
440 DoAll(SaveArg
<0>(&packet5_
), Return(true)));
443 // Send enough data to create 3 packets: two full and one partial.
444 size_t data_len
= 2 * kDefaultMaxPacketSize
+ 100;
445 QuicConsumedData consumed
=
446 generator_
.ConsumeData(3, CreateData(data_len
), 0, true, NULL
);
447 EXPECT_EQ(data_len
, consumed
.bytes_consumed
);
448 EXPECT_TRUE(consumed
.fin_consumed
);
449 EXPECT_FALSE(generator_
.HasQueuedFrames());
451 CheckPacketHasSingleStreamFrame(packet_
);
452 CheckPacketHasSingleStreamFrame(packet2_
);
453 CheckPacketIsFec(packet3_
, 1);
455 CheckPacketHasSingleStreamFrame(packet4_
);
456 CheckPacketIsFec(packet5_
, 4);
459 TEST_F(QuicPacketGeneratorTest
, ConsumeDataSendsFecAtEnd
) {
460 delegate_
.SetCanWriteAnything();
462 // Send FEC every six packets.
463 creator_
.options()->max_packets_per_fec_group
= 6;
467 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
468 DoAll(SaveArg
<0>(&packet_
), Return(true)));
469 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
470 DoAll(SaveArg
<0>(&packet2_
), Return(true)));
471 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
472 DoAll(SaveArg
<0>(&packet3_
), Return(true)));
475 // Send enough data to create 2 packets: one full and one partial.
476 size_t data_len
= 1 * kDefaultMaxPacketSize
+ 100;
477 QuicConsumedData consumed
=
478 generator_
.ConsumeData(3, CreateData(data_len
), 0, true, NULL
);
479 EXPECT_EQ(data_len
, consumed
.bytes_consumed
);
480 EXPECT_TRUE(consumed
.fin_consumed
);
481 EXPECT_FALSE(generator_
.HasQueuedFrames());
483 CheckPacketHasSingleStreamFrame(packet_
);
484 CheckPacketHasSingleStreamFrame(packet2_
);
485 CheckPacketIsFec(packet3_
, 1);
488 TEST_F(QuicPacketGeneratorTest
, ConsumeData_FramesPreviouslyQueued
) {
489 // Set the packet size be enough for two stream frames with 0 stream offset,
490 // but not enough for a stream frame of 0 offset and one with non-zero offset.
491 creator_
.options()->max_packet_length
=
492 NullEncrypter().GetCiphertextSize(0) +
493 GetPacketHeaderSize(creator_
.options()->send_guid_length
,
495 creator_
.options()->send_sequence_number_length
,
497 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger
498 // than the GetMinStreamFrameSize.
499 QuicFramer::GetMinStreamFrameSize(framer_
.version(), 1, 0, false) + 3 +
500 QuicFramer::GetMinStreamFrameSize(framer_
.version(), 1, 0, true) + 1;
501 delegate_
.SetCanWriteAnything();
504 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
505 DoAll(SaveArg
<0>(&packet_
), Return(true)));
506 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
507 DoAll(SaveArg
<0>(&packet2_
), Return(true)));
509 generator_
.StartBatchOperations();
510 // Queue enough data to prevent a stream frame with a non-zero offset from
512 QuicConsumedData consumed
= generator_
.ConsumeData(1, MakeIOVector("foo"), 0,
514 EXPECT_EQ(3u, consumed
.bytes_consumed
);
515 EXPECT_FALSE(consumed
.fin_consumed
);
516 EXPECT_TRUE(generator_
.HasQueuedFrames());
518 // This frame will not fit with the existing frame, causing the queued frame
519 // to be serialized, and it will not fit with another frame like it, so it is
520 // serialized by itself.
521 consumed
= generator_
.ConsumeData(1, MakeIOVector("bar"), 3, true, NULL
);
522 EXPECT_EQ(3u, consumed
.bytes_consumed
);
523 EXPECT_TRUE(consumed
.fin_consumed
);
524 EXPECT_FALSE(generator_
.HasQueuedFrames());
526 PacketContents contents
;
527 contents
.num_stream_frames
= 1;
528 CheckPacketContains(contents
, packet_
);
529 CheckPacketContains(contents
, packet2_
);
532 TEST_F(QuicPacketGeneratorTest
, NotWritableThenBatchOperations
) {
533 delegate_
.SetCanNotWrite();
535 generator_
.SetShouldSendAck(true);
536 generator_
.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
537 EXPECT_TRUE(generator_
.HasQueuedFrames());
539 delegate_
.SetCanWriteAnything();
541 generator_
.StartBatchOperations();
543 // When the first write operation is invoked, the ack and feedback
544 // frames will be returned.
545 EXPECT_CALL(delegate_
, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
546 EXPECT_CALL(delegate_
, CreateFeedbackFrame()).WillOnce(
547 Return(CreateFeedbackFrame()));
549 // Send some data and a control frame
550 generator_
.ConsumeData(3, MakeIOVector("quux"), 7, false, NULL
);
551 generator_
.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
553 // All five frames will be flushed out in a single packet.
554 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
555 DoAll(SaveArg
<0>(&packet_
), Return(true)));
556 generator_
.FinishBatchOperations();
557 EXPECT_FALSE(generator_
.HasQueuedFrames());
559 PacketContents contents
;
560 contents
.num_ack_frames
= 1;
561 contents
.num_goaway_frames
= 1;
562 contents
.num_feedback_frames
= 1;
563 contents
.num_rst_stream_frames
= 1;
564 contents
.num_stream_frames
= 1;
565 CheckPacketContains(contents
, packet_
);
568 TEST_F(QuicPacketGeneratorTest
, NotWritableThenBatchOperations2
) {
569 delegate_
.SetCanNotWrite();
571 generator_
.SetShouldSendAck(true);
572 generator_
.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
573 EXPECT_TRUE(generator_
.HasQueuedFrames());
575 delegate_
.SetCanWriteAnything();
577 generator_
.StartBatchOperations();
579 // When the first write operation is invoked, the ack and feedback
580 // frames will be returned.
581 EXPECT_CALL(delegate_
, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
582 EXPECT_CALL(delegate_
, CreateFeedbackFrame()).WillOnce(
583 Return(CreateFeedbackFrame()));
587 // All five frames will be flushed out in a single packet
588 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
589 DoAll(SaveArg
<0>(&packet_
), Return(true)));
590 EXPECT_CALL(delegate_
, OnSerializedPacket(_
)).WillOnce(
591 DoAll(SaveArg
<0>(&packet2_
), Return(true)));
594 // Send enough data to exceed one packet
595 size_t data_len
= kDefaultMaxPacketSize
+ 100;
596 QuicConsumedData consumed
=
597 generator_
.ConsumeData(3, CreateData(data_len
), 0, true, NULL
);
598 EXPECT_EQ(data_len
, consumed
.bytes_consumed
);
599 EXPECT_TRUE(consumed
.fin_consumed
);
600 generator_
.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
602 generator_
.FinishBatchOperations();
603 EXPECT_FALSE(generator_
.HasQueuedFrames());
605 // The first packet should have the queued data and part of the stream data.
606 PacketContents contents
;
607 contents
.num_ack_frames
= 1;
608 contents
.num_feedback_frames
= 1;
609 contents
.num_rst_stream_frames
= 1;
610 contents
.num_stream_frames
= 1;
611 CheckPacketContains(contents
, packet_
);
613 // The second should have the remainder of the stream data.
614 PacketContents contents2
;
615 contents2
.num_goaway_frames
= 1;
616 contents2
.num_stream_frames
= 1;
617 CheckPacketContains(contents2
, packet2_
);