blob: cb22fd57bf0d5949f1245b25b7c33d8a1d3d6669 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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/third_party/quiche/src/quic/core/quic_packet_generator.h"
6
7#include <cstdint>
8#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -07009#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050010
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
12#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
13#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
14#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
15#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
16#include "net/third_party/quiche/src/quic/core/quic_utils.h"
17#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
18#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050019#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
20#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
21#include "net/third_party/quiche/src/quic/test_tools/mock_random.h"
22#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
23#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
24#include "net/third_party/quiche/src/quic/test_tools/quic_packet_generator_peer.h"
25#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
26#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
27#include "net/third_party/quiche/src/quic/test_tools/simple_quic_framer.h"
28
29using testing::_;
30using testing::InSequence;
31using testing::Return;
32using testing::StrictMock;
33
34namespace quic {
35namespace test {
36namespace {
37
38class MockDelegate : public QuicPacketGenerator::DelegateInterface {
39 public:
40 MockDelegate() {}
41 MockDelegate(const MockDelegate&) = delete;
42 MockDelegate& operator=(const MockDelegate&) = delete;
43 ~MockDelegate() override {}
44
45 MOCK_METHOD2(ShouldGeneratePacket,
46 bool(HasRetransmittableData retransmittable,
47 IsHandshake handshake));
48 MOCK_METHOD0(MaybeBundleAckOpportunistically, const QuicFrames());
49 MOCK_METHOD0(GetUpdatedAckFrame, const QuicFrame());
50 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*));
51 MOCK_METHOD0(GetPacketBuffer, char*());
52 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
53 MOCK_METHOD3(OnUnrecoverableError,
vasilvvc48c8712019-03-11 13:38:16 -070054 void(QuicErrorCode, const std::string&, ConnectionCloseSource));
QUICHE teama6ef0a62019-03-07 20:34:33 -050055
56 void SetCanWriteAnything() {
57 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
58 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
59 .WillRepeatedly(Return(true));
60 }
61
62 void SetCanNotWrite() {
63 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
64 .WillRepeatedly(Return(false));
65 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
66 .WillRepeatedly(Return(false));
67 }
68
69 // Use this when only ack frames should be allowed to be written.
70 void SetCanWriteOnlyNonRetransmittable() {
71 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
72 .WillRepeatedly(Return(false));
73 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
74 .WillRepeatedly(Return(true));
75 }
76};
77
78// Simple struct for describing the contents of a packet.
79// Useful in conjunction with a SimpleQuicFrame for validating that a packet
80// contains the expected frames.
81struct PacketContents {
82 PacketContents()
83 : num_ack_frames(0),
84 num_connection_close_frames(0),
85 num_goaway_frames(0),
86 num_rst_stream_frames(0),
87 num_stop_waiting_frames(0),
88 num_stream_frames(0),
89 num_crypto_frames(0),
90 num_ping_frames(0),
91 num_mtu_discovery_frames(0),
92 num_padding_frames(0) {}
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 size_t num_crypto_frames;
101 size_t num_ping_frames;
102 size_t num_mtu_discovery_frames;
103 size_t num_padding_frames;
104};
105
106} // namespace
107
108class TestPacketGenerator : public QuicPacketGenerator {
109 public:
110 TestPacketGenerator(QuicConnectionId connection_id,
111 QuicFramer* framer,
112 QuicRandom* random_generator,
113 DelegateInterface* delegate,
114 SimpleDataProducer* producer)
115 : QuicPacketGenerator(connection_id, framer, random_generator, delegate),
116 ack_frame_(InitAckFrame(1)),
117 delegate_(static_cast<MockDelegate*>(delegate)),
118 producer_(producer) {}
119
120 void AddControlFrame(const QuicFrame& frame, bool bundle_ack) {
121 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode) &&
122 !QuicPacketGeneratorPeer::GetPacketCreator(this)->has_ack()) {
123 QuicFrames frames;
124 if (bundle_ack) {
125 frames.push_back(QuicFrame(&ack_frame_));
126 }
127 if (delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
128 NOT_HANDSHAKE)) {
129 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically())
130 .WillOnce(Return(frames));
131 }
132 }
133 QuicPacketGenerator::AddControlFrame(frame);
134 }
135
136 QuicConsumedData ConsumeDataFastPath(QuicStreamId id,
137 const struct iovec* iov,
138 int iov_count,
139 size_t total_length,
140 QuicStreamOffset offset,
141 bool fin) {
142 // Save data before data is consumed.
143 if (total_length > 0) {
144 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
145 }
146 return QuicPacketGenerator::ConsumeDataFastPath(id, total_length, offset,
147 fin, 0);
148 }
149
150 QuicConsumedData ConsumeData(QuicStreamId id,
151 const struct iovec* iov,
152 int iov_count,
153 size_t total_length,
154 QuicStreamOffset offset,
155 StreamSendingState state) {
156 // Save data before data is consumed.
157 if (total_length > 0) {
158 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
159 }
160 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode) &&
161 !QuicPacketGeneratorPeer::GetPacketCreator(this)->has_ack() &&
162 delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
163 NOT_HANDSHAKE)) {
164 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
165 }
166 return QuicPacketGenerator::ConsumeData(id, total_length, offset, state);
167 }
168
169 MessageStatus AddMessageFrame(QuicMessageId message_id,
170 QuicMemSliceSpan message) {
171 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode) &&
172 !QuicPacketGeneratorPeer::GetPacketCreator(this)->has_ack() &&
173 delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
174 NOT_HANDSHAKE)) {
175 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
176 }
177 return QuicPacketGenerator::AddMessageFrame(message_id, message);
178 }
179
180 size_t ConsumeCryptoData(EncryptionLevel level,
181 QuicStringPiece data,
182 QuicStreamOffset offset) {
183 producer_->SaveCryptoData(level, offset, data);
184 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode) &&
185 !QuicPacketGeneratorPeer::GetPacketCreator(this)->has_ack() &&
186 delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
187 NOT_HANDSHAKE)) {
188 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
189 }
190 return QuicPacketGenerator::ConsumeCryptoData(level, data.length(), offset);
191 }
192
193 QuicAckFrame ack_frame_;
194 MockDelegate* delegate_;
195 SimpleDataProducer* producer_;
196};
197
198class QuicPacketGeneratorTest : public QuicTest {
199 public:
200 QuicPacketGeneratorTest()
201 : framer_(AllSupportedVersions(),
202 QuicTime::Zero(),
203 Perspective::IS_CLIENT,
204 kQuicDefaultConnectionIdLength),
205 generator_(TestConnectionId(),
206 &framer_,
207 &random_generator_,
208 &delegate_,
209 &producer_),
210 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)),
211 ack_frame_(InitAckFrame(1)) {
212 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
213 creator_->SetEncrypter(
214 ENCRYPTION_FORWARD_SECURE,
215 QuicMakeUnique<NullEncrypter>(Perspective::IS_CLIENT));
216 creator_->set_encryption_level(ENCRYPTION_FORWARD_SECURE);
217 framer_.set_data_producer(&producer_);
218 generator_.AttachPacketFlusher();
219 }
220
221 ~QuicPacketGeneratorTest() override {
222 for (SerializedPacket& packet : packets_) {
223 delete[] packet.encrypted_buffer;
224 ClearSerializedPacket(&packet);
225 }
226 }
227
228 void SavePacket(SerializedPacket* packet) {
229 packet->encrypted_buffer = CopyBuffer(*packet);
230 packets_.push_back(*packet);
231 packet->encrypted_buffer = nullptr;
232 packet->retransmittable_frames.clear();
233 }
234
235 protected:
236 QuicRstStreamFrame* CreateRstStreamFrame() {
237 return new QuicRstStreamFrame(1, 1, QUIC_STREAM_NO_ERROR, 0);
238 }
239
240 QuicGoAwayFrame* CreateGoAwayFrame() {
vasilvvc48c8712019-03-11 13:38:16 -0700241 return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, std::string());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500242 }
243
244 void CheckPacketContains(const PacketContents& contents,
245 size_t packet_index) {
246 ASSERT_GT(packets_.size(), packet_index);
247 const SerializedPacket& packet = packets_[packet_index];
248 size_t num_retransmittable_frames =
249 contents.num_connection_close_frames + contents.num_goaway_frames +
250 contents.num_rst_stream_frames + contents.num_stream_frames +
251 contents.num_crypto_frames + contents.num_ping_frames;
252 size_t num_frames =
253 contents.num_ack_frames + contents.num_stop_waiting_frames +
254 contents.num_mtu_discovery_frames + contents.num_padding_frames +
255 num_retransmittable_frames;
256
257 if (num_retransmittable_frames == 0) {
258 ASSERT_TRUE(packet.retransmittable_frames.empty());
259 } else {
260 ASSERT_FALSE(packet.retransmittable_frames.empty());
261 EXPECT_EQ(num_retransmittable_frames,
262 packet.retransmittable_frames.size());
263 }
264
265 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
266 ASSERT_TRUE(simple_framer_.ProcessPacket(
267 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
268 EXPECT_EQ(num_frames, simple_framer_.num_frames());
269 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
270 EXPECT_EQ(contents.num_connection_close_frames,
271 simple_framer_.connection_close_frames().size());
272 EXPECT_EQ(contents.num_goaway_frames,
273 simple_framer_.goaway_frames().size());
274 EXPECT_EQ(contents.num_rst_stream_frames,
275 simple_framer_.rst_stream_frames().size());
276 EXPECT_EQ(contents.num_stream_frames,
277 simple_framer_.stream_frames().size());
278 EXPECT_EQ(contents.num_crypto_frames,
279 simple_framer_.crypto_frames().size());
280 EXPECT_EQ(contents.num_stop_waiting_frames,
281 simple_framer_.stop_waiting_frames().size());
282 EXPECT_EQ(contents.num_padding_frames,
283 simple_framer_.padding_frames().size());
284
285 // From the receiver's perspective, MTU discovery frames are ping frames.
286 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames,
287 simple_framer_.ping_frames().size());
288 }
289
290 void CheckPacketHasSingleStreamFrame(size_t packet_index) {
291 ASSERT_GT(packets_.size(), packet_index);
292 const SerializedPacket& packet = packets_[packet_index];
293 ASSERT_FALSE(packet.retransmittable_frames.empty());
294 EXPECT_EQ(1u, packet.retransmittable_frames.size());
295 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
296 ASSERT_TRUE(simple_framer_.ProcessPacket(
297 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
298 EXPECT_EQ(1u, simple_framer_.num_frames());
299 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
300 }
301
302 void CheckAllPacketsHaveSingleStreamFrame() {
303 for (size_t i = 0; i < packets_.size(); i++) {
304 CheckPacketHasSingleStreamFrame(i);
305 }
306 }
307
308 void CreateData(size_t len) {
309 data_array_.reset(new char[len]);
310 memset(data_array_.get(), '?', len);
311 iov_.iov_base = data_array_.get();
312 iov_.iov_len = len;
313 }
314
315 QuicFramer framer_;
316 MockRandom random_generator_;
317 StrictMock<MockDelegate> delegate_;
318 TestPacketGenerator generator_;
319 QuicPacketCreator* creator_;
320 SimpleQuicFramer simple_framer_;
321 std::vector<SerializedPacket> packets_;
322 QuicAckFrame ack_frame_;
323 struct iovec iov_;
324 SimpleBufferAllocator allocator_;
325
326 private:
327 std::unique_ptr<char[]> data_array_;
328 SimpleDataProducer producer_;
329};
330
331class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
332 public:
333 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&));
334};
335
336TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) {
337 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
338 return;
339 }
340 delegate_.SetCanNotWrite();
341
342 generator_.SetShouldSendAck(false);
343 EXPECT_TRUE(generator_.HasQueuedFrames());
344 EXPECT_FALSE(generator_.HasRetransmittableFrames());
345}
346
347TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) {
348 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
349 return;
350 }
351 StrictMock<MockDebugDelegate> debug_delegate;
352
353 generator_.set_debug_delegate(&debug_delegate);
354 delegate_.SetCanWriteOnlyNonRetransmittable();
355
356 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
357 .WillOnce(Return(QuicFrame(&ack_frame_)));
358 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1);
359
360 generator_.SetShouldSendAck(false);
361 EXPECT_TRUE(generator_.HasQueuedFrames());
362 EXPECT_FALSE(generator_.HasRetransmittableFrames());
363}
364
365TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) {
366 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
367 return;
368 }
369 delegate_.SetCanWriteOnlyNonRetransmittable();
370
371 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
372 .WillOnce(Return(QuicFrame(&ack_frame_)));
373 EXPECT_CALL(delegate_, OnSerializedPacket(_))
374 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
375
376 generator_.SetShouldSendAck(false);
377 generator_.Flush();
378 EXPECT_FALSE(generator_.HasQueuedFrames());
379 EXPECT_FALSE(generator_.HasRetransmittableFrames());
380
381 PacketContents contents;
382 contents.num_ack_frames = 1;
383 CheckPacketContains(contents, 0);
384}
385
386TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) {
387 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
388 return;
389 }
390 // Make sure that calling SetShouldSendAck multiple times does not result in a
391 // crash. Previously this would result in multiple QuicFrames queued in the
392 // packet generator, with all but the last with internal pointers to freed
393 // memory.
394 delegate_.SetCanWriteAnything();
395
396 // Only one AckFrame should be created.
397 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
398 .WillOnce(Return(QuicFrame(&ack_frame_)));
399 EXPECT_CALL(delegate_, OnSerializedPacket(_))
400 .Times(1)
401 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
402
403 generator_.SetShouldSendAck(false);
404 generator_.SetShouldSendAck(false);
405 generator_.Flush();
406}
407
408TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) {
409 delegate_.SetCanNotWrite();
410
411 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()),
412 /*bundle_ack=*/false);
413 EXPECT_TRUE(generator_.HasQueuedFrames());
414 EXPECT_TRUE(generator_.HasRetransmittableFrames());
415}
416
417TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) {
418 delegate_.SetCanWriteOnlyNonRetransmittable();
419
420 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()),
421 /*bundle_ack=*/false);
422 EXPECT_TRUE(generator_.HasQueuedFrames());
423 EXPECT_TRUE(generator_.HasRetransmittableFrames());
424}
425
426TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) {
427 delegate_.SetCanWriteAnything();
428
429 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()),
430 /*bundle_ack=*/false);
431 EXPECT_TRUE(generator_.HasQueuedFrames());
432 EXPECT_TRUE(generator_.HasRetransmittableFrames());
433}
434
435TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) {
436 delegate_.SetCanNotWrite();
437
438 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()),
439 /*bundle_ack=*/false);
440 EXPECT_TRUE(generator_.HasQueuedFrames());
441 EXPECT_TRUE(generator_.HasRetransmittableFrames());
442 generator_.Flush();
443 EXPECT_TRUE(generator_.HasQueuedFrames());
444 EXPECT_TRUE(generator_.HasRetransmittableFrames());
445
446 EXPECT_CALL(delegate_, OnSerializedPacket(_))
447 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
448 generator_.AttachPacketFlusher();
449 generator_.FlushAllQueuedFrames();
450 EXPECT_FALSE(generator_.HasQueuedFrames());
451 EXPECT_FALSE(generator_.HasRetransmittableFrames());
452
453 PacketContents contents;
454 contents.num_rst_stream_frames = 1;
455 CheckPacketContains(contents, 0);
456}
457
458TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) {
459 delegate_.SetCanWriteAnything();
460
461 EXPECT_CALL(delegate_, OnSerializedPacket(_))
462 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
463
464 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()),
465 /*bundle_ack=*/false);
466 generator_.Flush();
467 EXPECT_FALSE(generator_.HasQueuedFrames());
468 EXPECT_FALSE(generator_.HasRetransmittableFrames());
469
470 PacketContents contents;
471 contents.num_rst_stream_frames = 1;
472 CheckPacketContains(contents, 0);
473}
474
475TEST_F(QuicPacketGeneratorTest, ConsumeCryptoData) {
476 delegate_.SetCanWriteAnything();
477
478 EXPECT_CALL(delegate_, OnSerializedPacket(_))
479 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
vasilvvc48c8712019-03-11 13:38:16 -0700480 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500481 size_t consumed_bytes =
QUICHE team6987b4a2019-03-15 16:23:04 -0700482 generator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500483 generator_.Flush();
484 EXPECT_EQ(data.length(), consumed_bytes);
485 EXPECT_FALSE(generator_.HasQueuedFrames());
486 EXPECT_FALSE(generator_.HasRetransmittableFrames());
487
488 PacketContents contents;
489 contents.num_crypto_frames = 1;
490 contents.num_padding_frames = 1;
491 CheckPacketContains(contents, 0);
492}
493
494TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) {
495 delegate_.SetCanNotWrite();
496
497 MakeIOVector("foo", &iov_);
498 QuicConsumedData consumed = generator_.ConsumeData(
499 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
500 iov_.iov_len, 0, FIN);
501 EXPECT_EQ(0u, consumed.bytes_consumed);
502 EXPECT_FALSE(consumed.fin_consumed);
503 EXPECT_FALSE(generator_.HasQueuedFrames());
504 EXPECT_FALSE(generator_.HasRetransmittableFrames());
505}
506
507TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) {
508 delegate_.SetCanWriteAnything();
509
510 MakeIOVector("foo", &iov_);
511 QuicConsumedData consumed = generator_.ConsumeData(
512 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
513 iov_.iov_len, 0, FIN);
514 EXPECT_EQ(3u, consumed.bytes_consumed);
515 EXPECT_TRUE(consumed.fin_consumed);
516 EXPECT_TRUE(generator_.HasQueuedFrames());
517 EXPECT_TRUE(generator_.HasRetransmittableFrames());
518}
519
520TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) {
521 delegate_.SetCanWriteAnything();
522
523 EXPECT_CALL(delegate_, OnSerializedPacket(_))
524 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
525 MakeIOVector("foo", &iov_);
526 QuicConsumedData consumed = generator_.ConsumeData(
527 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
528 iov_.iov_len, 0, FIN);
529 generator_.Flush();
530 EXPECT_EQ(3u, consumed.bytes_consumed);
531 EXPECT_TRUE(consumed.fin_consumed);
532 EXPECT_FALSE(generator_.HasQueuedFrames());
533 EXPECT_FALSE(generator_.HasRetransmittableFrames());
534
535 PacketContents contents;
536 contents.num_stream_frames = 1;
537 CheckPacketContains(contents, 0);
538}
539
540// Test the behavior of ConsumeData when the data consumed is for the crypto
541// handshake stream. Ensure that the packet is always sent and padded even if
542// the generator operates in batch mode.
543TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) {
544 delegate_.SetCanWriteAnything();
545
546 EXPECT_CALL(delegate_, OnSerializedPacket(_))
547 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
548 MakeIOVector("foo", &iov_);
549 QuicConsumedData consumed = generator_.ConsumeData(
550 QuicUtils::GetCryptoStreamId(framer_.transport_version()), &iov_, 1u,
551 iov_.iov_len, 0, NO_FIN);
552 EXPECT_EQ(3u, consumed.bytes_consumed);
553 EXPECT_FALSE(generator_.HasQueuedFrames());
554 EXPECT_FALSE(generator_.HasRetransmittableFrames());
555
556 PacketContents contents;
557 contents.num_stream_frames = 1;
558 contents.num_padding_frames = 1;
559 CheckPacketContains(contents, 0);
560
561 ASSERT_EQ(1u, packets_.size());
562 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength());
563 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
564}
565
566// Test the behavior of ConsumeData when the data is for the crypto handshake
567// stream, but padding is disabled.
568TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake_PaddingDisabled) {
569 generator_.set_fully_pad_crypto_hadshake_packets(false);
570
571 delegate_.SetCanWriteAnything();
572
573 EXPECT_CALL(delegate_, OnSerializedPacket(_))
574 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
575 MakeIOVector("foo", &iov_);
576 QuicConsumedData consumed = generator_.ConsumeData(
577 QuicUtils::GetCryptoStreamId(framer_.transport_version()), &iov_, 1u,
578 iov_.iov_len, 0, NO_FIN);
579 EXPECT_EQ(3u, consumed.bytes_consumed);
580 EXPECT_FALSE(generator_.HasQueuedFrames());
581 EXPECT_FALSE(generator_.HasRetransmittableFrames());
582
583 PacketContents contents;
584 contents.num_stream_frames = 1;
585 contents.num_padding_frames = 0;
586 CheckPacketContains(contents, 0);
587
588 ASSERT_EQ(1u, packets_.size());
589
590 // Packet is not fully padded, but we want to future packets to be larger.
591 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength());
592 EXPECT_EQ(27, packets_[0].encrypted_length);
593}
594
595TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) {
596 delegate_.SetCanWriteAnything();
597
598 EXPECT_QUIC_BUG(generator_.ConsumeData(QuicUtils::GetHeadersStreamId(
599 framer_.transport_version()),
600 nullptr, 0, 0, 0, NO_FIN),
601 "Attempt to consume empty data without FIN.");
602}
603
604TEST_F(QuicPacketGeneratorTest,
605 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
606 delegate_.SetCanWriteAnything();
607
608 MakeIOVector("foo", &iov_);
609 generator_.ConsumeData(
610 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
611 iov_.iov_len, 0, FIN);
612 MakeIOVector("quux", &iov_);
613 QuicConsumedData consumed =
614 generator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 3, NO_FIN);
615 EXPECT_EQ(4u, consumed.bytes_consumed);
616 EXPECT_FALSE(consumed.fin_consumed);
617 EXPECT_TRUE(generator_.HasQueuedFrames());
618 EXPECT_TRUE(generator_.HasRetransmittableFrames());
619}
620
621TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) {
622 delegate_.SetCanWriteAnything();
623
624 MakeIOVector("foo", &iov_);
625 generator_.ConsumeData(
626 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
627 iov_.iov_len, 0, FIN);
628 MakeIOVector("quux", &iov_);
629 QuicConsumedData consumed = generator_.ConsumeData(
630 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
631 iov_.iov_len, 3, NO_FIN);
632 EXPECT_EQ(4u, consumed.bytes_consumed);
633 EXPECT_FALSE(consumed.fin_consumed);
634 EXPECT_TRUE(generator_.HasQueuedFrames());
635 EXPECT_TRUE(generator_.HasRetransmittableFrames());
636
637 // Now both frames will be flushed out.
638 EXPECT_CALL(delegate_, OnSerializedPacket(_))
639 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
640 generator_.Flush();
641 EXPECT_FALSE(generator_.HasQueuedFrames());
642 EXPECT_FALSE(generator_.HasRetransmittableFrames());
643
644 PacketContents contents;
645 contents.num_stream_frames = 2;
646 CheckPacketContains(contents, 0);
647}
648
649TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
650 // Set the packet size be enough for two stream frames with 0 stream offset,
651 // but not enough for a stream frame of 0 offset and one with non-zero offset.
652 size_t length =
653 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
654 GetPacketHeaderSize(
655 framer_.transport_version(),
656 creator_->GetDestinationConnectionIdLength(),
657 creator_->GetSourceConnectionIdLength(),
658 QuicPacketCreatorPeer::SendVersionInPacket(creator_),
659 !kIncludeDiversificationNonce,
660 QuicPacketCreatorPeer::GetPacketNumberLength(creator_),
661 QuicPacketCreatorPeer::GetRetryTokenLengthLength(creator_), 0,
662 QuicPacketCreatorPeer::GetLengthLength(creator_)) +
663 // Add an extra 3 bytes for the payload and 1 byte so
664 // BytesFree is larger than the GetMinStreamFrameSize.
665 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0,
666 false, 3) +
667 3 +
668 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0, true,
669 1) +
670 1;
671 generator_.SetMaxPacketLength(length);
672 delegate_.SetCanWriteAnything();
673 {
674 InSequence dummy;
675 EXPECT_CALL(delegate_, OnSerializedPacket(_))
676 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
677 EXPECT_CALL(delegate_, OnSerializedPacket(_))
678 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
679 }
680 // Queue enough data to prevent a stream frame with a non-zero offset from
681 // fitting.
682 MakeIOVector("foo", &iov_);
683 QuicConsumedData consumed = generator_.ConsumeData(
684 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
685 iov_.iov_len, 0, NO_FIN);
686 EXPECT_EQ(3u, consumed.bytes_consumed);
687 EXPECT_FALSE(consumed.fin_consumed);
688 EXPECT_TRUE(generator_.HasQueuedFrames());
689 EXPECT_TRUE(generator_.HasRetransmittableFrames());
690
691 // This frame will not fit with the existing frame, causing the queued frame
692 // to be serialized, and it will be added to a new open packet.
693 MakeIOVector("bar", &iov_);
694 consumed = generator_.ConsumeData(
695 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
696 iov_.iov_len, 3, FIN);
697 EXPECT_EQ(3u, consumed.bytes_consumed);
698 EXPECT_TRUE(consumed.fin_consumed);
699 EXPECT_TRUE(generator_.HasQueuedFrames());
700 EXPECT_TRUE(generator_.HasRetransmittableFrames());
701
702 creator_->Flush();
703 EXPECT_FALSE(generator_.HasQueuedFrames());
704 EXPECT_FALSE(generator_.HasRetransmittableFrames());
705
706 PacketContents contents;
707 contents.num_stream_frames = 1;
708 CheckPacketContains(contents, 0);
709 CheckPacketContains(contents, 1);
710}
711
712TEST_F(QuicPacketGeneratorTest, ConsumeDataFastPath) {
713 delegate_.SetCanWriteAnything();
714 generator_.SetCanSetTransmissionType(true);
715 generator_.SetTransmissionType(LOSS_RETRANSMISSION);
716
717 // Create a 10000 byte IOVector.
718 CreateData(10000);
719 EXPECT_CALL(delegate_, OnSerializedPacket(_))
720 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
721 QuicConsumedData consumed = generator_.ConsumeDataFastPath(
722 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
723 iov_.iov_len, 0, true);
724 EXPECT_EQ(10000u, consumed.bytes_consumed);
725 EXPECT_TRUE(consumed.fin_consumed);
726 EXPECT_FALSE(generator_.HasQueuedFrames());
727 EXPECT_FALSE(generator_.HasRetransmittableFrames());
728
729 PacketContents contents;
730 contents.num_stream_frames = 1;
731 CheckPacketContains(contents, 0);
732 EXPECT_FALSE(packets_.empty());
733 SerializedPacket packet = packets_.back();
734 EXPECT_TRUE(!packet.retransmittable_frames.empty());
735 EXPECT_EQ(LOSS_RETRANSMISSION, packet.transmission_type);
736 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
737 const QuicStreamFrame& stream_frame =
738 packet.retransmittable_frames.front().stream_frame;
739 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
740}
741
742TEST_F(QuicPacketGeneratorTest, ConsumeDataLarge) {
743 delegate_.SetCanWriteAnything();
744
745 // Create a 10000 byte IOVector.
746 CreateData(10000);
747 EXPECT_CALL(delegate_, OnSerializedPacket(_))
748 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
749 QuicConsumedData consumed = generator_.ConsumeData(
750 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
751 iov_.iov_len, 0, FIN);
752 EXPECT_EQ(10000u, consumed.bytes_consumed);
753 EXPECT_TRUE(consumed.fin_consumed);
754 EXPECT_FALSE(generator_.HasQueuedFrames());
755 EXPECT_FALSE(generator_.HasRetransmittableFrames());
756
757 PacketContents contents;
758 contents.num_stream_frames = 1;
759 CheckPacketContains(contents, 0);
760 EXPECT_FALSE(packets_.empty());
761 SerializedPacket packet = packets_.back();
762 EXPECT_TRUE(!packet.retransmittable_frames.empty());
763 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
764 const QuicStreamFrame& stream_frame =
765 packet.retransmittable_frames.front().stream_frame;
766 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
767}
768
769TEST_F(QuicPacketGeneratorTest, ConsumeDataLargeSendAckFalse) {
770 delegate_.SetCanNotWrite();
771
772 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
773 generator_.SetShouldSendAck(false);
774 }
775 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()),
776 /*bundle_ack=*/true);
777 EXPECT_TRUE(generator_.HasQueuedFrames());
778 EXPECT_TRUE(generator_.HasRetransmittableFrames());
779
780 delegate_.SetCanWriteAnything();
781
782 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
783 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
784 .WillOnce(Return(QuicFrame(&ack_frame_)));
785 }
786
787 // Create a 10000 byte IOVector.
788 CreateData(10000);
789 EXPECT_CALL(delegate_, OnSerializedPacket(_))
790 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
791 QuicConsumedData consumed = generator_.ConsumeData(
792 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
793 iov_.iov_len, 0, FIN);
794 generator_.Flush();
795
796 EXPECT_EQ(10000u, consumed.bytes_consumed);
797 EXPECT_TRUE(consumed.fin_consumed);
798 EXPECT_FALSE(generator_.HasQueuedFrames());
799 EXPECT_FALSE(generator_.HasRetransmittableFrames());
800
801 EXPECT_FALSE(packets_.empty());
802 SerializedPacket packet = packets_.back();
803 EXPECT_TRUE(!packet.retransmittable_frames.empty());
804 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
805 const QuicStreamFrame& stream_frame =
806 packet.retransmittable_frames.front().stream_frame;
807 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
808}
809
810TEST_F(QuicPacketGeneratorTest, ConsumeDataLargeSendAckTrue) {
811 if (framer_.transport_version() > QUIC_VERSION_43) {
812 return;
813 }
814 delegate_.SetCanNotWrite();
815 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
816 generator_.SetShouldSendAck(true /* stop_waiting */);
817 }
818 delegate_.SetCanWriteAnything();
819
820 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
821 // Set up frames to write into the creator when control frames are written.
822 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
823 .WillOnce(Return(QuicFrame(&ack_frame_)));
824 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_));
825 // Generator should have queued control frames, and creator should be empty.
826 EXPECT_TRUE(generator_.HasQueuedFrames());
827 EXPECT_FALSE(generator_.HasRetransmittableFrames());
828 EXPECT_FALSE(creator_->HasPendingFrames());
829 }
830
831 // Create a 10000 byte IOVector.
832 CreateData(10000);
833 EXPECT_CALL(delegate_, OnSerializedPacket(_))
834 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
835 QuicConsumedData consumed = generator_.ConsumeData(
836 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
837 iov_.iov_len, 0, FIN);
838 generator_.Flush();
839
840 EXPECT_EQ(10000u, consumed.bytes_consumed);
841 EXPECT_TRUE(consumed.fin_consumed);
842 EXPECT_FALSE(generator_.HasQueuedFrames());
843 EXPECT_FALSE(generator_.HasRetransmittableFrames());
844
845 EXPECT_FALSE(packets_.empty());
846 SerializedPacket packet = packets_.back();
847 EXPECT_TRUE(!packet.retransmittable_frames.empty());
848 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
849 const QuicStreamFrame& stream_frame =
850 packet.retransmittable_frames.front().stream_frame;
851 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
852}
853
854TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) {
855 delegate_.SetCanNotWrite();
856
857 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
858 generator_.SetShouldSendAck(false);
859 }
860 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()),
861 /*bundle_ack=*/true);
862 EXPECT_TRUE(generator_.HasQueuedFrames());
863 EXPECT_TRUE(generator_.HasRetransmittableFrames());
864 EXPECT_FALSE(generator_.HasPendingStreamFramesOfStream(3));
865
866 delegate_.SetCanWriteAnything();
867
868 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
869 // When the first write operation is invoked, the ack frame will be
870 // returned.
871 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
872 .WillOnce(Return(QuicFrame(&ack_frame_)));
873 }
874
875 // Send some data and a control frame
876 MakeIOVector("quux", &iov_);
877 generator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
878 if (framer_.transport_version() != QUIC_VERSION_99) {
879 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()),
880 /*bundle_ack=*/false);
881 }
882 EXPECT_TRUE(generator_.HasPendingStreamFramesOfStream(3));
883
884 // All five frames will be flushed out in a single packet.
885 EXPECT_CALL(delegate_, OnSerializedPacket(_))
886 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
887 generator_.Flush();
888 EXPECT_FALSE(generator_.HasQueuedFrames());
889 EXPECT_FALSE(generator_.HasRetransmittableFrames());
890 EXPECT_FALSE(generator_.HasPendingStreamFramesOfStream(3));
891
892 PacketContents contents;
893 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
894 // ACK will be flushed by connection.
895 contents.num_ack_frames = 0;
896 } else {
897 contents.num_ack_frames = 1;
898 }
899 if (framer_.transport_version() != QUIC_VERSION_99) {
900 contents.num_goaway_frames = 1;
901 } else {
902 contents.num_goaway_frames = 0;
903 }
904 contents.num_rst_stream_frames = 1;
905 contents.num_stream_frames = 1;
906 CheckPacketContains(contents, 0);
907}
908
909TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) {
910 delegate_.SetCanNotWrite();
911
912 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
913 generator_.SetShouldSendAck(false);
914 }
915 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()),
916 /*bundle_ack=*/true);
917 EXPECT_TRUE(generator_.HasQueuedFrames());
918 EXPECT_TRUE(generator_.HasRetransmittableFrames());
919
920 delegate_.SetCanWriteAnything();
921
922 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
923 // When the first write operation is invoked, the ack frame will be
924 // returned.
925 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
926 .WillOnce(Return(QuicFrame(&ack_frame_)));
927 }
928
929 {
930 InSequence dummy;
931 // All five frames will be flushed out in a single packet
932 EXPECT_CALL(delegate_, OnSerializedPacket(_))
933 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
934 EXPECT_CALL(delegate_, OnSerializedPacket(_))
935 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
936 }
937
938 // Send enough data to exceed one packet
939 size_t data_len = kDefaultMaxPacketSize + 100;
940 CreateData(data_len);
941 QuicConsumedData consumed =
942 generator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, FIN);
943 EXPECT_EQ(data_len, consumed.bytes_consumed);
944 EXPECT_TRUE(consumed.fin_consumed);
945 if (framer_.transport_version() != QUIC_VERSION_99) {
946 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()),
947 /*bundle_ack=*/false);
948 }
949
950 generator_.Flush();
951 EXPECT_FALSE(generator_.HasQueuedFrames());
952 EXPECT_FALSE(generator_.HasRetransmittableFrames());
953
954 // The first packet should have the queued data and part of the stream data.
955 PacketContents contents;
956 if (GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
957 // ACK will be sent by connection.
958 contents.num_ack_frames = 0;
959 } else {
960 contents.num_ack_frames = 1;
961 }
962 contents.num_rst_stream_frames = 1;
963 contents.num_stream_frames = 1;
964 CheckPacketContains(contents, 0);
965
966 // The second should have the remainder of the stream data.
967 PacketContents contents2;
968 if (framer_.transport_version() != QUIC_VERSION_99) {
969 contents2.num_goaway_frames = 1;
970 } else {
971 contents2.num_goaway_frames = 0;
972 }
973 contents2.num_stream_frames = 1;
974 CheckPacketContains(contents2, 1);
975}
976
977// Regression test of b/120493795.
978TEST_F(QuicPacketGeneratorTest, PacketTransmissionType) {
979 delegate_.SetCanWriteAnything();
980 generator_.SetCanSetTransmissionType(true);
981
982 // The first ConsumeData will fill the packet without flush.
983 generator_.SetTransmissionType(LOSS_RETRANSMISSION);
984
985 size_t data_len = 1324;
986 CreateData(data_len);
987 QuicStreamId stream1_id =
988 QuicUtils::GetHeadersStreamId(framer_.transport_version());
989 QuicConsumedData consumed =
990 generator_.ConsumeData(stream1_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
991 EXPECT_EQ(data_len, consumed.bytes_consumed);
992 ASSERT_EQ(0u, creator_->BytesFree())
993 << "Test setup failed: Please increase data_len to "
994 << data_len + creator_->BytesFree() << " bytes.";
995
996 // The second ConsumeData can not be added to the packet and will flush.
997 generator_.SetTransmissionType(NOT_RETRANSMISSION);
998
999 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1000 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1001
1002 QuicStreamId stream2_id = stream1_id + 4;
1003
1004 consumed =
1005 generator_.ConsumeData(stream2_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
1006 EXPECT_EQ(data_len, consumed.bytes_consumed);
1007
1008 // Ensure the packet is successfully created.
1009 ASSERT_EQ(1u, packets_.size());
1010 ASSERT_TRUE(packets_[0].encrypted_buffer);
1011 ASSERT_EQ(1u, packets_[0].retransmittable_frames.size());
1012 EXPECT_EQ(stream1_id,
1013 packets_[0].retransmittable_frames[0].stream_frame.stream_id);
1014 if (GetQuicReloadableFlag(quic_set_transmission_type_for_next_frame)) {
1015 // Since the second frame was not added, the packet's transmission type
1016 // should be the first frame's type.
1017 EXPECT_EQ(packets_[0].transmission_type, LOSS_RETRANSMISSION);
1018 } else {
1019 EXPECT_EQ(packets_[0].transmission_type, NOT_RETRANSMISSION);
1020 }
1021}
1022
1023TEST_F(QuicPacketGeneratorTest, TestConnectionIdLength) {
1024 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
1025 generator_.SetConnectionIdLength(0);
1026 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
1027 creator_->GetDestinationConnectionIdLength());
1028
1029 for (size_t i = 1; i < 10; i++) {
1030 generator_.SetConnectionIdLength(i);
1031 if (framer_.transport_version() > QUIC_VERSION_43) {
1032 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
1033 creator_->GetDestinationConnectionIdLength());
1034 } else {
1035 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID,
1036 creator_->GetDestinationConnectionIdLength());
1037 }
1038 }
1039}
1040
1041// Test whether SetMaxPacketLength() works in the situation when the queue is
1042// empty, and we send three packets worth of data.
1043TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Initial) {
1044 delegate_.SetCanWriteAnything();
1045
1046 // Send enough data for three packets.
1047 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
1048 size_t packet_len = kDefaultMaxPacketSize + 100;
1049 ASSERT_LE(packet_len, kMaxPacketSize);
1050 generator_.SetMaxPacketLength(packet_len);
1051 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength());
1052
1053 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1054 .Times(3)
1055 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1056 CreateData(data_len);
1057 QuicConsumedData consumed = generator_.ConsumeData(
1058 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
1059 iov_.iov_len,
1060 /*offset=*/0, FIN);
1061 EXPECT_EQ(data_len, consumed.bytes_consumed);
1062 EXPECT_TRUE(consumed.fin_consumed);
1063 EXPECT_FALSE(generator_.HasQueuedFrames());
1064 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1065
1066 // We expect three packets, and first two of them have to be of packet_len
1067 // size. We check multiple packets (instead of just one) because we want to
1068 // ensure that |max_packet_length_| does not get changed incorrectly by the
1069 // generator after first packet is serialized.
1070 ASSERT_EQ(3u, packets_.size());
1071 EXPECT_EQ(packet_len, packets_[0].encrypted_length);
1072 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
1073 CheckAllPacketsHaveSingleStreamFrame();
1074}
1075
1076// Test whether SetMaxPacketLength() works in the situation when we first write
1077// data, then change packet size, then write data again.
1078TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Middle) {
1079 delegate_.SetCanWriteAnything();
1080
1081 // We send enough data to overflow default packet length, but not the altered
1082 // one.
1083 size_t data_len = kDefaultMaxPacketSize;
1084 size_t packet_len = kDefaultMaxPacketSize + 100;
1085 ASSERT_LE(packet_len, kMaxPacketSize);
1086
1087 // We expect to see three packets in total.
1088 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1089 .Times(3)
1090 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1091
1092 // Send two packets before packet size change.
1093 CreateData(data_len);
1094 QuicConsumedData consumed = generator_.ConsumeData(
1095 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
1096 iov_.iov_len,
1097 /*offset=*/0, NO_FIN);
1098 generator_.Flush();
1099 EXPECT_EQ(data_len, consumed.bytes_consumed);
1100 EXPECT_FALSE(consumed.fin_consumed);
1101 EXPECT_FALSE(generator_.HasQueuedFrames());
1102 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1103
1104 // Make sure we already have two packets.
1105 ASSERT_EQ(2u, packets_.size());
1106
1107 // Increase packet size.
1108 generator_.SetMaxPacketLength(packet_len);
1109 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength());
1110
1111 // Send a packet after packet size change.
1112 CreateData(data_len);
1113 generator_.AttachPacketFlusher();
1114 consumed = generator_.ConsumeData(
1115 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
1116 iov_.iov_len, data_len, FIN);
1117 generator_.Flush();
1118 EXPECT_EQ(data_len, consumed.bytes_consumed);
1119 EXPECT_TRUE(consumed.fin_consumed);
1120 EXPECT_FALSE(generator_.HasQueuedFrames());
1121 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1122
1123 // We expect first data chunk to get fragmented, but the second one to fit
1124 // into a single packet.
1125 ASSERT_EQ(3u, packets_.size());
1126 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
1127 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length);
1128 CheckAllPacketsHaveSingleStreamFrame();
1129}
1130
1131// Test whether SetMaxPacketLength() works correctly when we force the change of
1132// the packet size in the middle of the batched packet.
1133TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) {
1134 delegate_.SetCanWriteAnything();
1135
1136 size_t first_write_len = kDefaultMaxPacketSize / 2;
1137 size_t packet_len = kDefaultMaxPacketSize + 100;
1138 size_t second_write_len = packet_len + 1;
1139 ASSERT_LE(packet_len, kMaxPacketSize);
1140
1141 // First send half of the packet worth of data. We are in the batch mode, so
1142 // should not cause packet serialization.
1143 CreateData(first_write_len);
1144 QuicConsumedData consumed = generator_.ConsumeData(
1145 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
1146 iov_.iov_len,
1147 /*offset=*/0, NO_FIN);
1148 EXPECT_EQ(first_write_len, consumed.bytes_consumed);
1149 EXPECT_FALSE(consumed.fin_consumed);
1150 EXPECT_TRUE(generator_.HasQueuedFrames());
1151 EXPECT_TRUE(generator_.HasRetransmittableFrames());
1152
1153 // Make sure we have no packets so far.
1154 ASSERT_EQ(0u, packets_.size());
1155
1156 // Expect a packet to be flushed.
1157 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1158 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1159
1160 // Increase packet size after flushing all frames.
1161 // Ensure it's immediately enacted.
1162 generator_.FlushAllQueuedFrames();
1163 generator_.SetMaxPacketLength(packet_len);
1164 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength());
1165 EXPECT_FALSE(generator_.HasQueuedFrames());
1166 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1167
1168 // We expect to see exactly one packet serialized after that, because we send
1169 // a value somewhat exceeding new max packet size, and the tail data does not
1170 // get serialized because we are still in the batch mode.
1171 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1172 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1173
1174 // Send a more than a packet worth of data to the same stream. This should
1175 // trigger serialization of one packet, and queue another one.
1176 CreateData(second_write_len);
1177 consumed = generator_.ConsumeData(
1178 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
1179 iov_.iov_len,
1180 /*offset=*/first_write_len, FIN);
1181 EXPECT_EQ(second_write_len, consumed.bytes_consumed);
1182 EXPECT_TRUE(consumed.fin_consumed);
1183 EXPECT_TRUE(generator_.HasQueuedFrames());
1184 EXPECT_TRUE(generator_.HasRetransmittableFrames());
1185
1186 // We expect the first packet to be underfilled, and the second packet be up
1187 // to the new max packet size.
1188 ASSERT_EQ(2u, packets_.size());
1189 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length);
1190 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
1191
1192 CheckAllPacketsHaveSingleStreamFrame();
1193}
1194
1195// Test sending a connectivity probing packet.
1196TEST_F(QuicPacketGeneratorTest, GenerateConnectivityProbingPacket) {
1197 delegate_.SetCanWriteAnything();
1198
1199 OwningSerializedPacketPointer probing_packet;
1200 if (framer_.transport_version() == QUIC_VERSION_99) {
1201 QuicPathFrameBuffer payload = {
1202 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
1203 probing_packet =
1204 generator_.SerializePathChallengeConnectivityProbingPacket(&payload);
1205 } else {
1206 probing_packet = generator_.SerializeConnectivityProbingPacket();
1207 }
1208
1209 ASSERT_TRUE(simple_framer_.ProcessPacket(QuicEncryptedPacket(
1210 probing_packet->encrypted_buffer, probing_packet->encrypted_length)));
1211
1212 EXPECT_EQ(2u, simple_framer_.num_frames());
1213 if (framer_.transport_version() == QUIC_VERSION_99) {
1214 EXPECT_EQ(1u, simple_framer_.path_challenge_frames().size());
1215 } else {
1216 EXPECT_EQ(1u, simple_framer_.ping_frames().size());
1217 }
1218 EXPECT_EQ(1u, simple_framer_.padding_frames().size());
1219}
1220
1221// Test sending an MTU probe, without any surrounding data.
1222TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) {
1223 delegate_.SetCanWriteAnything();
1224
1225 const size_t target_mtu = kDefaultMaxPacketSize + 100;
1226 static_assert(target_mtu < kMaxPacketSize,
1227 "The MTU probe used by the test exceeds maximum packet size");
1228
1229 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1230 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1231
1232 generator_.GenerateMtuDiscoveryPacket(target_mtu);
1233
1234 EXPECT_FALSE(generator_.HasQueuedFrames());
1235 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1236 ASSERT_EQ(1u, packets_.size());
1237 EXPECT_EQ(target_mtu, packets_[0].encrypted_length);
1238
1239 PacketContents contents;
1240 contents.num_mtu_discovery_frames = 1;
1241 contents.num_padding_frames = 1;
1242 CheckPacketContains(contents, 0);
1243}
1244
1245// Test sending an MTU probe. Surround it with data, to ensure that it resets
1246// the MTU to the value before the probe was sent.
1247TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) {
1248 delegate_.SetCanWriteAnything();
1249
1250 const size_t target_mtu = kDefaultMaxPacketSize + 100;
1251 static_assert(target_mtu < kMaxPacketSize,
1252 "The MTU probe used by the test exceeds maximum packet size");
1253
1254 // Send enough data so it would always cause two packets to be sent.
1255 const size_t data_len = target_mtu + 1;
1256
1257 // Send a total of five packets: two packets before the probe, the probe
1258 // itself, and two packets after the probe.
1259 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1260 .Times(5)
1261 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1262
1263 // Send data before the MTU probe.
1264 CreateData(data_len);
1265 QuicConsumedData consumed = generator_.ConsumeData(
1266 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
1267 iov_.iov_len,
1268 /*offset=*/0, NO_FIN);
1269 generator_.Flush();
1270 EXPECT_EQ(data_len, consumed.bytes_consumed);
1271 EXPECT_FALSE(consumed.fin_consumed);
1272 EXPECT_FALSE(generator_.HasQueuedFrames());
1273 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1274
1275 // Send the MTU probe.
1276 generator_.GenerateMtuDiscoveryPacket(target_mtu);
1277 EXPECT_FALSE(generator_.HasQueuedFrames());
1278 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1279
1280 // Send data after the MTU probe.
1281 CreateData(data_len);
1282 generator_.AttachPacketFlusher();
1283 consumed = generator_.ConsumeData(
1284 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
1285 iov_.iov_len,
1286 /*offset=*/data_len, FIN);
1287 generator_.Flush();
1288 EXPECT_EQ(data_len, consumed.bytes_consumed);
1289 EXPECT_TRUE(consumed.fin_consumed);
1290 EXPECT_FALSE(generator_.HasQueuedFrames());
1291 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1292
1293 ASSERT_EQ(5u, packets_.size());
1294 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
1295 EXPECT_EQ(target_mtu, packets_[2].encrypted_length);
1296 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length);
1297
1298 PacketContents probe_contents;
1299 probe_contents.num_mtu_discovery_frames = 1;
1300 probe_contents.num_padding_frames = 1;
1301
1302 CheckPacketHasSingleStreamFrame(0);
1303 CheckPacketHasSingleStreamFrame(1);
1304 CheckPacketContains(probe_contents, 2);
1305 CheckPacketHasSingleStreamFrame(3);
1306 CheckPacketHasSingleStreamFrame(4);
1307}
1308
1309TEST_F(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) {
1310 if (framer_.transport_version() > QUIC_VERSION_43) {
1311 return;
1312 }
1313 // Test added to ensure the generator does not crash when an invalid frame is
1314 // added. Because this is an indication of internal programming errors,
1315 // DFATALs are expected.
1316 // A 1 byte packet number length can't encode a gap of 1000.
1317 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000);
1318
1319 delegate_.SetCanNotWrite();
1320 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
1321 generator_.SetShouldSendAck(true);
1322 }
1323 delegate_.SetCanWriteAnything();
1324
1325 if (!GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {
1326 // Set up frames to write into the creator when control frames are written.
1327 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
1328 .WillOnce(Return(QuicFrame(&ack_frame_)));
1329 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_));
1330 // Generator should have queued control frames, and creator should be empty.
1331 EXPECT_TRUE(generator_.HasQueuedFrames());
1332 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1333 EXPECT_FALSE(creator_->HasPendingFrames());
1334 }
1335
1336 // This will not serialize any packets, because of the invalid frame.
1337 EXPECT_CALL(delegate_,
1338 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _,
1339 ConnectionCloseSource::FROM_SELF));
1340 EXPECT_QUIC_BUG(generator_.Flush(),
1341 "packet_number_length 1 is too small "
1342 "for least_unacked_delta: 1001");
1343}
1344
1345// Regression test for b/31486443.
1346TEST_F(QuicPacketGeneratorTest, ConnectionCloseFrameLargerThanPacketSize) {
1347 delegate_.SetCanWriteAnything();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001348 char buf[2000] = {};
1349 QuicStringPiece error_details(buf, 2000);
fkastenholze9d71a82019-04-09 05:12:13 -07001350 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
1351 QUIC_PACKET_WRITE_ERROR, std::string(error_details));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001352 generator_.AddControlFrame(QuicFrame(frame), /*bundle_ack=*/false);
1353 EXPECT_TRUE(generator_.HasQueuedFrames());
1354 EXPECT_TRUE(generator_.HasRetransmittableFrames());
1355}
1356
1357TEST_F(QuicPacketGeneratorTest, RandomPaddingAfterFinSingleStreamSinglePacket) {
1358 const QuicByteCount kStreamFramePayloadSize = 100u;
1359 char buf[kStreamFramePayloadSize] = {};
1360 const QuicStreamId kDataStreamId = 5;
1361 // Set the packet size be enough for one stream frame with 0 stream offset and
1362 // max size of random padding.
1363 size_t length =
1364 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
1365 GetPacketHeaderSize(
1366 framer_.transport_version(),
1367 creator_->GetDestinationConnectionIdLength(),
1368 creator_->GetSourceConnectionIdLength(),
1369 QuicPacketCreatorPeer::SendVersionInPacket(creator_),
1370 !kIncludeDiversificationNonce,
1371 QuicPacketCreatorPeer::GetPacketNumberLength(creator_),
1372 QuicPacketCreatorPeer::GetRetryTokenLengthLength(creator_), 0,
1373 QuicPacketCreatorPeer::GetLengthLength(creator_)) +
1374 QuicFramer::GetMinStreamFrameSize(
1375 framer_.transport_version(), kDataStreamId, 0,
1376 /*last_frame_in_packet=*/false,
1377 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes) +
1378 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes;
1379 generator_.SetMaxPacketLength(length);
1380 delegate_.SetCanWriteAnything();
1381 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1382 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1383 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
1384 QuicConsumedData consumed = generator_.ConsumeData(
1385 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
1386 generator_.Flush();
1387 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
1388 EXPECT_FALSE(generator_.HasQueuedFrames());
1389 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1390
1391 EXPECT_EQ(1u, packets_.size());
1392 PacketContents contents;
1393 // The packet has both stream and padding frames.
1394 contents.num_padding_frames = 1;
1395 contents.num_stream_frames = 1;
1396 CheckPacketContains(contents, 0);
1397}
1398
1399TEST_F(QuicPacketGeneratorTest,
1400 RandomPaddingAfterFinSingleStreamMultiplePackets) {
1401 const QuicByteCount kStreamFramePayloadSize = 100u;
1402 char buf[kStreamFramePayloadSize] = {};
1403 const QuicStreamId kDataStreamId = 5;
1404 // Set the packet size be enough for one stream frame with 0 stream offset +
1405 // 1. One or more packets will accommodate.
1406 size_t length =
1407 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
1408 GetPacketHeaderSize(
1409 framer_.transport_version(),
1410 creator_->GetDestinationConnectionIdLength(),
1411 creator_->GetSourceConnectionIdLength(),
1412 QuicPacketCreatorPeer::SendVersionInPacket(creator_),
1413 !kIncludeDiversificationNonce,
1414 QuicPacketCreatorPeer::GetPacketNumberLength(creator_),
1415 QuicPacketCreatorPeer::GetRetryTokenLengthLength(creator_), 0,
1416 QuicPacketCreatorPeer::GetLengthLength(creator_)) +
1417 QuicFramer::GetMinStreamFrameSize(
1418 framer_.transport_version(), kDataStreamId, 0,
1419 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1420 kStreamFramePayloadSize + 1;
1421 generator_.SetMaxPacketLength(length);
1422 delegate_.SetCanWriteAnything();
1423 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1424 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1425 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
1426 QuicConsumedData consumed = generator_.ConsumeData(
1427 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
1428 generator_.Flush();
1429 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
1430 EXPECT_FALSE(generator_.HasQueuedFrames());
1431 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1432
1433 EXPECT_LE(1u, packets_.size());
1434 PacketContents contents;
1435 // The first packet has both stream and padding frames.
1436 contents.num_stream_frames = 1;
1437 contents.num_padding_frames = 1;
1438 CheckPacketContains(contents, 0);
1439
1440 for (size_t i = 1; i < packets_.size(); ++i) {
1441 // Following packets only have paddings.
1442 contents.num_stream_frames = 0;
1443 contents.num_padding_frames = 1;
1444 CheckPacketContains(contents, i);
1445 }
1446}
1447
1448TEST_F(QuicPacketGeneratorTest,
1449 RandomPaddingAfterFinMultipleStreamsMultiplePackets) {
1450 const QuicByteCount kStreamFramePayloadSize = 100u;
1451 char buf[kStreamFramePayloadSize] = {};
1452 const QuicStreamId kDataStreamId1 = 5;
1453 const QuicStreamId kDataStreamId2 = 6;
1454 // Set the packet size be enough for first frame with 0 stream offset + second
1455 // frame + 1 byte payload. two or more packets will accommodate.
1456 size_t length =
1457 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
1458 GetPacketHeaderSize(
1459 framer_.transport_version(),
1460 creator_->GetDestinationConnectionIdLength(),
1461 creator_->GetSourceConnectionIdLength(),
1462 QuicPacketCreatorPeer::SendVersionInPacket(creator_),
1463 !kIncludeDiversificationNonce,
1464 QuicPacketCreatorPeer::GetPacketNumberLength(creator_),
1465 QuicPacketCreatorPeer::GetRetryTokenLengthLength(creator_), 0,
1466 QuicPacketCreatorPeer::GetLengthLength(creator_)) +
1467 QuicFramer::GetMinStreamFrameSize(
1468 framer_.transport_version(), kDataStreamId1, 0,
1469 /*last_frame_in_packet=*/false, kStreamFramePayloadSize) +
1470 kStreamFramePayloadSize +
1471 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(),
1472 kDataStreamId1, 0,
1473 /*last_frame_in_packet=*/false, 1) +
1474 1;
1475 generator_.SetMaxPacketLength(length);
1476 delegate_.SetCanWriteAnything();
1477 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1478 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1479 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
1480 QuicConsumedData consumed = generator_.ConsumeData(
1481 kDataStreamId1, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
1482 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
1483 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
1484 consumed = generator_.ConsumeData(kDataStreamId2, &iov_, 1u, iov_.iov_len, 0,
1485 FIN_AND_PADDING);
1486 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
1487 generator_.Flush();
1488 EXPECT_FALSE(generator_.HasQueuedFrames());
1489 EXPECT_FALSE(generator_.HasRetransmittableFrames());
1490
1491 EXPECT_LE(2u, packets_.size());
1492 PacketContents contents;
1493 // The first packet has two stream frames.
1494 contents.num_stream_frames = 2;
1495 CheckPacketContains(contents, 0);
1496
1497 // The second packet has one stream frame and padding frames.
1498 contents.num_stream_frames = 1;
1499 contents.num_padding_frames = 1;
1500 CheckPacketContains(contents, 1);
1501
1502 for (size_t i = 2; i < packets_.size(); ++i) {
1503 // Following packets only have paddings.
1504 contents.num_stream_frames = 0;
1505 contents.num_padding_frames = 1;
1506 CheckPacketContains(contents, i);
1507 }
1508}
1509
1510TEST_F(QuicPacketGeneratorTest, AddMessageFrame) {
1511 if (framer_.transport_version() <= QUIC_VERSION_44) {
1512 return;
1513 }
1514 quic::QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1515 delegate_.SetCanWriteAnything();
1516 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1517 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
1518
1519 MakeIOVector("foo", &iov_);
1520 generator_.ConsumeData(
1521 QuicUtils::GetHeadersStreamId(framer_.transport_version()), &iov_, 1u,
1522 iov_.iov_len, 0, FIN);
1523 EXPECT_EQ(MESSAGE_STATUS_SUCCESS,
1524 generator_.AddMessageFrame(
1525 1, MakeSpan(&allocator_, "message", &storage)));
1526 EXPECT_TRUE(generator_.HasQueuedFrames());
1527 EXPECT_TRUE(generator_.HasRetransmittableFrames());
1528
1529 // Add a message which causes the flush of current packet.
1530 EXPECT_EQ(
1531 MESSAGE_STATUS_SUCCESS,
1532 generator_.AddMessageFrame(
ianswettb239f862019-04-05 09:15:06 -07001533 2, MakeSpan(
1534 &allocator_,
1535 std::string(generator_.GetCurrentLargestMessagePayload(), 'a'),
1536 &storage)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001537 EXPECT_TRUE(generator_.HasRetransmittableFrames());
1538
1539 // Failed to send messages which cannot fit into one packet.
1540 EXPECT_EQ(
1541 MESSAGE_STATUS_TOO_LARGE,
1542 generator_.AddMessageFrame(
1543 3,
1544 MakeSpan(&allocator_,
ianswettb239f862019-04-05 09:15:06 -07001545 std::string(
1546 generator_.GetCurrentLargestMessagePayload() + 10, 'a'),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001547 &storage)));
1548}
1549
1550} // namespace test
1551} // namespace quic