Add explicit |forceOnlineSignin| to user pod status
[chromium-blink-merge.git] / net / quic / quic_packet_generator_test.cc
blob8907db95a1235c4e53bc0ac4179a8c7b182ae979
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"
7 #include <string>
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;
20 using std::string;
21 using testing::InSequence;
22 using testing::Return;
23 using testing::SaveArg;
24 using testing::StrictMock;
25 using testing::_;
27 namespace net {
28 namespace test {
29 namespace {
31 class MockDelegate : public QuicPacketGenerator::DelegateInterface {
32 public:
33 MockDelegate() {}
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));
70 private:
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 {
78 PacketContents()
79 : num_ack_frames(0),
80 num_connection_close_frames(0),
81 num_feedback_frames(0),
82 num_goaway_frames(0),
83 num_rst_stream_frames(0),
84 num_stream_frames(0),
85 fec_group(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;
98 } // namespace
100 class QuicPacketGeneratorTest : public ::testing::Test {
101 protected:
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);
135 return frame;
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);
156 } else {
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);
200 IOVector data;
201 data.Append(data_array_.get(), len);
202 return data;
205 QuicFramer framer_;
206 MockRandom random_;
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_;
217 private:
218 scoped_ptr<char[]> data_array_;
221 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegateInterface {
222 public:
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,
355 true, NULL);
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,
366 true, NULL);
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,
378 true, NULL);
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,
395 false, NULL);
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,
407 false, NULL);
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;
430 InSequence dummy;
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;
466 InSequence dummy;
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,
494 true,
495 creator_.options()->send_sequence_number_length,
496 NOT_IN_FEC_GROUP) +
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();
503 InSequence dummy;
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
511 // fitting.
512 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 0,
513 false, NULL);
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()));
586 InSequence dummy;
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_);
620 } // namespace test
621 } // namespace net