1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "quiche/quic/core/quic_packet_creator.h"
6
7 #include <cstdint>
8 #include <limits>
9 #include <memory>
10 #include <ostream>
11 #include <string>
12 #include <utility>
13
14 #include "absl/base/macros.h"
15 #include "absl/strings/str_cat.h"
16 #include "absl/strings/string_view.h"
17 #include "quiche/quic/core/crypto/quic_decrypter.h"
18 #include "quiche/quic/core/crypto/quic_encrypter.h"
19 #include "quiche/quic/core/frames/quic_frame.h"
20 #include "quiche/quic/core/frames/quic_stream_frame.h"
21 #include "quiche/quic/core/quic_connection_id.h"
22 #include "quiche/quic/core/quic_data_writer.h"
23 #include "quiche/quic/core/quic_types.h"
24 #include "quiche/quic/core/quic_utils.h"
25 #include "quiche/quic/platform/api/quic_expect_bug.h"
26 #include "quiche/quic/platform/api/quic_flags.h"
27 #include "quiche/quic/platform/api/quic_socket_address.h"
28 #include "quiche/quic/platform/api/quic_test.h"
29 #include "quiche/quic/test_tools/quic_framer_peer.h"
30 #include "quiche/quic/test_tools/quic_packet_creator_peer.h"
31 #include "quiche/quic/test_tools/quic_test_utils.h"
32 #include "quiche/quic/test_tools/simple_data_producer.h"
33 #include "quiche/quic/test_tools/simple_quic_framer.h"
34 #include "quiche/common/simple_buffer_allocator.h"
35 #include "quiche/common/test_tools/quiche_test_utils.h"
36
37 using ::testing::_;
38 using ::testing::AtLeast;
39 using ::testing::DoAll;
40 using ::testing::InSequence;
41 using ::testing::Invoke;
42 using ::testing::Return;
43 using ::testing::SaveArg;
44 using ::testing::StrictMock;
45
46 namespace quic {
47 namespace test {
48 namespace {
49
50 const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
51 // Use fields in which each byte is distinct to ensure that every byte is
52 // framed correctly. The values are otherwise arbitrary.
CreateTestConnectionId()53 QuicConnectionId CreateTestConnectionId() {
54 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
55 }
56
57 // Run tests with combinations of {ParsedQuicVersion,
58 // ToggleVersionSerialization}.
59 struct TestParams {
TestParamsquic::test::__anon1f7b9ac50111::TestParams60 TestParams(ParsedQuicVersion version, bool version_serialization)
61 : version(version), version_serialization(version_serialization) {}
62
63 ParsedQuicVersion version;
64 bool version_serialization;
65 };
66
67 // Used by ::testing::PrintToStringParamName().
PrintToString(const TestParams & p)68 std::string PrintToString(const TestParams& p) {
69 return absl::StrCat(ParsedQuicVersionToString(p.version), "_",
70 (p.version_serialization ? "Include" : "No"), "Version");
71 }
72
73 // Constructs various test permutations.
GetTestParams()74 std::vector<TestParams> GetTestParams() {
75 std::vector<TestParams> params;
76 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
77 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
78 params.push_back(TestParams(all_supported_versions[i], true));
79 params.push_back(TestParams(all_supported_versions[i], false));
80 }
81 return params;
82 }
83
84 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
85 public:
86 ~MockDebugDelegate() override = default;
87
88 MOCK_METHOD(void, OnFrameAddedToPacket, (const QuicFrame& frame), (override));
89
90 MOCK_METHOD(void, OnStreamFrameCoalesced, (const QuicStreamFrame& frame),
91 (override));
92 };
93
94 class TestPacketCreator : public QuicPacketCreator {
95 public:
TestPacketCreator(QuicConnectionId connection_id,QuicFramer * framer,DelegateInterface * delegate,SimpleDataProducer * producer)96 TestPacketCreator(QuicConnectionId connection_id, QuicFramer* framer,
97 DelegateInterface* delegate, SimpleDataProducer* producer)
98 : QuicPacketCreator(connection_id, framer, delegate),
99 producer_(producer),
100 version_(framer->version()) {}
101
ConsumeDataToFillCurrentPacket(QuicStreamId id,absl::string_view data,QuicStreamOffset offset,bool fin,bool needs_full_padding,TransmissionType transmission_type,QuicFrame * frame)102 bool ConsumeDataToFillCurrentPacket(QuicStreamId id, absl::string_view data,
103 QuicStreamOffset offset, bool fin,
104 bool needs_full_padding,
105 TransmissionType transmission_type,
106 QuicFrame* frame) {
107 // Save data before data is consumed.
108 if (!data.empty()) {
109 producer_->SaveStreamData(id, data);
110 }
111 return QuicPacketCreator::ConsumeDataToFillCurrentPacket(
112 id, data.length(), offset, fin, needs_full_padding, transmission_type,
113 frame);
114 }
115
StopSendingVersion()116 void StopSendingVersion() { set_encryption_level(ENCRYPTION_FORWARD_SECURE); }
117
118 SimpleDataProducer* producer_;
119 ParsedQuicVersion version_;
120 };
121
122 class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
123 public:
ClearSerializedPacketForTests(SerializedPacket)124 void ClearSerializedPacketForTests(SerializedPacket /*serialized_packet*/) {
125 // serialized packet self-clears on destruction.
126 }
127
SaveSerializedPacket(SerializedPacket serialized_packet)128 void SaveSerializedPacket(SerializedPacket serialized_packet) {
129 serialized_packet_.reset(CopySerializedPacket(
130 serialized_packet, &allocator_, /*copy_buffer=*/true));
131 }
132
DeleteSerializedPacket()133 void DeleteSerializedPacket() { serialized_packet_ = nullptr; }
134
135 protected:
QuicPacketCreatorTest()136 QuicPacketCreatorTest()
137 : connection_id_(TestConnectionId(2)),
138 server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
139 Perspective::IS_SERVER, connection_id_.length()),
140 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
141 Perspective::IS_CLIENT, connection_id_.length()),
142 data_("foo"),
143 creator_(connection_id_, &client_framer_, &delegate_, &producer_) {
144 EXPECT_CALL(delegate_, GetPacketBuffer())
145 .WillRepeatedly(Return(QuicPacketBuffer()));
146 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
147 .WillRepeatedly(Return(SEND_TO_WRITER));
148 creator_.SetEncrypter(
149 ENCRYPTION_INITIAL,
150 std::make_unique<TaggingEncrypter>(ENCRYPTION_INITIAL));
151 creator_.SetEncrypter(
152 ENCRYPTION_HANDSHAKE,
153 std::make_unique<TaggingEncrypter>(ENCRYPTION_HANDSHAKE));
154 creator_.SetEncrypter(
155 ENCRYPTION_ZERO_RTT,
156 std::make_unique<TaggingEncrypter>(ENCRYPTION_ZERO_RTT));
157 creator_.SetEncrypter(
158 ENCRYPTION_FORWARD_SECURE,
159 std::make_unique<TaggingEncrypter>(ENCRYPTION_FORWARD_SECURE));
160 client_framer_.set_visitor(&framer_visitor_);
161 server_framer_.set_visitor(&framer_visitor_);
162 client_framer_.set_data_producer(&producer_);
163 if (server_framer_.version().KnowsWhichDecrypterToUse()) {
164 server_framer_.InstallDecrypter(ENCRYPTION_INITIAL,
165 std::make_unique<TaggingDecrypter>());
166 server_framer_.InstallDecrypter(ENCRYPTION_ZERO_RTT,
167 std::make_unique<TaggingDecrypter>());
168 server_framer_.InstallDecrypter(ENCRYPTION_HANDSHAKE,
169 std::make_unique<TaggingDecrypter>());
170 server_framer_.InstallDecrypter(ENCRYPTION_FORWARD_SECURE,
171 std::make_unique<TaggingDecrypter>());
172 } else {
173 server_framer_.SetDecrypter(ENCRYPTION_INITIAL,
174 std::make_unique<TaggingDecrypter>());
175 server_framer_.SetAlternativeDecrypter(
176 ENCRYPTION_FORWARD_SECURE, std::make_unique<TaggingDecrypter>(),
177 false);
178 }
179 }
180
~QuicPacketCreatorTest()181 ~QuicPacketCreatorTest() override {}
182
SerializeAllFrames(const QuicFrames & frames)183 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
184 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
185 &creator_, frames, buffer_, kMaxOutgoingPacketSize);
186 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
187 packet.encryption_level);
188 return packet;
189 }
190
ProcessPacket(const SerializedPacket & packet)191 void ProcessPacket(const SerializedPacket& packet) {
192 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
193 packet.encrypted_length);
194 server_framer_.ProcessPacket(encrypted_packet);
195 }
196
CheckStreamFrame(const QuicFrame & frame,QuicStreamId stream_id,const std::string & data,QuicStreamOffset offset,bool fin)197 void CheckStreamFrame(const QuicFrame& frame, QuicStreamId stream_id,
198 const std::string& data, QuicStreamOffset offset,
199 bool fin) {
200 EXPECT_EQ(STREAM_FRAME, frame.type);
201 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
202 char buf[kMaxOutgoingPacketSize];
203 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, quiche::HOST_BYTE_ORDER);
204 if (frame.stream_frame.data_length > 0) {
205 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
206 frame.stream_frame.data_length, &writer);
207 }
208 EXPECT_EQ(data, absl::string_view(buf, frame.stream_frame.data_length));
209 EXPECT_EQ(offset, frame.stream_frame.offset);
210 EXPECT_EQ(fin, frame.stream_frame.fin);
211 }
212
213 // Returns the number of bytes consumed by the header of packet, including
214 // the version.
GetPacketHeaderOverhead(QuicTransportVersion version)215 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
216 return GetPacketHeaderSize(
217 version, creator_.GetDestinationConnectionIdLength(),
218 creator_.GetSourceConnectionIdLength(),
219 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
220 !kIncludeDiversificationNonce,
221 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
222 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
223 QuicPacketCreatorPeer::GetLengthLength(&creator_));
224 }
225
226 // Returns the number of bytes of overhead that will be added to a packet
227 // of maximum length.
GetEncryptionOverhead()228 size_t GetEncryptionOverhead() {
229 return creator_.max_packet_length() -
230 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
231 }
232
233 // Returns the number of bytes consumed by the non-data fields of a stream
234 // frame, assuming it is the last frame in the packet
GetStreamFrameOverhead(QuicTransportVersion version)235 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
236 return QuicFramer::GetMinStreamFrameSize(
237 version, GetNthClientInitiatedStreamId(1), kOffset, true,
238 /* data_length= */ 0);
239 }
240
IsDefaultTestConfiguration()241 bool IsDefaultTestConfiguration() {
242 TestParams p = GetParam();
243 return p.version == AllSupportedVersions()[0] && p.version_serialization;
244 }
245
GetNthClientInitiatedStreamId(int n) const246 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
247 return QuicUtils::GetFirstBidirectionalStreamId(
248 creator_.transport_version(), Perspective::IS_CLIENT) +
249 n * 2;
250 }
251
252 void TestChaosProtection(bool enabled);
253
254 static constexpr QuicStreamOffset kOffset = 0u;
255
256 char buffer_[kMaxOutgoingPacketSize];
257 QuicConnectionId connection_id_;
258 QuicFrames frames_;
259 QuicFramer server_framer_;
260 QuicFramer client_framer_;
261 StrictMock<MockFramerVisitor> framer_visitor_;
262 StrictMock<MockPacketCreatorDelegate> delegate_;
263 std::string data_;
264 TestPacketCreator creator_;
265 std::unique_ptr<SerializedPacket> serialized_packet_;
266 SimpleDataProducer producer_;
267 quiche::SimpleBufferAllocator allocator_;
268 };
269
270 // Run all packet creator tests with all supported versions of QUIC, and with
271 // and without version in the packet header, as well as doing a run for each
272 // length of truncated connection id.
273 INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests, QuicPacketCreatorTest,
274 ::testing::ValuesIn(GetTestParams()),
275 ::testing::PrintToStringParamName());
276
TEST_P(QuicPacketCreatorTest,SerializeFrames)277 TEST_P(QuicPacketCreatorTest, SerializeFrames) {
278 ParsedQuicVersion version = client_framer_.version();
279 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
280 EncryptionLevel level = static_cast<EncryptionLevel>(i);
281 bool has_ack = false, has_stream = false;
282 creator_.set_encryption_level(level);
283 size_t payload_len = 0;
284 if (level != ENCRYPTION_ZERO_RTT) {
285 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
286 has_ack = true;
287 payload_len += version.UsesTls() ? 12 : 6;
288 }
289 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
290 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
291 client_framer_.transport_version(), Perspective::IS_CLIENT);
292 frames_.push_back(QuicFrame(
293 QuicStreamFrame(stream_id, false, 0u, absl::string_view())));
294 has_stream = true;
295 payload_len += 2;
296 }
297 SerializedPacket serialized = SerializeAllFrames(frames_);
298 EXPECT_EQ(level, serialized.encryption_level);
299 if (level != ENCRYPTION_ZERO_RTT) {
300 delete frames_[0].ack_frame;
301 }
302 frames_.clear();
303 ASSERT_GT(payload_len, 0); // Must have a frame!
304 size_t min_payload = version.UsesTls() ? 3 : 7;
305 bool need_padding =
306 (version.HasHeaderProtection() && (payload_len < min_payload));
307 {
308 InSequence s;
309 EXPECT_CALL(framer_visitor_, OnPacket());
310 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
311 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
312 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
313 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
314 if (need_padding) {
315 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
316 }
317 if (has_ack) {
318 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
319 .WillOnce(Return(true));
320 EXPECT_CALL(framer_visitor_,
321 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
322 .WillOnce(Return(true));
323 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1), _))
324 .WillOnce(Return(true));
325 }
326 if (has_stream) {
327 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
328 }
329 EXPECT_CALL(framer_visitor_, OnPacketComplete());
330 }
331 ProcessPacket(serialized);
332 }
333 }
334
TEST_P(QuicPacketCreatorTest,SerializeConnectionClose)335 TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
336 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
337 creator_.transport_version(), QUIC_NO_ERROR, NO_IETF_QUIC_ERROR, "error",
338 /*transport_close_frame_type=*/0);
339
340 QuicFrames frames;
341 frames.push_back(QuicFrame(frame));
342 SerializedPacket serialized = SerializeAllFrames(frames);
343 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
344 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
345 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
346
347 InSequence s;
348 EXPECT_CALL(framer_visitor_, OnPacket());
349 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
350 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
351 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
352 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
353 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
354 EXPECT_CALL(framer_visitor_, OnPacketComplete());
355
356 ProcessPacket(serialized);
357 }
358
TEST_P(QuicPacketCreatorTest,ConsumeCryptoDataToFillCurrentPacket)359 TEST_P(QuicPacketCreatorTest, ConsumeCryptoDataToFillCurrentPacket) {
360 std::string data = "crypto data";
361 QuicFrame frame;
362 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
363 ENCRYPTION_INITIAL, data.length(), 0,
364 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
365 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
366 EXPECT_TRUE(creator_.HasPendingFrames());
367 }
368
TEST_P(QuicPacketCreatorTest,ConsumeDataToFillCurrentPacket)369 TEST_P(QuicPacketCreatorTest, ConsumeDataToFillCurrentPacket) {
370 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
371 QuicFrame frame;
372 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
373 client_framer_.transport_version(), Perspective::IS_CLIENT);
374 const std::string data("test");
375 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
376 stream_id, data, 0u, false, false, NOT_RETRANSMISSION, &frame));
377 size_t consumed = frame.stream_frame.data_length;
378 EXPECT_EQ(4u, consumed);
379 CheckStreamFrame(frame, stream_id, "test", 0u, false);
380 EXPECT_TRUE(creator_.HasPendingFrames());
381 }
382
TEST_P(QuicPacketCreatorTest,ConsumeDataFin)383 TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
384 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
385 QuicFrame frame;
386 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
387 client_framer_.transport_version(), Perspective::IS_CLIENT);
388 const std::string data("test");
389 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
390 stream_id, data, 0u, true, false, NOT_RETRANSMISSION, &frame));
391 size_t consumed = frame.stream_frame.data_length;
392 EXPECT_EQ(4u, consumed);
393 CheckStreamFrame(frame, stream_id, "test", 0u, true);
394 EXPECT_TRUE(creator_.HasPendingFrames());
395 }
396
TEST_P(QuicPacketCreatorTest,ConsumeDataFinOnly)397 TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
398 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
399 QuicFrame frame;
400 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
401 client_framer_.transport_version(), Perspective::IS_CLIENT);
402 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
403 stream_id, {}, 0u, true, false, NOT_RETRANSMISSION, &frame));
404 size_t consumed = frame.stream_frame.data_length;
405 EXPECT_EQ(0u, consumed);
406 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
407 EXPECT_TRUE(creator_.HasPendingFrames());
408 EXPECT_TRUE(absl::StartsWith(creator_.GetPendingFramesInfo(),
409 "type { STREAM_FRAME }"));
410 }
411
TEST_P(QuicPacketCreatorTest,CreateAllFreeBytesForStreamFrames)412 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
413 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
414 const size_t overhead =
415 GetPacketHeaderOverhead(client_framer_.transport_version()) +
416 GetEncryptionOverhead();
417 for (size_t i = overhead +
418 QuicPacketCreator::MinPlaintextPacketSize(
419 client_framer_.version(),
420 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
421 i < overhead + 100; ++i) {
422 SCOPED_TRACE(i);
423 creator_.SetMaxPacketLength(i);
424 const bool should_have_room =
425 i >
426 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
427 ASSERT_EQ(should_have_room,
428 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
429 kOffset, /* data_size=*/0xffff));
430 if (should_have_room) {
431 QuicFrame frame;
432 const std::string data("testdata");
433 EXPECT_CALL(delegate_, OnSerializedPacket(_))
434 .WillRepeatedly(Invoke(
435 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
436 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
437 GetNthClientInitiatedStreamId(1), data, kOffset, false, false,
438 NOT_RETRANSMISSION, &frame));
439 size_t bytes_consumed = frame.stream_frame.data_length;
440 EXPECT_LT(0u, bytes_consumed);
441 creator_.FlushCurrentPacket();
442 }
443 }
444 }
445
TEST_P(QuicPacketCreatorTest,StreamFrameConsumption)446 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
447 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
448 // Compute the total overhead for a single frame in packet.
449 const size_t overhead =
450 GetPacketHeaderOverhead(client_framer_.transport_version()) +
451 GetEncryptionOverhead() +
452 GetStreamFrameOverhead(client_framer_.transport_version());
453 size_t capacity = kDefaultMaxPacketSize - overhead;
454 // Now, test various sizes around this size.
455 for (int delta = -5; delta <= 5; ++delta) {
456 std::string data(capacity + delta, 'A');
457 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
458 QuicFrame frame;
459 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
460 GetNthClientInitiatedStreamId(1), data, kOffset, false, false,
461 NOT_RETRANSMISSION, &frame));
462
463 // BytesFree() returns bytes available for the next frame, which will
464 // be two bytes smaller since the stream frame would need to be grown.
465 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
466 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
467 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
468 EXPECT_CALL(delegate_, OnSerializedPacket(_))
469 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
470 creator_.FlushCurrentPacket();
471 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
472 DeleteSerializedPacket();
473 }
474 }
475
TEST_P(QuicPacketCreatorTest,CryptoStreamFramePacketPadding)476 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
477 // This test serializes crypto payloads slightly larger than a packet, which
478 // Causes the multi-packet ClientHello check to fail.
479 SetQuicFlag(quic_enforce_single_packet_chlo, false);
480 // Compute the total overhead for a single frame in packet.
481 size_t overhead =
482 GetPacketHeaderOverhead(client_framer_.transport_version()) +
483 GetEncryptionOverhead();
484 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
485 overhead +=
486 QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxOutgoingPacketSize);
487 } else {
488 overhead += QuicFramer::GetMinStreamFrameSize(
489 client_framer_.transport_version(), GetNthClientInitiatedStreamId(1),
490 kOffset, false, 0);
491 }
492 ASSERT_GT(kMaxOutgoingPacketSize, overhead);
493 size_t capacity = kDefaultMaxPacketSize - overhead;
494 // Now, test various sizes around this size.
495 for (int delta = -5; delta <= 5; ++delta) {
496 SCOPED_TRACE(delta);
497 std::string data(capacity + delta, 'A');
498 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
499
500 QuicFrame frame;
501 EXPECT_CALL(delegate_, OnSerializedPacket(_))
502 .WillRepeatedly(
503 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
504 if (client_framer_.version().CanSendCoalescedPackets()) {
505 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
506 .WillRepeatedly(Return(COALESCE));
507 }
508 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
509 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
510 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
511 data, kOffset, false, true, NOT_RETRANSMISSION, &frame));
512 size_t bytes_consumed = frame.stream_frame.data_length;
513 EXPECT_LT(0u, bytes_consumed);
514 } else {
515 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
516 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
517 ENCRYPTION_INITIAL, data.length(), kOffset,
518 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
519 size_t bytes_consumed = frame.crypto_frame->data_length;
520 EXPECT_LT(0u, bytes_consumed);
521 }
522 creator_.FlushCurrentPacket();
523 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
524 // If there is not enough space in the packet to fit a padding frame
525 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
526 // will not be padded.
527 // Padding is skipped when we try to send coalesced packets.
528 if (client_framer_.version().CanSendCoalescedPackets()) {
529 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
530 serialized_packet_->encrypted_length);
531 } else {
532 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_->encrypted_length);
533 }
534 DeleteSerializedPacket();
535 }
536 }
537
TEST_P(QuicPacketCreatorTest,NonCryptoStreamFramePacketNonPadding)538 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
539 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
540 // Compute the total overhead for a single frame in packet.
541 const size_t overhead =
542 GetPacketHeaderOverhead(client_framer_.transport_version()) +
543 GetEncryptionOverhead() +
544 GetStreamFrameOverhead(client_framer_.transport_version());
545 ASSERT_GT(kDefaultMaxPacketSize, overhead);
546 size_t capacity = kDefaultMaxPacketSize - overhead;
547 // Now, test various sizes around this size.
548 for (int delta = -5; delta <= 5; ++delta) {
549 std::string data(capacity + delta, 'A');
550 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
551
552 QuicFrame frame;
553 EXPECT_CALL(delegate_, OnSerializedPacket(_))
554 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
555 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
556 GetNthClientInitiatedStreamId(1), data, kOffset, false, false,
557 NOT_RETRANSMISSION, &frame));
558 size_t bytes_consumed = frame.stream_frame.data_length;
559 EXPECT_LT(0u, bytes_consumed);
560 creator_.FlushCurrentPacket();
561 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
562 if (bytes_free > 0) {
563 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
564 serialized_packet_->encrypted_length);
565 } else {
566 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_->encrypted_length);
567 }
568 DeleteSerializedPacket();
569 }
570 }
571
572 // Test that the path challenge connectivity probing packet is serialized
573 // correctly as a padded PATH CHALLENGE packet.
TEST_P(QuicPacketCreatorTest,BuildPathChallengePacket)574 TEST_P(QuicPacketCreatorTest, BuildPathChallengePacket) {
575 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
576 // This frame is only for IETF QUIC.
577 return;
578 }
579
580 QuicPacketHeader header;
581 header.destination_connection_id = CreateTestConnectionId();
582 header.reset_flag = false;
583 header.version_flag = false;
584 header.packet_number = kPacketNumber;
585 MockRandom randomizer;
586 QuicPathFrameBuffer payload;
587 randomizer.RandBytes(payload.data(), payload.size());
588
589 // clang-format off
590 unsigned char packet[] = {
591 // type (short header, 4 byte packet number)
592 0x43,
593 // connection_id
594 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
595 // packet number
596 0x12, 0x34, 0x56, 0x78,
597
598 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
599 0x1a,
600 // 8 "random" bytes, MockRandom makes lots of r's
601 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
602 // frame type (padding frame)
603 0x00,
604 0x00, 0x00, 0x00, 0x00
605 };
606 // clang-format on
607
608 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
609
610 size_t length = creator_.BuildPaddedPathChallengePacket(
611 header, buffer.get(), ABSL_ARRAYSIZE(packet), payload,
612 ENCRYPTION_INITIAL);
613 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
614
615 // Payload has the random bytes that were generated. Copy them into packet,
616 // above, before checking that the generated packet is correct.
617 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
618
619 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
620 header);
621
622 quiche::test::CompareCharArraysWithHexError(
623 "constructed packet", data.data(), data.length(),
624 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
625 }
626
TEST_P(QuicPacketCreatorTest,BuildConnectivityProbingPacket)627 TEST_P(QuicPacketCreatorTest, BuildConnectivityProbingPacket) {
628 QuicPacketHeader header;
629 header.destination_connection_id = CreateTestConnectionId();
630 header.reset_flag = false;
631 header.version_flag = false;
632 header.packet_number = kPacketNumber;
633
634 // clang-format off
635 unsigned char packet[] = {
636 // type (short header, 4 byte packet number)
637 0x43,
638 // connection_id
639 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
640 // packet number
641 0x12, 0x34, 0x56, 0x78,
642
643 // frame type
644 0x07,
645 // frame type (padding frame)
646 0x00,
647 0x00, 0x00, 0x00, 0x00
648 };
649
650 unsigned char packet99[] = {
651 // type (short header, 4 byte packet number)
652 0x43,
653 // connection_id
654 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
655 // packet number
656 0x12, 0x34, 0x56, 0x78,
657
658 // frame type (IETF_PING frame)
659 0x01,
660 // frame type (padding frame)
661 0x00,
662 0x00, 0x00, 0x00, 0x00
663 };
664 // clang-format on
665
666 unsigned char* p = packet;
667 size_t packet_size = ABSL_ARRAYSIZE(packet);
668 if (creator_.version().HasIetfQuicFrames()) {
669 p = packet99;
670 packet_size = ABSL_ARRAYSIZE(packet99);
671 }
672
673 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
674
675 size_t length = creator_.BuildConnectivityProbingPacket(
676 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
677
678 EXPECT_NE(0u, length);
679 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
680 header);
681
682 quiche::test::CompareCharArraysWithHexError(
683 "constructed packet", data.data(), data.length(),
684 reinterpret_cast<char*>(p), packet_size);
685 }
686
687 // Several tests that the path response connectivity probing packet is
688 // serialized correctly as either a padded and unpadded PATH RESPONSE
689 // packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
690 // exercised the single- and multiple- payload cases.
TEST_P(QuicPacketCreatorTest,BuildPathResponsePacket1ResponseUnpadded)691 TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponseUnpadded) {
692 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
693 // This frame is only for IETF QUIC.
694 return;
695 }
696
697 QuicPacketHeader header;
698 header.destination_connection_id = CreateTestConnectionId();
699 header.reset_flag = false;
700 header.version_flag = false;
701 header.packet_number = kPacketNumber;
702 QuicPathFrameBuffer payload0 = {
703 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
704
705 // Build 1 PATH RESPONSE, not padded
706 // clang-format off
707 unsigned char packet[] = {
708 // type (short header, 4 byte packet number)
709 0x43,
710 // connection_id
711 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
712 // packet number
713 0x12, 0x34, 0x56, 0x78,
714
715 // Path Response Frame type (IETF_PATH_RESPONSE)
716 0x1b,
717 // 8 "random" bytes
718 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
719 };
720 // clang-format on
721 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
722 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
723 payloads.push_back(payload0);
724 size_t length = creator_.BuildPathResponsePacket(
725 header, buffer.get(), ABSL_ARRAYSIZE(packet), payloads,
726 /*is_padded=*/false, ENCRYPTION_INITIAL);
727 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
728 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
729 header);
730
731 quiche::test::CompareCharArraysWithHexError(
732 "constructed packet", data.data(), data.length(),
733 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
734 }
735
TEST_P(QuicPacketCreatorTest,BuildPathResponsePacket1ResponsePadded)736 TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponsePadded) {
737 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
738 // This frame is only for IETF QUIC.
739 return;
740 }
741
742 QuicPacketHeader header;
743 header.destination_connection_id = CreateTestConnectionId();
744 header.reset_flag = false;
745 header.version_flag = false;
746 header.packet_number = kPacketNumber;
747 QuicPathFrameBuffer payload0 = {
748 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
749
750 // Build 1 PATH RESPONSE, padded
751 // clang-format off
752 unsigned char packet[] = {
753 // type (short header, 4 byte packet number)
754 0x43,
755 // connection_id
756 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
757 // packet number
758 0x12, 0x34, 0x56, 0x78,
759
760 // Path Response Frame type (IETF_PATH_RESPONSE)
761 0x1b,
762 // 8 "random" bytes
763 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
764 // Padding type and pad
765 0x00, 0x00, 0x00, 0x00, 0x00
766 };
767 // clang-format on
768 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
769 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
770 payloads.push_back(payload0);
771 size_t length = creator_.BuildPathResponsePacket(
772 header, buffer.get(), ABSL_ARRAYSIZE(packet), payloads,
773 /*is_padded=*/true, ENCRYPTION_INITIAL);
774 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
775 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
776 header);
777
778 quiche::test::CompareCharArraysWithHexError(
779 "constructed packet", data.data(), data.length(),
780 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
781 }
782
TEST_P(QuicPacketCreatorTest,BuildPathResponsePacket3ResponsesUnpadded)783 TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesUnpadded) {
784 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
785 // This frame is only for IETF QUIC.
786 return;
787 }
788
789 QuicPacketHeader header;
790 header.destination_connection_id = CreateTestConnectionId();
791 header.reset_flag = false;
792 header.version_flag = false;
793 header.packet_number = kPacketNumber;
794 QuicPathFrameBuffer payload0 = {
795 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
796 QuicPathFrameBuffer payload1 = {
797 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
798 QuicPathFrameBuffer payload2 = {
799 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
800
801 // Build one packet with 3 PATH RESPONSES, no padding
802 // clang-format off
803 unsigned char packet[] = {
804 // type (short header, 4 byte packet number)
805 0x43,
806 // connection_id
807 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
808 // packet number
809 0x12, 0x34, 0x56, 0x78,
810
811 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
812 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
813 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
814 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
815 };
816 // clang-format on
817
818 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
819 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
820 payloads.push_back(payload0);
821 payloads.push_back(payload1);
822 payloads.push_back(payload2);
823 size_t length = creator_.BuildPathResponsePacket(
824 header, buffer.get(), ABSL_ARRAYSIZE(packet), payloads,
825 /*is_padded=*/false, ENCRYPTION_INITIAL);
826 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
827 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
828 header);
829
830 quiche::test::CompareCharArraysWithHexError(
831 "constructed packet", data.data(), data.length(),
832 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
833 }
834
TEST_P(QuicPacketCreatorTest,BuildPathResponsePacket3ResponsesPadded)835 TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesPadded) {
836 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
837 // This frame is only for IETF QUIC.
838 return;
839 }
840
841 QuicPacketHeader header;
842 header.destination_connection_id = CreateTestConnectionId();
843 header.reset_flag = false;
844 header.version_flag = false;
845 header.packet_number = kPacketNumber;
846 QuicPathFrameBuffer payload0 = {
847 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
848 QuicPathFrameBuffer payload1 = {
849 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
850 QuicPathFrameBuffer payload2 = {
851 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
852
853 // Build one packet with 3 PATH RESPONSES, with padding
854 // clang-format off
855 unsigned char packet[] = {
856 // type (short header, 4 byte packet number)
857 0x43,
858 // connection_id
859 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
860 // packet number
861 0x12, 0x34, 0x56, 0x78,
862
863 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
864 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
865 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
866 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
867 // Padding
868 0x00, 0x00, 0x00, 0x00, 0x00
869 };
870 // clang-format on
871
872 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
873 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
874 payloads.push_back(payload0);
875 payloads.push_back(payload1);
876 payloads.push_back(payload2);
877 size_t length = creator_.BuildPathResponsePacket(
878 header, buffer.get(), ABSL_ARRAYSIZE(packet), payloads,
879 /*is_padded=*/true, ENCRYPTION_INITIAL);
880 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
881 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
882 header);
883
884 quiche::test::CompareCharArraysWithHexError(
885 "constructed packet", data.data(), data.length(),
886 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
887 }
888
TEST_P(QuicPacketCreatorTest,SerializeConnectivityProbingPacket)889 TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
890 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
891
892 std::unique_ptr<SerializedPacket> encrypted;
893 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
894 QuicPathFrameBuffer payload = {
895 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
896 encrypted =
897 creator_.SerializePathChallengeConnectivityProbingPacket(payload);
898 } else {
899 encrypted = creator_.SerializeConnectivityProbingPacket();
900 }
901 {
902 InSequence s;
903 EXPECT_CALL(framer_visitor_, OnPacket());
904 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
905 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
906 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
907 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
908 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
909 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
910 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
911 } else {
912 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
913 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
914 }
915 EXPECT_CALL(framer_visitor_, OnPacketComplete());
916 }
917 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
918 server_framer_.ProcessPacket(QuicEncryptedPacket(
919 encrypted->encrypted_buffer, encrypted->encrypted_length));
920 }
921
TEST_P(QuicPacketCreatorTest,SerializePathChallengeProbePacket)922 TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
923 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
924 return;
925 }
926 QuicPathFrameBuffer payload = {
927 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
928
929 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
930
931 std::unique_ptr<SerializedPacket> encrypted(
932 creator_.SerializePathChallengeConnectivityProbingPacket(payload));
933 {
934 InSequence s;
935 EXPECT_CALL(framer_visitor_, OnPacket());
936 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
937 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
938 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
939 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
940 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
941 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
942 EXPECT_CALL(framer_visitor_, OnPacketComplete());
943 }
944 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
945 server_framer_.ProcessPacket(QuicEncryptedPacket(
946 encrypted->encrypted_buffer, encrypted->encrypted_length));
947 }
948
TEST_P(QuicPacketCreatorTest,SerializePathResponseProbePacket1PayloadPadded)949 TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
950 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
951 return;
952 }
953 QuicPathFrameBuffer payload0 = {
954 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
955
956 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
957
958 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
959 payloads.push_back(payload0);
960
961 std::unique_ptr<SerializedPacket> encrypted(
962 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
963 {
964 InSequence s;
965 EXPECT_CALL(framer_visitor_, OnPacket());
966 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
967 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
968 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
969 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
970 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
971 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
972 EXPECT_CALL(framer_visitor_, OnPacketComplete());
973 }
974 server_framer_.ProcessPacket(QuicEncryptedPacket(
975 encrypted->encrypted_buffer, encrypted->encrypted_length));
976 }
977
TEST_P(QuicPacketCreatorTest,SerializePathResponseProbePacket1PayloadUnPadded)978 TEST_P(QuicPacketCreatorTest,
979 SerializePathResponseProbePacket1PayloadUnPadded) {
980 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
981 return;
982 }
983 QuicPathFrameBuffer payload0 = {
984 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
985
986 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
987
988 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
989 payloads.push_back(payload0);
990
991 std::unique_ptr<SerializedPacket> encrypted(
992 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
993 {
994 InSequence s;
995 EXPECT_CALL(framer_visitor_, OnPacket());
996 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
997 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
998 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
999 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1000 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1001 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1002 }
1003 server_framer_.ProcessPacket(QuicEncryptedPacket(
1004 encrypted->encrypted_buffer, encrypted->encrypted_length));
1005 }
1006
TEST_P(QuicPacketCreatorTest,SerializePathResponseProbePacket2PayloadsPadded)1007 TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
1008 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
1009 return;
1010 }
1011 QuicPathFrameBuffer payload0 = {
1012 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1013 QuicPathFrameBuffer payload1 = {
1014 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1015
1016 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1017
1018 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
1019 payloads.push_back(payload0);
1020 payloads.push_back(payload1);
1021
1022 std::unique_ptr<SerializedPacket> encrypted(
1023 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
1024 {
1025 InSequence s;
1026 EXPECT_CALL(framer_visitor_, OnPacket());
1027 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1028 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1029 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1030 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1031 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1032 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1033 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1034 }
1035 server_framer_.ProcessPacket(QuicEncryptedPacket(
1036 encrypted->encrypted_buffer, encrypted->encrypted_length));
1037 }
1038
TEST_P(QuicPacketCreatorTest,SerializePathResponseProbePacket2PayloadsUnPadded)1039 TEST_P(QuicPacketCreatorTest,
1040 SerializePathResponseProbePacket2PayloadsUnPadded) {
1041 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
1042 return;
1043 }
1044 QuicPathFrameBuffer payload0 = {
1045 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1046 QuicPathFrameBuffer payload1 = {
1047 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1048
1049 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1050
1051 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
1052 payloads.push_back(payload0);
1053 payloads.push_back(payload1);
1054
1055 std::unique_ptr<SerializedPacket> encrypted(
1056 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
1057 {
1058 InSequence s;
1059 EXPECT_CALL(framer_visitor_, OnPacket());
1060 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1061 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1062 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1063 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1064 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1065 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1066 }
1067 server_framer_.ProcessPacket(QuicEncryptedPacket(
1068 encrypted->encrypted_buffer, encrypted->encrypted_length));
1069 }
1070
TEST_P(QuicPacketCreatorTest,SerializePathResponseProbePacket3PayloadsPadded)1071 TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
1072 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
1073 return;
1074 }
1075 QuicPathFrameBuffer payload0 = {
1076 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1077 QuicPathFrameBuffer payload1 = {
1078 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1079 QuicPathFrameBuffer payload2 = {
1080 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1081
1082 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1083
1084 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
1085 payloads.push_back(payload0);
1086 payloads.push_back(payload1);
1087 payloads.push_back(payload2);
1088
1089 std::unique_ptr<SerializedPacket> encrypted(
1090 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
1091 {
1092 InSequence s;
1093 EXPECT_CALL(framer_visitor_, OnPacket());
1094 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1095 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1096 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1097 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1098 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1099 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1100 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1101 }
1102 server_framer_.ProcessPacket(QuicEncryptedPacket(
1103 encrypted->encrypted_buffer, encrypted->encrypted_length));
1104 }
1105
TEST_P(QuicPacketCreatorTest,SerializePathResponseProbePacket3PayloadsUnpadded)1106 TEST_P(QuicPacketCreatorTest,
1107 SerializePathResponseProbePacket3PayloadsUnpadded) {
1108 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
1109 return;
1110 }
1111 QuicPathFrameBuffer payload0 = {
1112 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1113 QuicPathFrameBuffer payload1 = {
1114 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1115 QuicPathFrameBuffer payload2 = {
1116 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1117
1118 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1119
1120 quiche::QuicheCircularDeque<QuicPathFrameBuffer> payloads;
1121 payloads.push_back(payload0);
1122 payloads.push_back(payload1);
1123 payloads.push_back(payload2);
1124
1125 std::unique_ptr<SerializedPacket> encrypted(
1126 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
1127 InSequence s;
1128 EXPECT_CALL(framer_visitor_, OnPacket());
1129 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1130 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1131 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1132 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1133 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1134 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1135
1136 server_framer_.ProcessPacket(QuicEncryptedPacket(
1137 encrypted->encrypted_buffer, encrypted->encrypted_length));
1138 }
1139
TEST_P(QuicPacketCreatorTest,UpdatePacketSequenceNumberLengthLeastAwaiting)1140 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
1141 if (!GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1142 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1143 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1144 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1145 } else {
1146 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1147 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1148 }
1149
1150 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1151 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1152 10000 / kDefaultMaxPacketSize);
1153 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1154 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1155
1156 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1157 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1158 10000 / kDefaultMaxPacketSize);
1159 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1160 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1161
1162 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1163 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1164 10000 / kDefaultMaxPacketSize);
1165 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1166 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1167
1168 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1169 UINT64_C(64) * 256 * 256 * 256 * 256);
1170 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1171 10000 / kDefaultMaxPacketSize);
1172 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1173 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1174 }
1175
TEST_P(QuicPacketCreatorTest,UpdatePacketSequenceNumberLengthCwnd)1176 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1177 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
1178 if (!GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1179 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1180 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1181 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1182 } else {
1183 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1184 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1185 }
1186
1187 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1188 10000 / kDefaultMaxPacketSize);
1189 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1190 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1191
1192 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1193 10000 * 256 / kDefaultMaxPacketSize);
1194 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1195 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1196
1197 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1198 10000 * 256 * 256 / kDefaultMaxPacketSize);
1199 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1200 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1201
1202 creator_.UpdatePacketNumberLength(
1203 QuicPacketNumber(1),
1204 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1205 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1206 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1207 }
1208
TEST_P(QuicPacketCreatorTest,SkipNPacketNumbers)1209 TEST_P(QuicPacketCreatorTest, SkipNPacketNumbers) {
1210 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
1211 if (!GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1212 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1213 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1214 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1215 } else {
1216 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1217 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1218 }
1219 creator_.SkipNPacketNumbers(63, QuicPacketNumber(2),
1220 10000 / kDefaultMaxPacketSize);
1221 EXPECT_EQ(QuicPacketNumber(64), creator_.packet_number());
1222 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1223 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1224
1225 creator_.SkipNPacketNumbers(64 * 255, QuicPacketNumber(2),
1226 10000 / kDefaultMaxPacketSize);
1227 EXPECT_EQ(QuicPacketNumber(64 * 256), creator_.packet_number());
1228 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1229 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1230
1231 creator_.SkipNPacketNumbers(64 * 256 * 255, QuicPacketNumber(2),
1232 10000 / kDefaultMaxPacketSize);
1233 EXPECT_EQ(QuicPacketNumber(64 * 256 * 256), creator_.packet_number());
1234 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1235 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1236 }
1237
TEST_P(QuicPacketCreatorTest,SerializeFrame)1238 TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1239 if (!GetParam().version_serialization) {
1240 creator_.StopSendingVersion();
1241 }
1242 std::string data("test data");
1243 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1244 QuicStreamFrame stream_frame(
1245 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1246 /*fin=*/false, 0u, absl::string_view());
1247 frames_.push_back(QuicFrame(stream_frame));
1248 } else {
1249 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1250 frames_.push_back(
1251 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1252 }
1253 SerializedPacket serialized = SerializeAllFrames(frames_);
1254
1255 QuicPacketHeader header;
1256 {
1257 InSequence s;
1258 EXPECT_CALL(framer_visitor_, OnPacket());
1259 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1260 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1261 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1262 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1263 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1264 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1265 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1266 } else {
1267 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1268 }
1269 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1270 }
1271 ProcessPacket(serialized);
1272 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1273 }
1274
TEST_P(QuicPacketCreatorTest,SerializeFrameShortData)1275 TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
1276 if (!GetParam().version_serialization) {
1277 creator_.StopSendingVersion();
1278 }
1279 std::string data("Hello World!");
1280 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1281 QuicStreamFrame stream_frame(
1282 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1283 /*fin=*/false, 0u, absl::string_view());
1284 frames_.push_back(QuicFrame(stream_frame));
1285 } else {
1286 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1287 frames_.push_back(
1288 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1289 }
1290 SerializedPacket serialized = SerializeAllFrames(frames_);
1291
1292 QuicPacketHeader header;
1293 {
1294 InSequence s;
1295 EXPECT_CALL(framer_visitor_, OnPacket());
1296 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1297 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1298 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1299 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1300 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1301 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1302 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1303 } else {
1304 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1305 }
1306 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1307 }
1308 ProcessPacket(serialized);
1309 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1310 }
1311
TestChaosProtection(bool enabled)1312 void QuicPacketCreatorTest::TestChaosProtection(bool enabled) {
1313 if (!GetParam().version.UsesCryptoFrames()) {
1314 return;
1315 }
1316 MockRandom mock_random(2);
1317 QuicPacketCreatorPeer::SetRandom(&creator_, &mock_random);
1318 std::string data("ChAoS_ThEoRy!");
1319 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1320 frames_.push_back(
1321 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1322 frames_.push_back(QuicFrame(QuicPaddingFrame(33)));
1323 SerializedPacket serialized = SerializeAllFrames(frames_);
1324 EXPECT_CALL(framer_visitor_, OnPacket());
1325 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1326 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1327 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1328 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1329 if (enabled) {
1330 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_)).Times(AtLeast(2));
1331 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(AtLeast(2));
1332 EXPECT_CALL(framer_visitor_, OnPingFrame(_)).Times(AtLeast(1));
1333 } else {
1334 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_)).Times(1);
1335 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(1);
1336 EXPECT_CALL(framer_visitor_, OnPingFrame(_)).Times(0);
1337 }
1338 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1339 ProcessPacket(serialized);
1340 }
1341
TEST_P(QuicPacketCreatorTest,ChaosProtectionEnabled)1342 TEST_P(QuicPacketCreatorTest, ChaosProtectionEnabled) {
1343 TestChaosProtection(true);
1344 }
1345
TEST_P(QuicPacketCreatorTest,ChaosProtectionDisabled)1346 TEST_P(QuicPacketCreatorTest, ChaosProtectionDisabled) {
1347 SetQuicFlag(quic_enable_chaos_protection, false);
1348 TestChaosProtection(false);
1349 }
1350
TEST_P(QuicPacketCreatorTest,ConsumeDataLargerThanOneStreamFrame)1351 TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1352 if (!GetParam().version_serialization) {
1353 creator_.StopSendingVersion();
1354 }
1355 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1356 // A string larger than fits into a frame.
1357 QuicFrame frame;
1358 size_t payload_length = creator_.max_packet_length();
1359 const std::string too_long_payload(payload_length, 'a');
1360 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1361 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1362 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1363 client_framer_.transport_version(), Perspective::IS_CLIENT);
1364 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1365 stream_id, too_long_payload, 0u, true, false, NOT_RETRANSMISSION,
1366 &frame));
1367 size_t consumed = frame.stream_frame.data_length;
1368 // The entire payload could not be consumed.
1369 EXPECT_GT(payload_length, consumed);
1370 creator_.FlushCurrentPacket();
1371 DeleteSerializedPacket();
1372 }
1373
TEST_P(QuicPacketCreatorTest,AddFrameAndFlush)1374 TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1375 if (!GetParam().version_serialization) {
1376 creator_.StopSendingVersion();
1377 }
1378 const size_t max_plaintext_size =
1379 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1380 EXPECT_FALSE(creator_.HasPendingFrames());
1381 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1382 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1383 client_framer_.transport_version(), Perspective::IS_CLIENT);
1384 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1385 stream_id =
1386 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1387 }
1388 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
1389 EXPECT_EQ(max_plaintext_size -
1390 GetPacketHeaderSize(
1391 client_framer_.transport_version(),
1392 creator_.GetDestinationConnectionIdLength(),
1393 creator_.GetSourceConnectionIdLength(),
1394 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1395 !kIncludeDiversificationNonce,
1396 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1397 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1398 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1399 creator_.BytesFree());
1400 StrictMock<MockDebugDelegate> debug;
1401 creator_.set_debug_delegate(&debug);
1402
1403 // Add a variety of frame types and then a padding frame.
1404 QuicAckFrame ack_frame(InitAckFrame(10u));
1405 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
1406 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1407 EXPECT_TRUE(creator_.HasPendingFrames());
1408 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
1409
1410 QuicFrame frame;
1411 const std::string data("test");
1412 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
1413 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1414 stream_id, data, 0u, false, false, NOT_RETRANSMISSION, &frame));
1415 size_t consumed = frame.stream_frame.data_length;
1416 EXPECT_EQ(4u, consumed);
1417 EXPECT_TRUE(creator_.HasPendingFrames());
1418 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
1419
1420 QuicPaddingFrame padding_frame;
1421 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
1422 EXPECT_TRUE(creator_.AddFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
1423 EXPECT_TRUE(creator_.HasPendingFrames());
1424 EXPECT_EQ(0u, creator_.BytesFree());
1425
1426 // Packet is full. Creator will flush.
1427 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1428 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1429 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1430
1431 // Ensure the packet is successfully created.
1432 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1433 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
1434 const QuicFrames& retransmittable =
1435 serialized_packet_->retransmittable_frames;
1436 ASSERT_EQ(1u, retransmittable.size());
1437 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1438 EXPECT_TRUE(serialized_packet_->has_ack);
1439 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_->largest_acked);
1440 DeleteSerializedPacket();
1441
1442 EXPECT_FALSE(creator_.HasPendingFrames());
1443 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
1444 EXPECT_EQ(max_plaintext_size -
1445 GetPacketHeaderSize(
1446 client_framer_.transport_version(),
1447 creator_.GetDestinationConnectionIdLength(),
1448 creator_.GetSourceConnectionIdLength(),
1449 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1450 !kIncludeDiversificationNonce,
1451 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1452 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1453 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1454 creator_.BytesFree());
1455 }
1456
TEST_P(QuicPacketCreatorTest,SerializeAndSendStreamFrame)1457 TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1458 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1459 if (!GetParam().version_serialization) {
1460 creator_.StopSendingVersion();
1461 }
1462 EXPECT_FALSE(creator_.HasPendingFrames());
1463
1464 const std::string data("test");
1465 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), data);
1466 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1467 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1468 size_t num_bytes_consumed;
1469 StrictMock<MockDebugDelegate> debug;
1470 creator_.set_debug_delegate(&debug);
1471 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
1472 creator_.CreateAndSerializeStreamFrame(
1473 GetNthClientInitiatedStreamId(0), data.length(), 0, 0, true,
1474 NOT_RETRANSMISSION, &num_bytes_consumed);
1475 EXPECT_EQ(4u, num_bytes_consumed);
1476
1477 // Ensure the packet is successfully created.
1478 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1479 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
1480 const QuicFrames& retransmittable =
1481 serialized_packet_->retransmittable_frames;
1482 ASSERT_EQ(1u, retransmittable.size());
1483 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1484 DeleteSerializedPacket();
1485
1486 EXPECT_FALSE(creator_.HasPendingFrames());
1487 }
1488
TEST_P(QuicPacketCreatorTest,SerializeStreamFrameWithPadding)1489 TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1490 // Regression test to check that CreateAndSerializeStreamFrame uses a
1491 // correctly formatted stream frame header when appending padding.
1492
1493 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1494 if (!GetParam().version_serialization) {
1495 creator_.StopSendingVersion();
1496 }
1497 EXPECT_FALSE(creator_.HasPendingFrames());
1498
1499 // Send zero bytes of stream data. This requires padding.
1500 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1501 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1502 size_t num_bytes_consumed;
1503 creator_.CreateAndSerializeStreamFrame(GetNthClientInitiatedStreamId(0), 0, 0,
1504 0, true, NOT_RETRANSMISSION,
1505 &num_bytes_consumed);
1506 EXPECT_EQ(0u, num_bytes_consumed);
1507
1508 // Check that a packet is created.
1509 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1510 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
1511 ASSERT_EQ(serialized_packet_->packet_number_length,
1512 PACKET_1BYTE_PACKET_NUMBER);
1513 {
1514 InSequence s;
1515 EXPECT_CALL(framer_visitor_, OnPacket());
1516 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1517 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1518 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1519 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1520 if (client_framer_.version().HasHeaderProtection()) {
1521 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1522 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1523 } else {
1524 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1525 }
1526 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1527 }
1528 ProcessPacket(*serialized_packet_);
1529 }
1530
TEST_P(QuicPacketCreatorTest,AddUnencryptedStreamDataClosesConnection)1531 TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1532 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1533 if (!IsDefaultTestConfiguration()) {
1534 return;
1535 }
1536
1537 creator_.set_encryption_level(ENCRYPTION_INITIAL);
1538 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1539 /*fin=*/false, 0u, absl::string_view());
1540 EXPECT_QUIC_BUG(
1541 {
1542 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
1543 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION);
1544 },
1545 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1546 }
1547
TEST_P(QuicPacketCreatorTest,SendStreamDataWithEncryptionHandshake)1548 TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1549 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1550 if (!IsDefaultTestConfiguration()) {
1551 return;
1552 }
1553
1554 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
1555 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1556 /*fin=*/false, 0u, absl::string_view());
1557 EXPECT_QUIC_BUG(
1558 {
1559 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
1560 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION);
1561 },
1562 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
1563 }
1564
TEST_P(QuicPacketCreatorTest,ChloTooLarge)1565 TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1566 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1567 if (!IsDefaultTestConfiguration()) {
1568 return;
1569 }
1570
1571 // This test only matters when the crypto handshake is sent in stream frames.
1572 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1573 // frames.
1574 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1575 return;
1576 }
1577
1578 CryptoHandshakeMessage message;
1579 message.set_tag(kCHLO);
1580 message.set_minimum_size(kMaxOutgoingPacketSize);
1581 CryptoFramer framer;
1582 std::unique_ptr<QuicData> message_data;
1583 message_data = framer.ConstructHandshakeMessage(message);
1584
1585 QuicFrame frame;
1586 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
1587 EXPECT_QUIC_BUG(
1588 creator_.ConsumeDataToFillCurrentPacket(
1589 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1590 absl::string_view(message_data->data(), message_data->length()), 0u,
1591 false, false, NOT_RETRANSMISSION, &frame),
1592 "Client hello won't fit in a single packet.");
1593 }
1594
TEST_P(QuicPacketCreatorTest,PendingPadding)1595 TEST_P(QuicPacketCreatorTest, PendingPadding) {
1596 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1597 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1598 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1599
1600 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1601 .WillRepeatedly(
1602 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1603 // Flush all paddings.
1604 while (creator_.pending_padding_bytes() > 0) {
1605 creator_.FlushCurrentPacket();
1606 {
1607 InSequence s;
1608 EXPECT_CALL(framer_visitor_, OnPacket());
1609 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1610 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1611 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
1612 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1613 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1614 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1615 }
1616 // Packet only contains padding.
1617 ProcessPacket(*serialized_packet_);
1618 }
1619 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1620 }
1621
TEST_P(QuicPacketCreatorTest,FullPaddingDoesNotConsumePendingPadding)1622 TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
1623 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1624 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1625 QuicFrame frame;
1626 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1627 client_framer_.transport_version(), Perspective::IS_CLIENT);
1628 const std::string data("test");
1629 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1630 stream_id, data, 0u, false,
1631 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1632 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1633 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1634 creator_.FlushCurrentPacket();
1635 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1636 }
1637
TEST_P(QuicPacketCreatorTest,ConsumeDataAndRandomPadding)1638 TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
1639 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1640 const QuicByteCount kStreamFramePayloadSize = 100u;
1641 // Set the packet size be enough for one stream frame with 0 stream offset +
1642 // 1.
1643 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1644 client_framer_.transport_version(), Perspective::IS_CLIENT);
1645 size_t length =
1646 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1647 GetEncryptionOverhead() +
1648 QuicFramer::GetMinStreamFrameSize(
1649 client_framer_.transport_version(), stream_id, 0,
1650 /*last_frame_in_packet=*/true, kStreamFramePayloadSize + 1) +
1651 kStreamFramePayloadSize + 1;
1652 creator_.SetMaxPacketLength(length);
1653 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1654 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1655 QuicFrame frame;
1656 char buf[kStreamFramePayloadSize + 1] = {};
1657 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1658 .WillRepeatedly(
1659 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1660 // Send stream frame of size kStreamFramePayloadSize.
1661 creator_.ConsumeDataToFillCurrentPacket(
1662 stream_id, absl::string_view(buf, kStreamFramePayloadSize), 0u, false,
1663 false, NOT_RETRANSMISSION, &frame);
1664 creator_.FlushCurrentPacket();
1665 // 1 byte padding is sent.
1666 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1667 // Send stream frame of size kStreamFramePayloadSize + 1.
1668 creator_.ConsumeDataToFillCurrentPacket(
1669 stream_id, absl::string_view(buf, kStreamFramePayloadSize + 1),
1670 kStreamFramePayloadSize, false, false, NOT_RETRANSMISSION, &frame);
1671 // No padding is sent.
1672 creator_.FlushCurrentPacket();
1673 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1674 // Flush all paddings.
1675 while (creator_.pending_padding_bytes() > 0) {
1676 creator_.FlushCurrentPacket();
1677 }
1678 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1679 }
1680
TEST_P(QuicPacketCreatorTest,FlushWithExternalBuffer)1681 TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
1682 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1683 char* buffer = new char[kMaxOutgoingPacketSize];
1684 QuicPacketBuffer external_buffer = {buffer,
1685 [](const char* p) { delete[] p; }};
1686 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(external_buffer));
1687
1688 QuicFrame frame;
1689 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1690 client_framer_.transport_version(), Perspective::IS_CLIENT);
1691 const std::string data("test");
1692 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1693 stream_id, data, 0u, false,
1694 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1695
1696 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1697 .WillOnce(Invoke([&external_buffer](SerializedPacket serialized_packet) {
1698 EXPECT_EQ(external_buffer.buffer, serialized_packet.encrypted_buffer);
1699 }));
1700 creator_.FlushCurrentPacket();
1701 }
1702
1703 // Test for error found in
1704 // https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1705 // length that crosses an IETF VarInt length boundary would cause a
1706 // failure. While this test is not applicable to versions other than version 99,
1707 // it should still work. Hence, it is not made version-specific.
TEST_P(QuicPacketCreatorTest,IetfAckGapErrorRegression)1708 TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1709 QuicAckFrame ack_frame =
1710 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1711 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1712 frames_.push_back(QuicFrame(&ack_frame));
1713 SerializeAllFrames(frames_);
1714 }
1715
TEST_P(QuicPacketCreatorTest,AddMessageFrame)1716 TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
1717 if (client_framer_.version().UsesTls()) {
1718 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1719 }
1720 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1721 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1722 .Times(3)
1723 .WillRepeatedly(
1724 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1725 // Verify that there is enough room for the largest message payload.
1726 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1727 creator_.GetCurrentLargestMessagePayload()));
1728 std::string large_message(creator_.GetCurrentLargestMessagePayload(), 'a');
1729 QuicMessageFrame* message_frame =
1730 new QuicMessageFrame(1, MemSliceFromString(large_message));
1731 EXPECT_TRUE(creator_.AddFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
1732 EXPECT_TRUE(creator_.HasPendingFrames());
1733 creator_.FlushCurrentPacket();
1734
1735 QuicMessageFrame* frame2 =
1736 new QuicMessageFrame(2, MemSliceFromString("message"));
1737 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
1738 EXPECT_TRUE(creator_.HasPendingFrames());
1739 // Verify if a new frame is added, 1 byte message length will be added.
1740 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
1741 QuicMessageFrame* frame3 =
1742 new QuicMessageFrame(3, MemSliceFromString("message2"));
1743 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
1744 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
1745 creator_.FlushCurrentPacket();
1746
1747 QuicFrame frame;
1748 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1749 client_framer_.transport_version(), Perspective::IS_CLIENT);
1750 const std::string data("test");
1751 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1752 stream_id, data, 0u, false, false, NOT_RETRANSMISSION, &frame));
1753 QuicMessageFrame* frame4 =
1754 new QuicMessageFrame(4, MemSliceFromString("message"));
1755 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
1756 EXPECT_TRUE(creator_.HasPendingFrames());
1757 // Verify there is not enough room for largest payload.
1758 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1759 creator_.GetCurrentLargestMessagePayload()));
1760 // Add largest message will causes the flush of the stream frame.
1761 QuicMessageFrame frame5(5, MemSliceFromString(large_message));
1762 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
1763 EXPECT_FALSE(creator_.HasPendingFrames());
1764 }
1765
TEST_P(QuicPacketCreatorTest,MessageFrameConsumption)1766 TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
1767 if (client_framer_.version().UsesTls()) {
1768 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1769 }
1770 std::string message_data(kDefaultMaxPacketSize, 'a');
1771 // Test all possible encryption levels of message frames.
1772 for (EncryptionLevel level :
1773 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1774 creator_.set_encryption_level(level);
1775 // Test all possible sizes of message frames.
1776 for (size_t message_size = 0;
1777 message_size <= creator_.GetCurrentLargestMessagePayload();
1778 ++message_size) {
1779 QuicMessageFrame* frame =
1780 new QuicMessageFrame(0, MemSliceFromString(absl::string_view(
1781 message_data.data(), message_size)));
1782 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame), NOT_RETRANSMISSION));
1783 EXPECT_TRUE(creator_.HasPendingFrames());
1784
1785 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1786 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1787 // Verify BytesFree returns bytes available for the next frame, which
1788 // should subtract the message length.
1789 size_t expected_bytes_free =
1790 creator_.GetCurrentLargestMessagePayload() - message_size <
1791 expansion_bytes
1792 ? 0
1793 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1794 message_size;
1795 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1796 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1797 creator_.GetCurrentLargestMessagePayload());
1798 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1799 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1800 creator_.FlushCurrentPacket();
1801 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1802 DeleteSerializedPacket();
1803 }
1804 }
1805 }
1806
TEST_P(QuicPacketCreatorTest,GetGuaranteedLargestMessagePayload)1807 TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
1808 ParsedQuicVersion version = GetParam().version;
1809 if (version.UsesTls()) {
1810 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1811 }
1812 QuicPacketLength expected_largest_payload = 1215;
1813 if (version.HasLongHeaderLengths()) {
1814 expected_largest_payload -= 2;
1815 }
1816 if (version.HasLengthPrefixedConnectionIds()) {
1817 expected_largest_payload -= 1;
1818 }
1819 EXPECT_EQ(expected_largest_payload,
1820 creator_.GetGuaranteedLargestMessagePayload());
1821 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1822 creator_.GetGuaranteedLargestMessagePayload()));
1823
1824 // Now test whether SetMaxDatagramFrameSize works.
1825 creator_.SetMaxDatagramFrameSize(expected_largest_payload + 1 +
1826 kQuicFrameTypeSize);
1827 EXPECT_EQ(expected_largest_payload,
1828 creator_.GetGuaranteedLargestMessagePayload());
1829 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1830 creator_.GetGuaranteedLargestMessagePayload()));
1831
1832 creator_.SetMaxDatagramFrameSize(expected_largest_payload +
1833 kQuicFrameTypeSize);
1834 EXPECT_EQ(expected_largest_payload,
1835 creator_.GetGuaranteedLargestMessagePayload());
1836 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1837 creator_.GetGuaranteedLargestMessagePayload()));
1838
1839 creator_.SetMaxDatagramFrameSize(expected_largest_payload - 1 +
1840 kQuicFrameTypeSize);
1841 EXPECT_EQ(expected_largest_payload - 1,
1842 creator_.GetGuaranteedLargestMessagePayload());
1843 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1844 creator_.GetGuaranteedLargestMessagePayload()));
1845
1846 constexpr QuicPacketLength kFrameSizeLimit = 1000;
1847 constexpr QuicPacketLength kPayloadSizeLimit =
1848 kFrameSizeLimit - kQuicFrameTypeSize;
1849 creator_.SetMaxDatagramFrameSize(kFrameSizeLimit);
1850 EXPECT_EQ(creator_.GetGuaranteedLargestMessagePayload(), kPayloadSizeLimit);
1851 EXPECT_TRUE(creator_.HasRoomForMessageFrame(kPayloadSizeLimit));
1852 EXPECT_FALSE(creator_.HasRoomForMessageFrame(kPayloadSizeLimit + 1));
1853 }
1854
TEST_P(QuicPacketCreatorTest,GetCurrentLargestMessagePayload)1855 TEST_P(QuicPacketCreatorTest, GetCurrentLargestMessagePayload) {
1856 ParsedQuicVersion version = GetParam().version;
1857 if (version.UsesTls()) {
1858 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1859 }
1860 QuicPacketLength expected_largest_payload = 1215;
1861 if (version.SendsVariableLengthPacketNumberInLongHeader()) {
1862 expected_largest_payload += 3;
1863 }
1864 if (version.HasLongHeaderLengths()) {
1865 expected_largest_payload -= 2;
1866 }
1867 if (version.HasLengthPrefixedConnectionIds()) {
1868 expected_largest_payload -= 1;
1869 }
1870 EXPECT_EQ(expected_largest_payload,
1871 creator_.GetCurrentLargestMessagePayload());
1872
1873 // Now test whether SetMaxDatagramFrameSize works.
1874 creator_.SetMaxDatagramFrameSize(expected_largest_payload + 1 +
1875 kQuicFrameTypeSize);
1876 EXPECT_EQ(expected_largest_payload,
1877 creator_.GetCurrentLargestMessagePayload());
1878
1879 creator_.SetMaxDatagramFrameSize(expected_largest_payload +
1880 kQuicFrameTypeSize);
1881 EXPECT_EQ(expected_largest_payload,
1882 creator_.GetCurrentLargestMessagePayload());
1883
1884 creator_.SetMaxDatagramFrameSize(expected_largest_payload - 1 +
1885 kQuicFrameTypeSize);
1886 EXPECT_EQ(expected_largest_payload - 1,
1887 creator_.GetCurrentLargestMessagePayload());
1888 }
1889
TEST_P(QuicPacketCreatorTest,PacketTransmissionType)1890 TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
1891 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1892
1893 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1894 QuicFrame ack_frame(&temp_ack_frame);
1895 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1896
1897 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1898 client_framer_.transport_version(), Perspective::IS_CLIENT);
1899 QuicFrame stream_frame(QuicStreamFrame(stream_id,
1900 /*fin=*/false, 0u,
1901 absl::string_view()));
1902 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1903
1904 QuicFrame stream_frame_2(QuicStreamFrame(stream_id,
1905 /*fin=*/false, 1u,
1906 absl::string_view()));
1907
1908 QuicFrame padding_frame{QuicPaddingFrame()};
1909 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1910
1911 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1912 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1913
1914 EXPECT_TRUE(creator_.AddFrame(ack_frame, LOSS_RETRANSMISSION));
1915 ASSERT_EQ(serialized_packet_, nullptr);
1916
1917 EXPECT_TRUE(creator_.AddFrame(stream_frame, PTO_RETRANSMISSION));
1918 ASSERT_EQ(serialized_packet_, nullptr);
1919
1920 EXPECT_TRUE(creator_.AddFrame(stream_frame_2, PATH_RETRANSMISSION));
1921 ASSERT_EQ(serialized_packet_, nullptr);
1922
1923 EXPECT_TRUE(creator_.AddFrame(padding_frame, PTO_RETRANSMISSION));
1924 creator_.FlushCurrentPacket();
1925 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1926
1927 // The last retransmittable frame on packet is a stream frame, the packet's
1928 // transmission type should be the same as the stream frame's.
1929 EXPECT_EQ(serialized_packet_->transmission_type, PATH_RETRANSMISSION);
1930 DeleteSerializedPacket();
1931 }
1932
TEST_P(QuicPacketCreatorTest,PacketBytesRetransmitted_AddFrame_Retransmission)1933 TEST_P(QuicPacketCreatorTest,
1934 PacketBytesRetransmitted_AddFrame_Retransmission) {
1935 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1936
1937 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1938 QuicFrame ack_frame(&temp_ack_frame);
1939 EXPECT_TRUE(creator_.AddFrame(ack_frame, LOSS_RETRANSMISSION));
1940
1941 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1942 client_framer_.transport_version(), Perspective::IS_CLIENT);
1943
1944 QuicFrame stream_frame;
1945 const std::string data("data");
1946 // ConsumeDataToFillCurrentPacket calls AddFrame
1947 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1948 stream_id, data, 0u, false, false, PTO_RETRANSMISSION, &stream_frame));
1949 EXPECT_EQ(4u, stream_frame.stream_frame.data_length);
1950
1951 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1952 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1953
1954 creator_.FlushCurrentPacket();
1955 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1956 ASSERT_FALSE(serialized_packet_->bytes_not_retransmitted.has_value());
1957
1958 DeleteSerializedPacket();
1959 }
1960
TEST_P(QuicPacketCreatorTest,PacketBytesRetransmitted_AddFrame_NotRetransmission)1961 TEST_P(QuicPacketCreatorTest,
1962 PacketBytesRetransmitted_AddFrame_NotRetransmission) {
1963 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1964
1965 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1966 QuicFrame ack_frame(&temp_ack_frame);
1967 EXPECT_TRUE(creator_.AddFrame(ack_frame, NOT_RETRANSMISSION));
1968
1969 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1970 client_framer_.transport_version(), Perspective::IS_CLIENT);
1971
1972 QuicFrame stream_frame;
1973 const std::string data("data");
1974 // ConsumeDataToFillCurrentPacket calls AddFrame
1975 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1976 stream_id, data, 0u, false, false, NOT_RETRANSMISSION, &stream_frame));
1977 EXPECT_EQ(4u, stream_frame.stream_frame.data_length);
1978
1979 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1980 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1981
1982 creator_.FlushCurrentPacket();
1983 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1984 ASSERT_FALSE(serialized_packet_->bytes_not_retransmitted.has_value());
1985
1986 DeleteSerializedPacket();
1987 }
1988
TEST_P(QuicPacketCreatorTest,PacketBytesRetransmitted_AddFrame_MixedFrames)1989 TEST_P(QuicPacketCreatorTest, PacketBytesRetransmitted_AddFrame_MixedFrames) {
1990 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1991
1992 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1993 QuicFrame ack_frame(&temp_ack_frame);
1994 EXPECT_TRUE(creator_.AddFrame(ack_frame, NOT_RETRANSMISSION));
1995
1996 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1997 client_framer_.transport_version(), Perspective::IS_CLIENT);
1998
1999 QuicFrame stream_frame;
2000 const std::string data("data");
2001 // ConsumeDataToFillCurrentPacket calls AddFrame
2002 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2003 stream_id, data, 0u, false, false, NOT_RETRANSMISSION, &stream_frame));
2004 EXPECT_EQ(4u, stream_frame.stream_frame.data_length);
2005
2006 QuicFrame stream_frame2;
2007 // ConsumeDataToFillCurrentPacket calls AddFrame
2008 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2009 stream_id, data, 0u, false, false, LOSS_RETRANSMISSION, &stream_frame2));
2010 EXPECT_EQ(4u, stream_frame2.stream_frame.data_length);
2011
2012 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2013 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2014
2015 creator_.FlushCurrentPacket();
2016 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
2017 ASSERT_TRUE(serialized_packet_->bytes_not_retransmitted.has_value());
2018 ASSERT_GE(serialized_packet_->bytes_not_retransmitted.value(), 4u);
2019
2020 DeleteSerializedPacket();
2021 }
2022
TEST_P(QuicPacketCreatorTest,PacketBytesRetransmitted_CreateAndSerializeStreamFrame_Retransmission)2023 TEST_P(QuicPacketCreatorTest,
2024 PacketBytesRetransmitted_CreateAndSerializeStreamFrame_Retransmission) {
2025 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2026
2027 const std::string data("test");
2028 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), data);
2029 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2030 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2031 size_t num_bytes_consumed;
2032 // Retransmission frame adds to packet's bytes_retransmitted
2033 creator_.CreateAndSerializeStreamFrame(
2034 GetNthClientInitiatedStreamId(0), data.length(), 0, 0, true,
2035 LOSS_RETRANSMISSION, &num_bytes_consumed);
2036 EXPECT_EQ(4u, num_bytes_consumed);
2037
2038 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
2039 ASSERT_FALSE(serialized_packet_->bytes_not_retransmitted.has_value());
2040 DeleteSerializedPacket();
2041
2042 EXPECT_FALSE(creator_.HasPendingFrames());
2043 }
2044
TEST_P(QuicPacketCreatorTest,PacketBytesRetransmitted_CreateAndSerializeStreamFrame_NotRetransmission)2045 TEST_P(
2046 QuicPacketCreatorTest,
2047 PacketBytesRetransmitted_CreateAndSerializeStreamFrame_NotRetransmission) {
2048 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2049
2050 const std::string data("test");
2051 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), data);
2052 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2053 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2054 size_t num_bytes_consumed;
2055 // Non-retransmission frame does not add to packet's bytes_retransmitted
2056 creator_.CreateAndSerializeStreamFrame(
2057 GetNthClientInitiatedStreamId(0), data.length(), 0, 0, true,
2058 NOT_RETRANSMISSION, &num_bytes_consumed);
2059 EXPECT_EQ(4u, num_bytes_consumed);
2060
2061 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
2062 ASSERT_FALSE(serialized_packet_->bytes_not_retransmitted.has_value());
2063 DeleteSerializedPacket();
2064
2065 EXPECT_FALSE(creator_.HasPendingFrames());
2066 }
2067
TEST_P(QuicPacketCreatorTest,RetryToken)2068 TEST_P(QuicPacketCreatorTest, RetryToken) {
2069 if (!GetParam().version_serialization ||
2070 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
2071 return;
2072 }
2073
2074 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
2075 9, 10, 11, 12, 13, 14, 15, 16};
2076
2077 creator_.SetRetryToken(
2078 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
2079
2080 frames_.push_back(QuicFrame(QuicPingFrame()));
2081 SerializedPacket serialized = SerializeAllFrames(frames_);
2082
2083 QuicPacketHeader header;
2084 {
2085 InSequence s;
2086 EXPECT_CALL(framer_visitor_, OnPacket());
2087 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2088 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2089 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
2090 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
2091 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
2092 if (client_framer_.version().HasHeaderProtection()) {
2093 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2094 }
2095 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
2096 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2097 }
2098 ProcessPacket(serialized);
2099 ASSERT_TRUE(header.version_flag);
2100 ASSERT_EQ(header.long_packet_type, INITIAL);
2101 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
2102 quiche::test::CompareCharArraysWithHexError(
2103 "retry token", header.retry_token.data(), header.retry_token.length(),
2104 retry_token_bytes, sizeof(retry_token_bytes));
2105 }
2106
TEST_P(QuicPacketCreatorTest,GetConnectionId)2107 TEST_P(QuicPacketCreatorTest, GetConnectionId) {
2108 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
2109 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
2110 }
2111
TEST_P(QuicPacketCreatorTest,ClientConnectionId)2112 TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
2113 if (!client_framer_.version().SupportsClientConnectionIds()) {
2114 return;
2115 }
2116 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
2117 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
2118 creator_.SetClientConnectionId(TestConnectionId(0x33));
2119 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
2120 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
2121 }
2122
TEST_P(QuicPacketCreatorTest,CoalesceStreamFrames)2123 TEST_P(QuicPacketCreatorTest, CoalesceStreamFrames) {
2124 InSequence s;
2125 if (!GetParam().version_serialization) {
2126 creator_.StopSendingVersion();
2127 }
2128 const size_t max_plaintext_size =
2129 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
2130 EXPECT_FALSE(creator_.HasPendingFrames());
2131 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2132 QuicStreamId stream_id1 = QuicUtils::GetFirstBidirectionalStreamId(
2133 client_framer_.transport_version(), Perspective::IS_CLIENT);
2134 QuicStreamId stream_id2 = GetNthClientInitiatedStreamId(1);
2135 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2136 EXPECT_EQ(max_plaintext_size -
2137 GetPacketHeaderSize(
2138 client_framer_.transport_version(),
2139 creator_.GetDestinationConnectionIdLength(),
2140 creator_.GetSourceConnectionIdLength(),
2141 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2142 !kIncludeDiversificationNonce,
2143 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2144 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
2145 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
2146 creator_.BytesFree());
2147 StrictMock<MockDebugDelegate> debug;
2148 creator_.set_debug_delegate(&debug);
2149
2150 QuicFrame frame;
2151 const std::string data1("test");
2152 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2153 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2154 stream_id1, data1, 0u, false, false, NOT_RETRANSMISSION, &frame));
2155 EXPECT_TRUE(creator_.HasPendingFrames());
2156 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2157
2158 const std::string data2("coalesce");
2159 // frame will be coalesced with the first frame.
2160 const auto previous_size = creator_.PacketSize();
2161 QuicStreamFrame target(stream_id1, true, 0, data1.length() + data2.length());
2162 EXPECT_CALL(debug, OnStreamFrameCoalesced(target));
2163 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2164 stream_id1, data2, 4u, true, false, NOT_RETRANSMISSION, &frame));
2165 EXPECT_EQ(frame.stream_frame.data_length,
2166 creator_.PacketSize() - previous_size);
2167
2168 // frame is for another stream, so it won't be coalesced.
2169 const auto length = creator_.BytesFree() - 10u;
2170 const std::string data3(length, 'x');
2171 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2172 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2173 stream_id2, data3, 0u, false, false, NOT_RETRANSMISSION, &frame));
2174 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id2));
2175
2176 // The packet doesn't have enough free bytes for all data, but will still be
2177 // able to consume and coalesce part of them.
2178 EXPECT_CALL(debug, OnStreamFrameCoalesced(_));
2179 const std::string data4("somerandomdata");
2180 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2181 stream_id2, data4, length, false, false, NOT_RETRANSMISSION, &frame));
2182
2183 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2184 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2185 creator_.FlushCurrentPacket();
2186 EXPECT_CALL(framer_visitor_, OnPacket());
2187 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2188 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2189 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
2190 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2191 // The packet should only have 2 stream frames.
2192 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2193 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2194 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2195 ProcessPacket(*serialized_packet_);
2196 }
2197
TEST_P(QuicPacketCreatorTest,SaveNonRetransmittableFrames)2198 TEST_P(QuicPacketCreatorTest, SaveNonRetransmittableFrames) {
2199 QuicAckFrame ack_frame(InitAckFrame(1));
2200 frames_.push_back(QuicFrame(&ack_frame));
2201 frames_.push_back(QuicFrame(QuicPaddingFrame(-1)));
2202 SerializedPacket serialized = SerializeAllFrames(frames_);
2203 ASSERT_EQ(2u, serialized.nonretransmittable_frames.size());
2204 EXPECT_EQ(ACK_FRAME, serialized.nonretransmittable_frames[0].type);
2205 EXPECT_EQ(PADDING_FRAME, serialized.nonretransmittable_frames[1].type);
2206 // Verify full padding frame is translated to a padding frame with actual
2207 // bytes of padding.
2208 EXPECT_LT(
2209 0,
2210 serialized.nonretransmittable_frames[1].padding_frame.num_padding_bytes);
2211 frames_.clear();
2212
2213 // Serialize another packet with the same frames.
2214 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
2215 &creator_, serialized.nonretransmittable_frames, buffer_,
2216 kMaxOutgoingPacketSize);
2217 // Verify the packet length of both packets are equal.
2218 EXPECT_EQ(serialized.encrypted_length, packet.encrypted_length);
2219 }
2220
TEST_P(QuicPacketCreatorTest,SerializeCoalescedPacket)2221 TEST_P(QuicPacketCreatorTest, SerializeCoalescedPacket) {
2222 QuicCoalescedPacket coalesced;
2223 quiche::SimpleBufferAllocator allocator;
2224 QuicSocketAddress self_address(QuicIpAddress::Loopback4(), 1);
2225 QuicSocketAddress peer_address(QuicIpAddress::Loopback4(), 2);
2226 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2227 EncryptionLevel level = static_cast<EncryptionLevel>(i);
2228 creator_.set_encryption_level(level);
2229 QuicAckFrame ack_frame(InitAckFrame(1));
2230 if (level != ENCRYPTION_ZERO_RTT) {
2231 frames_.push_back(QuicFrame(&ack_frame));
2232 }
2233 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
2234 frames_.push_back(
2235 QuicFrame(QuicStreamFrame(1, false, 0u, absl::string_view())));
2236 }
2237 SerializedPacket serialized = SerializeAllFrames(frames_);
2238 EXPECT_EQ(level, serialized.encryption_level);
2239 frames_.clear();
2240 ASSERT_TRUE(coalesced.MaybeCoalescePacket(
2241 serialized, self_address, peer_address, &allocator,
2242 creator_.max_packet_length(), ECN_NOT_ECT));
2243 }
2244 char buffer[kMaxOutgoingPacketSize];
2245 size_t coalesced_length = creator_.SerializeCoalescedPacket(
2246 coalesced, buffer, kMaxOutgoingPacketSize);
2247 // Verify packet is padded to full.
2248 ASSERT_EQ(coalesced.max_packet_length(), coalesced_length);
2249 if (!QuicVersionHasLongHeaderLengths(server_framer_.transport_version())) {
2250 return;
2251 }
2252 // Verify packet process.
2253 std::unique_ptr<QuicEncryptedPacket> packets[NUM_ENCRYPTION_LEVELS];
2254 packets[ENCRYPTION_INITIAL] =
2255 std::make_unique<QuicEncryptedPacket>(buffer, coalesced_length);
2256 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2257 InSequence s;
2258 EXPECT_CALL(framer_visitor_, OnPacket());
2259 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2260 if (i < ENCRYPTION_FORWARD_SECURE) {
2261 // Save coalesced packet.
2262 EXPECT_CALL(framer_visitor_, OnCoalescedPacket(_))
2263 .WillOnce(Invoke([i, &packets](const QuicEncryptedPacket& packet) {
2264 packets[i + 1] = packet.Clone();
2265 }));
2266 }
2267 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2268 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
2269 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2270 if (i != ENCRYPTION_ZERO_RTT) {
2271 if (i != ENCRYPTION_INITIAL) {
2272 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_))
2273 .Times(testing::AtMost(1));
2274 }
2275 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
2276 .WillOnce(Return(true));
2277 EXPECT_CALL(framer_visitor_,
2278 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
2279 .WillOnce(Return(true));
2280 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(_, _)).WillOnce(Return(true));
2281 }
2282 if (i == ENCRYPTION_INITIAL) {
2283 // Verify padding is added.
2284 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2285 }
2286 if (i == ENCRYPTION_ZERO_RTT) {
2287 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2288 }
2289 if (i != ENCRYPTION_INITIAL && i != ENCRYPTION_HANDSHAKE) {
2290 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2291 }
2292 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2293 server_framer_.ProcessPacket(*packets[i]);
2294 }
2295 }
2296
TEST_P(QuicPacketCreatorTest,SoftMaxPacketLength)2297 TEST_P(QuicPacketCreatorTest, SoftMaxPacketLength) {
2298 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2299 QuicByteCount previous_max_packet_length = creator_.max_packet_length();
2300 const size_t overhead =
2301 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2302 QuicPacketCreator::MinPlaintextPacketSize(
2303 client_framer_.version(),
2304 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)) +
2305 GetEncryptionOverhead();
2306 // Make sure a length which cannot accommodate header (includes header
2307 // protection minimal length) gets rejected.
2308 creator_.SetSoftMaxPacketLength(overhead - 1);
2309 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2310
2311 creator_.SetSoftMaxPacketLength(overhead);
2312 EXPECT_EQ(overhead, creator_.max_packet_length());
2313
2314 // Verify creator has room for stream frame because max_packet_length_ gets
2315 // restored.
2316 ASSERT_TRUE(creator_.HasRoomForStreamFrame(
2317 GetNthClientInitiatedStreamId(1), kMaxIetfVarInt,
2318 std::numeric_limits<uint32_t>::max()));
2319 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2320
2321 // Same for message frame.
2322 creator_.SetSoftMaxPacketLength(overhead);
2323 if (client_framer_.version().UsesTls()) {
2324 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
2325 }
2326 // Verify GetCurrentLargestMessagePayload is based on the actual
2327 // max_packet_length.
2328 EXPECT_LT(1u, creator_.GetCurrentLargestMessagePayload());
2329 EXPECT_EQ(overhead, creator_.max_packet_length());
2330 ASSERT_TRUE(creator_.HasRoomForMessageFrame(
2331 creator_.GetCurrentLargestMessagePayload()));
2332 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2333
2334 // Verify creator can consume crypto data because max_packet_length_ gets
2335 // restored.
2336 creator_.SetSoftMaxPacketLength(overhead);
2337 EXPECT_EQ(overhead, creator_.max_packet_length());
2338 const std::string data = "crypto data";
2339 QuicFrame frame;
2340 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
2341 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2342 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), data,
2343 kOffset, false, true, NOT_RETRANSMISSION, &frame));
2344 size_t bytes_consumed = frame.stream_frame.data_length;
2345 EXPECT_LT(0u, bytes_consumed);
2346 } else {
2347 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
2348 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
2349 ENCRYPTION_INITIAL, data.length(), kOffset,
2350 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
2351 size_t bytes_consumed = frame.crypto_frame->data_length;
2352 EXPECT_LT(0u, bytes_consumed);
2353 }
2354 EXPECT_TRUE(creator_.HasPendingFrames());
2355 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2356 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2357 creator_.FlushCurrentPacket();
2358
2359 // Verify ACK frame can be consumed.
2360 creator_.SetSoftMaxPacketLength(overhead);
2361 EXPECT_EQ(overhead, creator_.max_packet_length());
2362 QuicAckFrame ack_frame(InitAckFrame(10u));
2363 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
2364 EXPECT_TRUE(creator_.HasPendingFrames());
2365 }
2366
TEST_P(QuicPacketCreatorTest,ChangingEncryptionLevelRemovesSoftMaxPacketLength)2367 TEST_P(QuicPacketCreatorTest,
2368 ChangingEncryptionLevelRemovesSoftMaxPacketLength) {
2369 if (!client_framer_.version().CanSendCoalescedPackets()) {
2370 return;
2371 }
2372 // First set encryption level to forward secure which has the shortest header.
2373 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2374 const QuicByteCount previous_max_packet_length = creator_.max_packet_length();
2375 const size_t min_acceptable_packet_size =
2376 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2377 QuicPacketCreator::MinPlaintextPacketSize(
2378 client_framer_.version(),
2379 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)) +
2380 GetEncryptionOverhead();
2381 // Then set the soft max packet length to the lowest allowed value.
2382 creator_.SetSoftMaxPacketLength(min_acceptable_packet_size);
2383 // Make sure that the low value was accepted.
2384 EXPECT_EQ(creator_.max_packet_length(), min_acceptable_packet_size);
2385 // Now set the encryption level to handshake which increases the header size.
2386 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
2387 // Make sure that adding a frame removes the the soft max packet length.
2388 QuicAckFrame ack_frame(InitAckFrame(1));
2389 frames_.push_back(QuicFrame(&ack_frame));
2390 SerializedPacket serialized = SerializeAllFrames(frames_);
2391 EXPECT_EQ(serialized.encryption_level, ENCRYPTION_HANDSHAKE);
2392 EXPECT_EQ(creator_.max_packet_length(), previous_max_packet_length);
2393 }
2394
TEST_P(QuicPacketCreatorTest,MinPayloadLength)2395 TEST_P(QuicPacketCreatorTest, MinPayloadLength) {
2396 ParsedQuicVersion version = client_framer_.version();
2397 for (QuicPacketNumberLength pn_length :
2398 {PACKET_1BYTE_PACKET_NUMBER, PACKET_2BYTE_PACKET_NUMBER,
2399 PACKET_3BYTE_PACKET_NUMBER, PACKET_4BYTE_PACKET_NUMBER}) {
2400 if (!version.HasHeaderProtection()) {
2401 EXPECT_EQ(creator_.MinPlaintextPacketSize(version, pn_length), 0);
2402 } else {
2403 EXPECT_EQ(creator_.MinPlaintextPacketSize(version, pn_length),
2404 (version.UsesTls() ? 4 : 8) - pn_length);
2405 }
2406 }
2407 }
2408
2409 // A variant of StreamFrameConsumption that tests when expansion of the stream
2410 // frame puts it at or over the max length, but the packet is supposed to be
2411 // padded to max length.
TEST_P(QuicPacketCreatorTest,PadWhenAlmostMaxLength)2412 TEST_P(QuicPacketCreatorTest, PadWhenAlmostMaxLength) {
2413 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2414 // Compute the total overhead for a single frame in packet.
2415 const size_t overhead =
2416 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2417 GetEncryptionOverhead() +
2418 GetStreamFrameOverhead(client_framer_.transport_version());
2419 size_t capacity = kDefaultMaxPacketSize - overhead;
2420 for (size_t bytes_free = 1; bytes_free <= 2; bytes_free++) {
2421 std::string data(capacity - bytes_free, 'A');
2422
2423 QuicFrame frame;
2424 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2425 GetNthClientInitiatedStreamId(1), data, kOffset, false,
2426 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
2427
2428 // BytesFree() returns bytes available for the next frame, which will
2429 // be two bytes smaller since the stream frame would need to be grown.
2430 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
2431 EXPECT_EQ(0u, creator_.BytesFree());
2432 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2433 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2434 creator_.FlushCurrentPacket();
2435 EXPECT_EQ(serialized_packet_->encrypted_length, kDefaultMaxPacketSize);
2436 DeleteSerializedPacket();
2437 }
2438 }
2439
TEST_P(QuicPacketCreatorTest,MorePendingPaddingThanBytesFree)2440 TEST_P(QuicPacketCreatorTest, MorePendingPaddingThanBytesFree) {
2441 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2442 // Compute the total overhead for a single frame in packet.
2443 const size_t overhead =
2444 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2445 GetEncryptionOverhead() +
2446 GetStreamFrameOverhead(client_framer_.transport_version());
2447 size_t capacity = kDefaultMaxPacketSize - overhead;
2448 const size_t pending_padding = 10;
2449 std::string data(capacity - pending_padding, 'A');
2450 QuicFrame frame;
2451 // The stream frame means that BytesFree() will be less than the
2452 // available space, because of the frame length field.
2453 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2454 GetNthClientInitiatedStreamId(1), data, kOffset, false,
2455 /*needs_full_padding=*/false, NOT_RETRANSMISSION, &frame));
2456 creator_.AddPendingPadding(pending_padding);
2457 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
2458 // BytesFree() does not know about pending_padding because that's added
2459 // when flushed.
2460 EXPECT_EQ(pending_padding - 2u, creator_.BytesFree());
2461 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2462 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2463 creator_.FlushCurrentPacket();
2464 /* Without the fix, the packet is not full-length. */
2465 EXPECT_EQ(serialized_packet_->encrypted_length, kDefaultMaxPacketSize);
2466 DeleteSerializedPacket();
2467 }
2468
2469 class MockDelegate : public QuicPacketCreator::DelegateInterface {
2470 public:
MockDelegate()2471 MockDelegate() {}
2472 MockDelegate(const MockDelegate&) = delete;
2473 MockDelegate& operator=(const MockDelegate&) = delete;
~MockDelegate()2474 ~MockDelegate() override {}
2475
2476 MOCK_METHOD(bool, ShouldGeneratePacket,
2477 (HasRetransmittableData retransmittable, IsHandshake handshake),
2478 (override));
2479 MOCK_METHOD(void, MaybeBundleOpportunistically, (), (override));
2480 MOCK_METHOD(QuicByteCount, GetFlowControlSendWindowSize, (QuicStreamId),
2481 (override));
2482 MOCK_METHOD(QuicPacketBuffer, GetPacketBuffer, (), (override));
2483 MOCK_METHOD(void, OnSerializedPacket, (SerializedPacket), (override));
2484 MOCK_METHOD(void, OnUnrecoverableError, (QuicErrorCode, const std::string&),
2485 (override));
2486 MOCK_METHOD(SerializedPacketFate, GetSerializedPacketFate,
2487 (bool, EncryptionLevel), (override));
2488
SetCanWriteAnything()2489 void SetCanWriteAnything() {
2490 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
2491 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2492 .WillRepeatedly(Return(true));
2493 }
2494
SetCanNotWrite()2495 void SetCanNotWrite() {
2496 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2497 .WillRepeatedly(Return(false));
2498 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2499 .WillRepeatedly(Return(false));
2500 }
2501
2502 // Use this when only ack frames should be allowed to be written.
SetCanWriteOnlyNonRetransmittable()2503 void SetCanWriteOnlyNonRetransmittable() {
2504 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2505 .WillRepeatedly(Return(false));
2506 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2507 .WillRepeatedly(Return(true));
2508 }
2509 };
2510
2511 // Simple struct for describing the contents of a packet.
2512 // Useful in conjunction with a SimpleQuicFrame for validating that a packet
2513 // contains the expected frames.
2514 struct PacketContents {
PacketContentsquic::test::__anon1f7b9ac50111::PacketContents2515 PacketContents()
2516 : num_ack_frames(0),
2517 num_connection_close_frames(0),
2518 num_goaway_frames(0),
2519 num_rst_stream_frames(0),
2520 num_stop_waiting_frames(0),
2521 num_stream_frames(0),
2522 num_crypto_frames(0),
2523 num_ping_frames(0),
2524 num_mtu_discovery_frames(0),
2525 num_padding_frames(0) {}
2526
2527 size_t num_ack_frames;
2528 size_t num_connection_close_frames;
2529 size_t num_goaway_frames;
2530 size_t num_rst_stream_frames;
2531 size_t num_stop_waiting_frames;
2532 size_t num_stream_frames;
2533 size_t num_crypto_frames;
2534 size_t num_ping_frames;
2535 size_t num_mtu_discovery_frames;
2536 size_t num_padding_frames;
2537 };
2538
2539 class MultiplePacketsTestPacketCreator : public QuicPacketCreator {
2540 public:
MultiplePacketsTestPacketCreator(QuicConnectionId connection_id,QuicFramer * framer,QuicRandom * random_generator,QuicPacketCreator::DelegateInterface * delegate,SimpleDataProducer * producer)2541 MultiplePacketsTestPacketCreator(
2542 QuicConnectionId connection_id, QuicFramer* framer,
2543 QuicRandom* random_generator,
2544 QuicPacketCreator::DelegateInterface* delegate,
2545 SimpleDataProducer* producer)
2546 : QuicPacketCreator(connection_id, framer, random_generator, delegate),
2547 ack_frame_(InitAckFrame(1)),
2548 delegate_(static_cast<MockDelegate*>(delegate)),
2549 producer_(producer) {}
2550
ConsumeRetransmittableControlFrame(const QuicFrame & frame,bool bundle_ack)2551 bool ConsumeRetransmittableControlFrame(const QuicFrame& frame,
2552 bool bundle_ack) {
2553 QuicFrames frames;
2554 if (bundle_ack) {
2555 frames.push_back(QuicFrame(&ack_frame_));
2556 }
2557 EXPECT_CALL(*delegate_, MaybeBundleOpportunistically())
2558 .WillOnce(Invoke([this, frames = std::move(frames)] {
2559 FlushAckFrame(frames);
2560 return QuicFrames();
2561 }));
2562 return QuicPacketCreator::ConsumeRetransmittableControlFrame(frame);
2563 }
2564
ConsumeDataFastPath(QuicStreamId id,absl::string_view data)2565 QuicConsumedData ConsumeDataFastPath(QuicStreamId id,
2566 absl::string_view data) {
2567 // Save data before data is consumed.
2568 if (!data.empty()) {
2569 producer_->SaveStreamData(id, data);
2570 }
2571 return QuicPacketCreator::ConsumeDataFastPath(id, data.length(),
2572 /* offset = */ 0,
2573 /* fin = */ true, 0);
2574 }
2575
ConsumeData(QuicStreamId id,absl::string_view data,QuicStreamOffset offset,StreamSendingState state)2576 QuicConsumedData ConsumeData(QuicStreamId id, absl::string_view data,
2577 QuicStreamOffset offset,
2578 StreamSendingState state) {
2579 // Save data before data is consumed.
2580 if (!data.empty()) {
2581 producer_->SaveStreamData(id, data);
2582 }
2583 EXPECT_CALL(*delegate_, MaybeBundleOpportunistically()).Times(1);
2584 return QuicPacketCreator::ConsumeData(id, data.length(), offset, state);
2585 }
2586
AddMessageFrame(QuicMessageId message_id,quiche::QuicheMemSlice message)2587 MessageStatus AddMessageFrame(QuicMessageId message_id,
2588 quiche::QuicheMemSlice message) {
2589 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2590 NOT_HANDSHAKE)) {
2591 EXPECT_CALL(*delegate_, MaybeBundleOpportunistically()).Times(1);
2592 }
2593 return QuicPacketCreator::AddMessageFrame(message_id,
2594 absl::MakeSpan(&message, 1));
2595 }
2596
ConsumeCryptoData(EncryptionLevel level,absl::string_view data,QuicStreamOffset offset)2597 size_t ConsumeCryptoData(EncryptionLevel level, absl::string_view data,
2598 QuicStreamOffset offset) {
2599 producer_->SaveCryptoData(level, offset, data);
2600 EXPECT_CALL(*delegate_, MaybeBundleOpportunistically()).Times(1);
2601 return QuicPacketCreator::ConsumeCryptoData(level, data.length(), offset);
2602 }
2603
2604 QuicAckFrame ack_frame_;
2605 MockDelegate* delegate_;
2606 SimpleDataProducer* producer_;
2607 };
2608
2609 class QuicPacketCreatorMultiplePacketsTest : public QuicTest {
2610 public:
QuicPacketCreatorMultiplePacketsTest()2611 QuicPacketCreatorMultiplePacketsTest()
2612 : framer_(AllSupportedVersions(), QuicTime::Zero(),
2613 Perspective::IS_CLIENT, kQuicDefaultConnectionIdLength),
2614 creator_(TestConnectionId(), &framer_, &random_creator_, &delegate_,
2615 &producer_),
2616 ack_frame_(InitAckFrame(1)) {
2617 EXPECT_CALL(delegate_, GetPacketBuffer())
2618 .WillRepeatedly(Return(QuicPacketBuffer()));
2619 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
2620 .WillRepeatedly(Return(SEND_TO_WRITER));
2621 EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(_))
2622 .WillRepeatedly(Return(std::numeric_limits<QuicByteCount>::max()));
2623 creator_.SetEncrypter(
2624 ENCRYPTION_FORWARD_SECURE,
2625 std::make_unique<TaggingEncrypter>(ENCRYPTION_FORWARD_SECURE));
2626 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2627 framer_.set_data_producer(&producer_);
2628 if (simple_framer_.framer()->version().KnowsWhichDecrypterToUse()) {
2629 simple_framer_.framer()->InstallDecrypter(
2630 ENCRYPTION_FORWARD_SECURE, std::make_unique<TaggingDecrypter>());
2631 }
2632 creator_.AttachPacketFlusher();
2633 }
2634
~QuicPacketCreatorMultiplePacketsTest()2635 ~QuicPacketCreatorMultiplePacketsTest() override {}
2636
SavePacket(SerializedPacket packet)2637 void SavePacket(SerializedPacket packet) {
2638 QUICHE_DCHECK(packet.release_encrypted_buffer == nullptr);
2639 packet.encrypted_buffer = CopyBuffer(packet);
2640 packet.release_encrypted_buffer = [](const char* p) { delete[] p; };
2641 packets_.push_back(std::move(packet));
2642 }
2643
2644 protected:
CreateRstStreamFrame()2645 QuicRstStreamFrame* CreateRstStreamFrame() {
2646 return new QuicRstStreamFrame(1, 1, QUIC_STREAM_NO_ERROR, 0);
2647 }
2648
CreateGoAwayFrame()2649 QuicGoAwayFrame* CreateGoAwayFrame() {
2650 return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, std::string());
2651 }
2652
CheckPacketContains(const PacketContents & contents,size_t packet_index)2653 void CheckPacketContains(const PacketContents& contents,
2654 size_t packet_index) {
2655 ASSERT_GT(packets_.size(), packet_index);
2656 const SerializedPacket& packet = packets_[packet_index];
2657 size_t num_retransmittable_frames =
2658 contents.num_connection_close_frames + contents.num_goaway_frames +
2659 contents.num_rst_stream_frames + contents.num_stream_frames +
2660 contents.num_crypto_frames + contents.num_ping_frames;
2661 size_t num_frames =
2662 contents.num_ack_frames + contents.num_stop_waiting_frames +
2663 contents.num_mtu_discovery_frames + contents.num_padding_frames +
2664 num_retransmittable_frames;
2665
2666 if (num_retransmittable_frames == 0) {
2667 ASSERT_TRUE(packet.retransmittable_frames.empty());
2668 } else {
2669 EXPECT_EQ(num_retransmittable_frames,
2670 packet.retransmittable_frames.size());
2671 }
2672
2673 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2674 ASSERT_TRUE(simple_framer_.ProcessPacket(
2675 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2676 size_t num_padding_frames = 0;
2677 if (contents.num_padding_frames == 0) {
2678 num_padding_frames = simple_framer_.padding_frames().size();
2679 }
2680 EXPECT_EQ(num_frames + num_padding_frames, simple_framer_.num_frames());
2681 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
2682 EXPECT_EQ(contents.num_connection_close_frames,
2683 simple_framer_.connection_close_frames().size());
2684 EXPECT_EQ(contents.num_goaway_frames,
2685 simple_framer_.goaway_frames().size());
2686 EXPECT_EQ(contents.num_rst_stream_frames,
2687 simple_framer_.rst_stream_frames().size());
2688 EXPECT_EQ(contents.num_stream_frames,
2689 simple_framer_.stream_frames().size());
2690 EXPECT_EQ(contents.num_crypto_frames,
2691 simple_framer_.crypto_frames().size());
2692 EXPECT_EQ(contents.num_stop_waiting_frames,
2693 simple_framer_.stop_waiting_frames().size());
2694 if (contents.num_padding_frames != 0) {
2695 EXPECT_EQ(contents.num_padding_frames,
2696 simple_framer_.padding_frames().size());
2697 }
2698
2699 // From the receiver's perspective, MTU discovery frames are ping frames.
2700 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames,
2701 simple_framer_.ping_frames().size());
2702 }
2703
CheckPacketHasSingleStreamFrame(size_t packet_index)2704 void CheckPacketHasSingleStreamFrame(size_t packet_index) {
2705 ASSERT_GT(packets_.size(), packet_index);
2706 const SerializedPacket& packet = packets_[packet_index];
2707 ASSERT_FALSE(packet.retransmittable_frames.empty());
2708 EXPECT_EQ(1u, packet.retransmittable_frames.size());
2709 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2710 ASSERT_TRUE(simple_framer_.ProcessPacket(
2711 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2712 EXPECT_EQ(1u, simple_framer_.num_frames());
2713 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
2714 }
2715
CheckAllPacketsHaveSingleStreamFrame()2716 void CheckAllPacketsHaveSingleStreamFrame() {
2717 for (size_t i = 0; i < packets_.size(); i++) {
2718 CheckPacketHasSingleStreamFrame(i);
2719 }
2720 }
2721
2722 QuicFramer framer_;
2723 MockRandom random_creator_;
2724 StrictMock<MockDelegate> delegate_;
2725 MultiplePacketsTestPacketCreator creator_;
2726 SimpleQuicFramer simple_framer_;
2727 std::vector<SerializedPacket> packets_;
2728 QuicAckFrame ack_frame_;
2729 struct iovec iov_;
2730 quiche::SimpleBufferAllocator allocator_;
2731
2732 private:
2733 std::unique_ptr<char[]> data_array_;
2734 SimpleDataProducer producer_;
2735 };
2736
TEST_F(QuicPacketCreatorMultiplePacketsTest,AddControlFrame_NotWritable)2737 TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_NotWritable) {
2738 delegate_.SetCanNotWrite();
2739
2740 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2741 const bool consumed =
2742 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2743 /*bundle_ack=*/false);
2744 EXPECT_FALSE(consumed);
2745 EXPECT_FALSE(creator_.HasPendingFrames());
2746 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2747 delete rst_frame;
2748 }
2749
TEST_F(QuicPacketCreatorMultiplePacketsTest,WrongEncryptionLevelForStreamDataFastPath)2750 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2751 WrongEncryptionLevelForStreamDataFastPath) {
2752 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
2753 delegate_.SetCanWriteAnything();
2754 const std::string data(10000, '?');
2755 EXPECT_CALL(delegate_, OnSerializedPacket(_)).Times(0);
2756 EXPECT_QUIC_BUG(
2757 {
2758 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
2759 creator_.ConsumeDataFastPath(
2760 QuicUtils::GetFirstBidirectionalStreamId(
2761 framer_.transport_version(), Perspective::IS_CLIENT),
2762 data);
2763 },
2764 "");
2765 }
2766
TEST_F(QuicPacketCreatorMultiplePacketsTest,AddControlFrame_OnlyAckWritable)2767 TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_OnlyAckWritable) {
2768 delegate_.SetCanWriteOnlyNonRetransmittable();
2769
2770 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2771 const bool consumed =
2772 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2773 /*bundle_ack=*/false);
2774 EXPECT_FALSE(consumed);
2775 EXPECT_FALSE(creator_.HasPendingFrames());
2776 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2777 delete rst_frame;
2778 }
2779
TEST_F(QuicPacketCreatorMultiplePacketsTest,AddControlFrame_WritableAndShouldNotFlush)2780 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2781 AddControlFrame_WritableAndShouldNotFlush) {
2782 delegate_.SetCanWriteAnything();
2783
2784 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2785 /*bundle_ack=*/false);
2786 EXPECT_TRUE(creator_.HasPendingFrames());
2787 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2788 }
2789
TEST_F(QuicPacketCreatorMultiplePacketsTest,AddControlFrame_NotWritableBatchThenFlush)2790 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2791 AddControlFrame_NotWritableBatchThenFlush) {
2792 delegate_.SetCanNotWrite();
2793
2794 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2795 const bool consumed =
2796 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2797 /*bundle_ack=*/false);
2798 EXPECT_FALSE(consumed);
2799 EXPECT_FALSE(creator_.HasPendingFrames());
2800 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2801 delete rst_frame;
2802 }
2803
TEST_F(QuicPacketCreatorMultiplePacketsTest,AddControlFrame_WritableAndShouldFlush)2804 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2805 AddControlFrame_WritableAndShouldFlush) {
2806 delegate_.SetCanWriteAnything();
2807
2808 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2809 .WillOnce(
2810 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2811
2812 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2813 /*bundle_ack=*/false);
2814 creator_.Flush();
2815 EXPECT_FALSE(creator_.HasPendingFrames());
2816 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2817
2818 PacketContents contents;
2819 contents.num_rst_stream_frames = 1;
2820 CheckPacketContains(contents, 0);
2821 }
2822
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeCryptoData)2823 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeCryptoData) {
2824 delegate_.SetCanWriteAnything();
2825
2826 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2827 .WillOnce(
2828 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2829 std::string data = "crypto data";
2830 size_t consumed_bytes =
2831 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2832 creator_.Flush();
2833 EXPECT_EQ(data.length(), consumed_bytes);
2834 EXPECT_FALSE(creator_.HasPendingFrames());
2835 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2836
2837 PacketContents contents;
2838 contents.num_crypto_frames = 1;
2839 contents.num_padding_frames = 1;
2840 CheckPacketContains(contents, 0);
2841 }
2842
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeCryptoDataCheckShouldGeneratePacket)2843 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2844 ConsumeCryptoDataCheckShouldGeneratePacket) {
2845 delegate_.SetCanNotWrite();
2846
2847 EXPECT_CALL(delegate_, OnSerializedPacket(_)).Times(0);
2848 std::string data = "crypto data";
2849 size_t consumed_bytes =
2850 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2851 creator_.Flush();
2852 EXPECT_EQ(0u, consumed_bytes);
2853 EXPECT_FALSE(creator_.HasPendingFrames());
2854 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2855 }
2856
2857 // Tests the case that after bundling data, send window reduced to be shorter
2858 // than data.
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeDataAdjustWriteLengthAfterBundledData)2859 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2860 ConsumeDataAdjustWriteLengthAfterBundledData) {
2861 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2862 creator_.SetTransmissionType(NOT_RETRANSMISSION);
2863 delegate_.SetCanWriteAnything();
2864
2865 const std::string data(1000, 'D');
2866 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
2867 framer_.transport_version(), Perspective::IS_CLIENT);
2868
2869 if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data2)) {
2870 EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(stream_id))
2871 .WillOnce(Return(data.length() - 1));
2872 } else {
2873 EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(_)).Times(0);
2874 }
2875
2876 QuicConsumedData consumed = creator_.ConsumeData(stream_id, data, 0u, FIN);
2877
2878 if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data2)) {
2879 EXPECT_EQ(consumed.bytes_consumed, data.length() - 1);
2880 EXPECT_FALSE(consumed.fin_consumed);
2881 } else {
2882 EXPECT_EQ(consumed.bytes_consumed, data.length());
2883 EXPECT_TRUE(consumed.fin_consumed);
2884 }
2885 }
2886
2887 // Tests the case that after bundling data, send window is exactly as big as
2888 // data length.
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeDataDoesNotAdjustWriteLengthAfterBundledData)2889 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2890 ConsumeDataDoesNotAdjustWriteLengthAfterBundledData) {
2891 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2892 creator_.SetTransmissionType(NOT_RETRANSMISSION);
2893 delegate_.SetCanWriteAnything();
2894
2895 const std::string data(1000, 'D');
2896 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
2897 framer_.transport_version(), Perspective::IS_CLIENT);
2898
2899 if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data2)) {
2900 EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(stream_id))
2901 .WillOnce(Return(data.length()));
2902 } else {
2903 EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(_)).Times(0);
2904 }
2905
2906 QuicConsumedData consumed = creator_.ConsumeData(stream_id, data, 0u, FIN);
2907
2908 EXPECT_EQ(consumed.bytes_consumed, data.length());
2909 EXPECT_TRUE(consumed.fin_consumed);
2910 }
2911
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeData_NotWritable)2912 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_NotWritable) {
2913 delegate_.SetCanNotWrite();
2914
2915 QuicConsumedData consumed = creator_.ConsumeData(
2916 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2917 Perspective::IS_CLIENT),
2918 "foo", 0, FIN);
2919 EXPECT_EQ(0u, consumed.bytes_consumed);
2920 EXPECT_FALSE(consumed.fin_consumed);
2921 EXPECT_FALSE(creator_.HasPendingFrames());
2922 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2923 }
2924
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeData_WritableAndShouldNotFlush)2925 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2926 ConsumeData_WritableAndShouldNotFlush) {
2927 delegate_.SetCanWriteAnything();
2928
2929 QuicConsumedData consumed = creator_.ConsumeData(
2930 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2931 Perspective::IS_CLIENT),
2932 "foo", 0, FIN);
2933 EXPECT_EQ(3u, consumed.bytes_consumed);
2934 EXPECT_TRUE(consumed.fin_consumed);
2935 EXPECT_TRUE(creator_.HasPendingFrames());
2936 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2937 }
2938
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeData_WritableAndShouldFlush)2939 TEST_F(QuicPacketCreatorMultiplePacketsTest,
2940 ConsumeData_WritableAndShouldFlush) {
2941 delegate_.SetCanWriteAnything();
2942
2943 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2944 .WillOnce(
2945 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2946 QuicConsumedData consumed = creator_.ConsumeData(
2947 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2948 Perspective::IS_CLIENT),
2949 "foo", 0, FIN);
2950 creator_.Flush();
2951 EXPECT_EQ(3u, consumed.bytes_consumed);
2952 EXPECT_TRUE(consumed.fin_consumed);
2953 EXPECT_FALSE(creator_.HasPendingFrames());
2954 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2955
2956 PacketContents contents;
2957 contents.num_stream_frames = 1;
2958 CheckPacketContains(contents, 0);
2959 }
2960
2961 // Test the behavior of ConsumeData when the data consumed is for the crypto
2962 // handshake stream. Ensure that the packet is always sent and padded even if
2963 // the creator operates in batch mode.
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeData_Handshake)2964 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_Handshake) {
2965 delegate_.SetCanWriteAnything();
2966
2967 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2968 .WillOnce(
2969 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2970 const std::string data = "foo bar";
2971 size_t consumed_bytes = 0;
2972 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2973 consumed_bytes = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2974 } else {
2975 consumed_bytes =
2976 creator_
2977 .ConsumeData(
2978 QuicUtils::GetCryptoStreamId(framer_.transport_version()), data,
2979 0, NO_FIN)
2980 .bytes_consumed;
2981 }
2982 EXPECT_EQ(7u, consumed_bytes);
2983 EXPECT_FALSE(creator_.HasPendingFrames());
2984 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2985
2986 PacketContents contents;
2987 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2988 contents.num_crypto_frames = 1;
2989 } else {
2990 contents.num_stream_frames = 1;
2991 }
2992 contents.num_padding_frames = 1;
2993 CheckPacketContains(contents, 0);
2994
2995 ASSERT_EQ(1u, packets_.size());
2996 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2997 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
2998 }
2999
3000 // Test the behavior of ConsumeData when the data is for the crypto handshake
3001 // stream, but padding is disabled.
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeData_Handshake_PaddingDisabled)3002 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3003 ConsumeData_Handshake_PaddingDisabled) {
3004 creator_.set_fully_pad_crypto_handshake_packets(false);
3005
3006 delegate_.SetCanWriteAnything();
3007
3008 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3009 .WillOnce(
3010 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3011 const std::string data = "foo";
3012 size_t bytes_consumed = 0;
3013 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
3014 bytes_consumed = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
3015 } else {
3016 bytes_consumed =
3017 creator_
3018 .ConsumeData(
3019 QuicUtils::GetCryptoStreamId(framer_.transport_version()), data,
3020 0, NO_FIN)
3021 .bytes_consumed;
3022 }
3023 EXPECT_EQ(3u, bytes_consumed);
3024 EXPECT_FALSE(creator_.HasPendingFrames());
3025 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3026
3027 PacketContents contents;
3028 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
3029 contents.num_crypto_frames = 1;
3030 } else {
3031 contents.num_stream_frames = 1;
3032 }
3033 contents.num_padding_frames = 0;
3034 CheckPacketContains(contents, 0);
3035
3036 ASSERT_EQ(1u, packets_.size());
3037
3038 // Packet is not fully padded, but we want to future packets to be larger.
3039 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
3040 size_t expected_packet_length = 31;
3041 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
3042 // The framing of CRYPTO frames is slightly different than that of stream
3043 // frames, so the expected packet length differs slightly.
3044 expected_packet_length = 32;
3045 }
3046 EXPECT_EQ(expected_packet_length, packets_[0].encrypted_length);
3047 }
3048
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeData_EmptyData)3049 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_EmptyData) {
3050 delegate_.SetCanWriteAnything();
3051
3052 EXPECT_QUIC_BUG(creator_.ConsumeData(
3053 QuicUtils::QuicUtils::GetFirstBidirectionalStreamId(
3054 framer_.transport_version(), Perspective::IS_CLIENT),
3055 {}, 0, NO_FIN),
3056 "Attempt to consume empty data without FIN.");
3057 }
3058
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeDataMultipleTimes_WritableAndShouldNotFlush)3059 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3060 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
3061 delegate_.SetCanWriteAnything();
3062
3063 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3064 framer_.transport_version(), Perspective::IS_CLIENT),
3065 "foo", 0, FIN);
3066 QuicConsumedData consumed = creator_.ConsumeData(3, "quux", 3, NO_FIN);
3067 EXPECT_EQ(4u, consumed.bytes_consumed);
3068 EXPECT_FALSE(consumed.fin_consumed);
3069 EXPECT_TRUE(creator_.HasPendingFrames());
3070 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3071 }
3072
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeData_BatchOperations)3073 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_BatchOperations) {
3074 delegate_.SetCanWriteAnything();
3075
3076 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3077 framer_.transport_version(), Perspective::IS_CLIENT),
3078 "foo", 0, NO_FIN);
3079 QuicConsumedData consumed = creator_.ConsumeData(
3080 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3081 Perspective::IS_CLIENT),
3082 "quux", 3, FIN);
3083 EXPECT_EQ(4u, consumed.bytes_consumed);
3084 EXPECT_TRUE(consumed.fin_consumed);
3085 EXPECT_TRUE(creator_.HasPendingFrames());
3086 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3087
3088 // Now both frames will be flushed out.
3089 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3090 .WillOnce(
3091 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3092 creator_.Flush();
3093 EXPECT_FALSE(creator_.HasPendingFrames());
3094 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3095
3096 PacketContents contents;
3097 contents.num_stream_frames = 1;
3098 CheckPacketContains(contents, 0);
3099 }
3100
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeData_FramesPreviouslyQueued)3101 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3102 ConsumeData_FramesPreviouslyQueued) {
3103 // Set the packet size be enough for two stream frames with 0 stream offset,
3104 // but not enough for a stream frame of 0 offset and one with non-zero offset.
3105 size_t length =
3106 TaggingEncrypter(0x00).GetCiphertextSize(0) +
3107 GetPacketHeaderSize(
3108 framer_.transport_version(),
3109 creator_.GetDestinationConnectionIdLength(),
3110 creator_.GetSourceConnectionIdLength(),
3111 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3112 !kIncludeDiversificationNonce,
3113 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3114 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3115 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3116 // Add an extra 3 bytes for the payload and 1 byte so
3117 // BytesFree is larger than the GetMinStreamFrameSize.
3118 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0,
3119 false, 3) +
3120 3 +
3121 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0, true,
3122 1) +
3123 1;
3124 creator_.SetMaxPacketLength(length);
3125 delegate_.SetCanWriteAnything();
3126 {
3127 InSequence dummy;
3128 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3129 .WillOnce(
3130 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3131 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3132 .WillOnce(
3133 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3134 }
3135 // Queue enough data to prevent a stream frame with a non-zero offset from
3136 // fitting.
3137 QuicConsumedData consumed = creator_.ConsumeData(
3138 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3139 Perspective::IS_CLIENT),
3140 "foo", 0, NO_FIN);
3141 EXPECT_EQ(3u, consumed.bytes_consumed);
3142 EXPECT_FALSE(consumed.fin_consumed);
3143 EXPECT_TRUE(creator_.HasPendingFrames());
3144 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3145
3146 // This frame will not fit with the existing frame, causing the queued frame
3147 // to be serialized, and it will be added to a new open packet.
3148 consumed = creator_.ConsumeData(
3149 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3150 Perspective::IS_CLIENT),
3151 "bar", 3, FIN);
3152 EXPECT_EQ(3u, consumed.bytes_consumed);
3153 EXPECT_TRUE(consumed.fin_consumed);
3154 EXPECT_TRUE(creator_.HasPendingFrames());
3155 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3156
3157 creator_.FlushCurrentPacket();
3158 EXPECT_FALSE(creator_.HasPendingFrames());
3159 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3160
3161 PacketContents contents;
3162 contents.num_stream_frames = 1;
3163 CheckPacketContains(contents, 0);
3164 CheckPacketContains(contents, 1);
3165 }
3166
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeDataFastPath)3167 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataFastPath) {
3168 delegate_.SetCanWriteAnything();
3169 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
3170
3171 const std::string data(10000, '?');
3172 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3173 .WillRepeatedly(
3174 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3175 QuicConsumedData consumed = creator_.ConsumeDataFastPath(
3176 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3177 Perspective::IS_CLIENT),
3178 data);
3179 EXPECT_EQ(10000u, consumed.bytes_consumed);
3180 EXPECT_TRUE(consumed.fin_consumed);
3181 EXPECT_FALSE(creator_.HasPendingFrames());
3182 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3183
3184 PacketContents contents;
3185 contents.num_stream_frames = 1;
3186 CheckPacketContains(contents, 0);
3187 EXPECT_FALSE(packets_.empty());
3188 SerializedPacket& packet = packets_.back();
3189 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3190 EXPECT_EQ(LOSS_RETRANSMISSION, packet.transmission_type);
3191 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3192 const QuicStreamFrame& stream_frame =
3193 packet.retransmittable_frames.front().stream_frame;
3194 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3195 }
3196
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeDataLarge)3197 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLarge) {
3198 delegate_.SetCanWriteAnything();
3199
3200 const std::string data(10000, '?');
3201 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3202 .WillRepeatedly(
3203 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3204 QuicConsumedData consumed = creator_.ConsumeData(
3205 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3206 Perspective::IS_CLIENT),
3207 data, 0, FIN);
3208 EXPECT_EQ(10000u, consumed.bytes_consumed);
3209 EXPECT_TRUE(consumed.fin_consumed);
3210 EXPECT_FALSE(creator_.HasPendingFrames());
3211 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3212
3213 PacketContents contents;
3214 contents.num_stream_frames = 1;
3215 CheckPacketContains(contents, 0);
3216 EXPECT_FALSE(packets_.empty());
3217 SerializedPacket& packet = packets_.back();
3218 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3219 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3220 const QuicStreamFrame& stream_frame =
3221 packet.retransmittable_frames.front().stream_frame;
3222 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3223 }
3224
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeDataLargeSendAckFalse)3225 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckFalse) {
3226 delegate_.SetCanNotWrite();
3227
3228 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3229 const bool success =
3230 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3231 /*bundle_ack=*/true);
3232 EXPECT_FALSE(success);
3233 EXPECT_FALSE(creator_.HasPendingFrames());
3234 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3235
3236 delegate_.SetCanWriteAnything();
3237
3238 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3239 /*bundle_ack=*/false);
3240
3241 const std::string data(10000, '?');
3242 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3243 .WillRepeatedly(
3244 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3245 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
3246 /*bundle_ack=*/true);
3247 QuicConsumedData consumed = creator_.ConsumeData(
3248 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3249 Perspective::IS_CLIENT),
3250 data, 0, FIN);
3251 creator_.Flush();
3252
3253 EXPECT_EQ(10000u, consumed.bytes_consumed);
3254 EXPECT_TRUE(consumed.fin_consumed);
3255 EXPECT_FALSE(creator_.HasPendingFrames());
3256 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3257
3258 EXPECT_FALSE(packets_.empty());
3259 SerializedPacket& packet = packets_.back();
3260 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3261 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3262 const QuicStreamFrame& stream_frame =
3263 packet.retransmittable_frames.front().stream_frame;
3264 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3265 }
3266
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConsumeDataLargeSendAckTrue)3267 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckTrue) {
3268 delegate_.SetCanNotWrite();
3269 delegate_.SetCanWriteAnything();
3270
3271 const std::string data(10000, '?');
3272 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3273 .WillRepeatedly(
3274 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3275 QuicConsumedData consumed = creator_.ConsumeData(
3276 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3277 Perspective::IS_CLIENT),
3278 data, 0, FIN);
3279 creator_.Flush();
3280
3281 EXPECT_EQ(10000u, consumed.bytes_consumed);
3282 EXPECT_TRUE(consumed.fin_consumed);
3283 EXPECT_FALSE(creator_.HasPendingFrames());
3284 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3285
3286 EXPECT_FALSE(packets_.empty());
3287 SerializedPacket& packet = packets_.back();
3288 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3289 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3290 const QuicStreamFrame& stream_frame =
3291 packet.retransmittable_frames.front().stream_frame;
3292 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3293 }
3294
TEST_F(QuicPacketCreatorMultiplePacketsTest,NotWritableThenBatchOperations)3295 TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations) {
3296 delegate_.SetCanNotWrite();
3297
3298 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3299 const bool consumed =
3300 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3301 /*bundle_ack=*/true);
3302 EXPECT_FALSE(consumed);
3303 EXPECT_FALSE(creator_.HasPendingFrames());
3304 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3305 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3306
3307 delegate_.SetCanWriteAnything();
3308
3309 EXPECT_TRUE(
3310 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3311 /*bundle_ack=*/false));
3312 // Send some data and a control frame
3313 creator_.ConsumeData(3, "quux", 0, NO_FIN);
3314 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3315 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3316 /*bundle_ack=*/false);
3317 }
3318 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(3));
3319
3320 // All five frames will be flushed out in a single packet.
3321 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3322 .WillOnce(
3323 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3324 creator_.Flush();
3325 EXPECT_FALSE(creator_.HasPendingFrames());
3326 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3327 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3328
3329 PacketContents contents;
3330 // ACK will be flushed by connection.
3331 contents.num_ack_frames = 0;
3332 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3333 contents.num_goaway_frames = 1;
3334 } else {
3335 contents.num_goaway_frames = 0;
3336 }
3337 contents.num_rst_stream_frames = 1;
3338 contents.num_stream_frames = 1;
3339 CheckPacketContains(contents, 0);
3340 }
3341
TEST_F(QuicPacketCreatorMultiplePacketsTest,NotWritableThenBatchOperations2)3342 TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations2) {
3343 delegate_.SetCanNotWrite();
3344
3345 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3346 const bool success =
3347 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3348 /*bundle_ack=*/true);
3349 EXPECT_FALSE(success);
3350 EXPECT_FALSE(creator_.HasPendingFrames());
3351 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3352
3353 delegate_.SetCanWriteAnything();
3354
3355 {
3356 InSequence dummy;
3357 // All five frames will be flushed out in a single packet
3358 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3359 .WillOnce(
3360 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3361 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3362 .WillOnce(
3363 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3364 }
3365 EXPECT_TRUE(
3366 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3367 /*bundle_ack=*/false));
3368 // Send enough data to exceed one packet
3369 size_t data_len = kDefaultMaxPacketSize + 100;
3370 const std::string data(data_len, '?');
3371 QuicConsumedData consumed = creator_.ConsumeData(3, data, 0, FIN);
3372 EXPECT_EQ(data_len, consumed.bytes_consumed);
3373 EXPECT_TRUE(consumed.fin_consumed);
3374 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3375 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3376 /*bundle_ack=*/false);
3377 }
3378
3379 creator_.Flush();
3380 EXPECT_FALSE(creator_.HasPendingFrames());
3381 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3382
3383 // The first packet should have the queued data and part of the stream data.
3384 PacketContents contents;
3385 // ACK will be sent by connection.
3386 contents.num_ack_frames = 0;
3387 contents.num_rst_stream_frames = 1;
3388 contents.num_stream_frames = 1;
3389 CheckPacketContains(contents, 0);
3390
3391 // The second should have the remainder of the stream data.
3392 PacketContents contents2;
3393 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3394 contents2.num_goaway_frames = 1;
3395 } else {
3396 contents2.num_goaway_frames = 0;
3397 }
3398 contents2.num_stream_frames = 1;
3399 CheckPacketContains(contents2, 1);
3400 }
3401
3402 // Regression test of b/120493795.
TEST_F(QuicPacketCreatorMultiplePacketsTest,PacketTransmissionType)3403 TEST_F(QuicPacketCreatorMultiplePacketsTest, PacketTransmissionType) {
3404 delegate_.SetCanWriteAnything();
3405
3406 // The first ConsumeData will fill the packet without flush.
3407 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
3408
3409 size_t data_len = 1220;
3410 const std::string data(data_len, '?');
3411 QuicStreamId stream1_id = QuicUtils::GetFirstBidirectionalStreamId(
3412 framer_.transport_version(), Perspective::IS_CLIENT);
3413 QuicConsumedData consumed = creator_.ConsumeData(stream1_id, data, 0, NO_FIN);
3414 EXPECT_EQ(data_len, consumed.bytes_consumed);
3415 ASSERT_EQ(0u, creator_.BytesFree())
3416 << "Test setup failed: Please increase data_len to "
3417 << data_len + creator_.BytesFree() << " bytes.";
3418
3419 // The second ConsumeData can not be added to the packet and will flush.
3420 creator_.SetTransmissionType(NOT_RETRANSMISSION);
3421
3422 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3423 .WillOnce(
3424 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3425
3426 QuicStreamId stream2_id = stream1_id + 4;
3427
3428 consumed = creator_.ConsumeData(stream2_id, data, 0, NO_FIN);
3429 EXPECT_EQ(data_len, consumed.bytes_consumed);
3430
3431 // Ensure the packet is successfully created.
3432 ASSERT_EQ(1u, packets_.size());
3433 ASSERT_TRUE(packets_[0].encrypted_buffer);
3434 ASSERT_EQ(1u, packets_[0].retransmittable_frames.size());
3435 EXPECT_EQ(stream1_id,
3436 packets_[0].retransmittable_frames[0].stream_frame.stream_id);
3437
3438 // Since the second frame was not added, the packet's transmission type
3439 // should be the first frame's type.
3440 EXPECT_EQ(packets_[0].transmission_type, LOSS_RETRANSMISSION);
3441 }
3442
TEST_F(QuicPacketCreatorMultiplePacketsTest,TestConnectionIdLength)3443 TEST_F(QuicPacketCreatorMultiplePacketsTest, TestConnectionIdLength) {
3444 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
3445 creator_.SetServerConnectionIdLength(0);
3446 EXPECT_EQ(0, creator_.GetDestinationConnectionIdLength());
3447
3448 for (size_t i = 1; i < 10; i++) {
3449 creator_.SetServerConnectionIdLength(i);
3450 EXPECT_EQ(0, creator_.GetDestinationConnectionIdLength());
3451 }
3452 }
3453
3454 // Test whether SetMaxPacketLength() works in the situation when the queue is
3455 // empty, and we send three packets worth of data.
TEST_F(QuicPacketCreatorMultiplePacketsTest,SetMaxPacketLength_Initial)3456 TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Initial) {
3457 delegate_.SetCanWriteAnything();
3458
3459 // Send enough data for three packets.
3460 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
3461 size_t packet_len = kDefaultMaxPacketSize + 100;
3462 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3463 creator_.SetMaxPacketLength(packet_len);
3464 EXPECT_EQ(packet_len, creator_.max_packet_length());
3465
3466 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3467 .Times(3)
3468 .WillRepeatedly(
3469 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3470 const std::string data(data_len, '?');
3471 QuicConsumedData consumed = creator_.ConsumeData(
3472 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3473 Perspective::IS_CLIENT),
3474 data,
3475 /*offset=*/0, FIN);
3476 EXPECT_EQ(data_len, consumed.bytes_consumed);
3477 EXPECT_TRUE(consumed.fin_consumed);
3478 EXPECT_FALSE(creator_.HasPendingFrames());
3479 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3480
3481 // We expect three packets, and first two of them have to be of packet_len
3482 // size. We check multiple packets (instead of just one) because we want to
3483 // ensure that |max_packet_length_| does not get changed incorrectly by the
3484 // creator after first packet is serialized.
3485 ASSERT_EQ(3u, packets_.size());
3486 EXPECT_EQ(packet_len, packets_[0].encrypted_length);
3487 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3488 CheckAllPacketsHaveSingleStreamFrame();
3489 }
3490
3491 // Test whether SetMaxPacketLength() works in the situation when we first write
3492 // data, then change packet size, then write data again.
TEST_F(QuicPacketCreatorMultiplePacketsTest,SetMaxPacketLength_Middle)3493 TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Middle) {
3494 delegate_.SetCanWriteAnything();
3495
3496 // We send enough data to overflow default packet length, but not the altered
3497 // one.
3498 size_t data_len = kDefaultMaxPacketSize;
3499 size_t packet_len = kDefaultMaxPacketSize + 100;
3500 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3501
3502 // We expect to see three packets in total.
3503 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3504 .Times(3)
3505 .WillRepeatedly(
3506 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3507
3508 // Send two packets before packet size change.
3509 const std::string data(data_len, '?');
3510 QuicConsumedData consumed = creator_.ConsumeData(
3511 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3512 Perspective::IS_CLIENT),
3513 data,
3514 /*offset=*/0, NO_FIN);
3515 creator_.Flush();
3516 EXPECT_EQ(data_len, consumed.bytes_consumed);
3517 EXPECT_FALSE(consumed.fin_consumed);
3518 EXPECT_FALSE(creator_.HasPendingFrames());
3519 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3520
3521 // Make sure we already have two packets.
3522 ASSERT_EQ(2u, packets_.size());
3523
3524 // Increase packet size.
3525 creator_.SetMaxPacketLength(packet_len);
3526 EXPECT_EQ(packet_len, creator_.max_packet_length());
3527
3528 // Send a packet after packet size change.
3529 creator_.AttachPacketFlusher();
3530 consumed = creator_.ConsumeData(
3531 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3532 Perspective::IS_CLIENT),
3533 data, data_len, FIN);
3534 creator_.Flush();
3535 EXPECT_EQ(data_len, consumed.bytes_consumed);
3536 EXPECT_TRUE(consumed.fin_consumed);
3537 EXPECT_FALSE(creator_.HasPendingFrames());
3538 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3539
3540 // We expect first data chunk to get fragmented, but the second one to fit
3541 // into a single packet.
3542 ASSERT_EQ(3u, packets_.size());
3543 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3544 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length);
3545 CheckAllPacketsHaveSingleStreamFrame();
3546 }
3547
3548 // Test whether SetMaxPacketLength() works correctly when we force the change of
3549 // the packet size in the middle of the batched packet.
TEST_F(QuicPacketCreatorMultiplePacketsTest,SetMaxPacketLength_MidpacketFlush)3550 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3551 SetMaxPacketLength_MidpacketFlush) {
3552 delegate_.SetCanWriteAnything();
3553
3554 size_t first_write_len = kDefaultMaxPacketSize / 2;
3555 size_t packet_len = kDefaultMaxPacketSize + 100;
3556 size_t second_write_len = packet_len + 1;
3557 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3558
3559 // First send half of the packet worth of data. We are in the batch mode, so
3560 // should not cause packet serialization.
3561 const std::string first_write(first_write_len, '?');
3562 QuicConsumedData consumed = creator_.ConsumeData(
3563 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3564 Perspective::IS_CLIENT),
3565 first_write,
3566 /*offset=*/0, NO_FIN);
3567 EXPECT_EQ(first_write_len, consumed.bytes_consumed);
3568 EXPECT_FALSE(consumed.fin_consumed);
3569 EXPECT_TRUE(creator_.HasPendingFrames());
3570 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3571
3572 // Make sure we have no packets so far.
3573 ASSERT_EQ(0u, packets_.size());
3574
3575 // Expect a packet to be flushed.
3576 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3577 .WillOnce(
3578 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3579
3580 // Increase packet size after flushing all frames.
3581 // Ensure it's immediately enacted.
3582 creator_.FlushCurrentPacket();
3583 creator_.SetMaxPacketLength(packet_len);
3584 EXPECT_EQ(packet_len, creator_.max_packet_length());
3585 EXPECT_FALSE(creator_.HasPendingFrames());
3586 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3587
3588 // We expect to see exactly one packet serialized after that, because we send
3589 // a value somewhat exceeding new max packet size, and the tail data does not
3590 // get serialized because we are still in the batch mode.
3591 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3592 .WillOnce(
3593 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3594
3595 // Send a more than a packet worth of data to the same stream. This should
3596 // trigger serialization of one packet, and queue another one.
3597 const std::string second_write(second_write_len, '?');
3598 consumed = creator_.ConsumeData(
3599 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3600 Perspective::IS_CLIENT),
3601 second_write,
3602 /*offset=*/first_write_len, FIN);
3603 EXPECT_EQ(second_write_len, consumed.bytes_consumed);
3604 EXPECT_TRUE(consumed.fin_consumed);
3605 EXPECT_TRUE(creator_.HasPendingFrames());
3606 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3607
3608 // We expect the first packet to be underfilled, and the second packet be up
3609 // to the new max packet size.
3610 ASSERT_EQ(2u, packets_.size());
3611 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3612 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3613
3614 CheckAllPacketsHaveSingleStreamFrame();
3615 }
3616
3617 // Test sending a connectivity probing packet.
TEST_F(QuicPacketCreatorMultiplePacketsTest,GenerateConnectivityProbingPacket)3618 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3619 GenerateConnectivityProbingPacket) {
3620 delegate_.SetCanWriteAnything();
3621
3622 std::unique_ptr<SerializedPacket> probing_packet;
3623 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3624 QuicPathFrameBuffer payload = {
3625 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
3626 probing_packet =
3627 creator_.SerializePathChallengeConnectivityProbingPacket(payload);
3628 } else {
3629 probing_packet = creator_.SerializeConnectivityProbingPacket();
3630 }
3631
3632 ASSERT_TRUE(simple_framer_.ProcessPacket(QuicEncryptedPacket(
3633 probing_packet->encrypted_buffer, probing_packet->encrypted_length)));
3634
3635 EXPECT_EQ(2u, simple_framer_.num_frames());
3636 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3637 EXPECT_EQ(1u, simple_framer_.path_challenge_frames().size());
3638 } else {
3639 EXPECT_EQ(1u, simple_framer_.ping_frames().size());
3640 }
3641 EXPECT_EQ(1u, simple_framer_.padding_frames().size());
3642 }
3643
3644 // Test sending an MTU probe, without any surrounding data.
TEST_F(QuicPacketCreatorMultiplePacketsTest,GenerateMtuDiscoveryPacket_Simple)3645 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3646 GenerateMtuDiscoveryPacket_Simple) {
3647 delegate_.SetCanWriteAnything();
3648
3649 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3650 static_assert(target_mtu < kMaxOutgoingPacketSize,
3651 "The MTU probe used by the test exceeds maximum packet size");
3652
3653 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3654 .WillOnce(
3655 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3656
3657 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3658
3659 EXPECT_FALSE(creator_.HasPendingFrames());
3660 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3661 ASSERT_EQ(1u, packets_.size());
3662 EXPECT_EQ(target_mtu, packets_[0].encrypted_length);
3663
3664 PacketContents contents;
3665 contents.num_mtu_discovery_frames = 1;
3666 contents.num_padding_frames = 1;
3667 CheckPacketContains(contents, 0);
3668 }
3669
3670 // Test sending an MTU probe. Surround it with data, to ensure that it resets
3671 // the MTU to the value before the probe was sent.
TEST_F(QuicPacketCreatorMultiplePacketsTest,GenerateMtuDiscoveryPacket_SurroundedByData)3672 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3673 GenerateMtuDiscoveryPacket_SurroundedByData) {
3674 delegate_.SetCanWriteAnything();
3675
3676 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3677 static_assert(target_mtu < kMaxOutgoingPacketSize,
3678 "The MTU probe used by the test exceeds maximum packet size");
3679
3680 // Send enough data so it would always cause two packets to be sent.
3681 const size_t data_len = target_mtu + 1;
3682
3683 // Send a total of five packets: two packets before the probe, the probe
3684 // itself, and two packets after the probe.
3685 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3686 .Times(5)
3687 .WillRepeatedly(
3688 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3689
3690 // Send data before the MTU probe.
3691 const std::string data(data_len, '?');
3692 QuicConsumedData consumed = creator_.ConsumeData(
3693 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3694 Perspective::IS_CLIENT),
3695 data,
3696 /*offset=*/0, NO_FIN);
3697 creator_.Flush();
3698 EXPECT_EQ(data_len, consumed.bytes_consumed);
3699 EXPECT_FALSE(consumed.fin_consumed);
3700 EXPECT_FALSE(creator_.HasPendingFrames());
3701 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3702
3703 // Send the MTU probe.
3704 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3705 EXPECT_FALSE(creator_.HasPendingFrames());
3706 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3707
3708 // Send data after the MTU probe.
3709 creator_.AttachPacketFlusher();
3710 consumed = creator_.ConsumeData(
3711 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3712 Perspective::IS_CLIENT),
3713 data,
3714 /*offset=*/data_len, FIN);
3715 creator_.Flush();
3716 EXPECT_EQ(data_len, consumed.bytes_consumed);
3717 EXPECT_TRUE(consumed.fin_consumed);
3718 EXPECT_FALSE(creator_.HasPendingFrames());
3719 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3720
3721 ASSERT_EQ(5u, packets_.size());
3722 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3723 EXPECT_EQ(target_mtu, packets_[2].encrypted_length);
3724 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length);
3725
3726 PacketContents probe_contents;
3727 probe_contents.num_mtu_discovery_frames = 1;
3728 probe_contents.num_padding_frames = 1;
3729
3730 CheckPacketHasSingleStreamFrame(0);
3731 CheckPacketHasSingleStreamFrame(1);
3732 CheckPacketContains(probe_contents, 2);
3733 CheckPacketHasSingleStreamFrame(3);
3734 CheckPacketHasSingleStreamFrame(4);
3735 }
3736
3737 // Regression test for b/31486443.
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConnectionCloseFrameLargerThanPacketSize)3738 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3739 ConnectionCloseFrameLargerThanPacketSize) {
3740 delegate_.SetCanWriteAnything();
3741 char buf[2000] = {};
3742 absl::string_view error_details(buf, 2000);
3743 const QuicErrorCode kQuicErrorCode = QUIC_PACKET_WRITE_ERROR;
3744
3745 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
3746 framer_.transport_version(), kQuicErrorCode, NO_IETF_QUIC_ERROR,
3747 std::string(error_details),
3748 /*transport_close_frame_type=*/0);
3749 creator_.ConsumeRetransmittableControlFrame(QuicFrame(frame),
3750 /*bundle_ack=*/false);
3751 EXPECT_TRUE(creator_.HasPendingFrames());
3752 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3753 }
3754
TEST_F(QuicPacketCreatorMultiplePacketsTest,RandomPaddingAfterFinSingleStreamSinglePacket)3755 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3756 RandomPaddingAfterFinSingleStreamSinglePacket) {
3757 const QuicByteCount kStreamFramePayloadSize = 100u;
3758 char buf[kStreamFramePayloadSize] = {};
3759 const QuicStreamId kDataStreamId = 5;
3760 // Set the packet size be enough for one stream frame with 0 stream offset and
3761 // max size of random padding.
3762 size_t length =
3763 TaggingEncrypter(0x00).GetCiphertextSize(0) +
3764 GetPacketHeaderSize(
3765 framer_.transport_version(),
3766 creator_.GetDestinationConnectionIdLength(),
3767 creator_.GetSourceConnectionIdLength(),
3768 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3769 !kIncludeDiversificationNonce,
3770 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3771 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3772 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3773 QuicFramer::GetMinStreamFrameSize(
3774 framer_.transport_version(), kDataStreamId, 0,
3775 /*last_frame_in_packet=*/false,
3776 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes) +
3777 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes;
3778 creator_.SetMaxPacketLength(length);
3779 delegate_.SetCanWriteAnything();
3780 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3781 .WillOnce(
3782 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3783 QuicConsumedData consumed = creator_.ConsumeData(
3784 kDataStreamId, absl::string_view(buf, kStreamFramePayloadSize), 0,
3785 FIN_AND_PADDING);
3786 creator_.Flush();
3787 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3788 EXPECT_FALSE(creator_.HasPendingFrames());
3789 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3790
3791 EXPECT_EQ(1u, packets_.size());
3792 PacketContents contents;
3793 // The packet has both stream and padding frames.
3794 contents.num_padding_frames = 1;
3795 contents.num_stream_frames = 1;
3796 CheckPacketContains(contents, 0);
3797 }
3798
TEST_F(QuicPacketCreatorMultiplePacketsTest,RandomPaddingAfterFinSingleStreamMultiplePackets)3799 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3800 RandomPaddingAfterFinSingleStreamMultiplePackets) {
3801 const QuicByteCount kStreamFramePayloadSize = 100u;
3802 char buf[kStreamFramePayloadSize] = {};
3803 const QuicStreamId kDataStreamId = 5;
3804 // Set the packet size be enough for one stream frame with 0 stream offset +
3805 // 1. One or more packets will accommodate.
3806 size_t length =
3807 TaggingEncrypter(0x00).GetCiphertextSize(0) +
3808 GetPacketHeaderSize(
3809 framer_.transport_version(),
3810 creator_.GetDestinationConnectionIdLength(),
3811 creator_.GetSourceConnectionIdLength(),
3812 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3813 !kIncludeDiversificationNonce,
3814 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3815 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3816 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3817 QuicFramer::GetMinStreamFrameSize(
3818 framer_.transport_version(), kDataStreamId, 0,
3819 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
3820 kStreamFramePayloadSize + 1;
3821 creator_.SetMaxPacketLength(length);
3822 delegate_.SetCanWriteAnything();
3823 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3824 .WillRepeatedly(
3825 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3826 QuicConsumedData consumed = creator_.ConsumeData(
3827 kDataStreamId, absl::string_view(buf, kStreamFramePayloadSize), 0,
3828 FIN_AND_PADDING);
3829 creator_.Flush();
3830 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3831 EXPECT_FALSE(creator_.HasPendingFrames());
3832 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3833
3834 EXPECT_LE(1u, packets_.size());
3835 PacketContents contents;
3836 // The first packet has both stream and padding frames.
3837 contents.num_stream_frames = 1;
3838 contents.num_padding_frames = 1;
3839 CheckPacketContains(contents, 0);
3840
3841 for (size_t i = 1; i < packets_.size(); ++i) {
3842 // Following packets only have paddings.
3843 contents.num_stream_frames = 0;
3844 contents.num_padding_frames = 1;
3845 CheckPacketContains(contents, i);
3846 }
3847 }
3848
TEST_F(QuicPacketCreatorMultiplePacketsTest,RandomPaddingAfterFinMultipleStreamsMultiplePackets)3849 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3850 RandomPaddingAfterFinMultipleStreamsMultiplePackets) {
3851 const QuicByteCount kStreamFramePayloadSize = 100u;
3852 char buf[kStreamFramePayloadSize] = {};
3853 const QuicStreamId kDataStreamId1 = 5;
3854 const QuicStreamId kDataStreamId2 = 6;
3855 // Set the packet size be enough for first frame with 0 stream offset + second
3856 // frame + 1 byte payload. two or more packets will accommodate.
3857 size_t length =
3858 TaggingEncrypter(0x00).GetCiphertextSize(0) +
3859 GetPacketHeaderSize(
3860 framer_.transport_version(),
3861 creator_.GetDestinationConnectionIdLength(),
3862 creator_.GetSourceConnectionIdLength(),
3863 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3864 !kIncludeDiversificationNonce,
3865 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3866 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3867 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3868 QuicFramer::GetMinStreamFrameSize(
3869 framer_.transport_version(), kDataStreamId1, 0,
3870 /*last_frame_in_packet=*/false, kStreamFramePayloadSize) +
3871 kStreamFramePayloadSize +
3872 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(),
3873 kDataStreamId1, 0,
3874 /*last_frame_in_packet=*/false, 1) +
3875 1;
3876 creator_.SetMaxPacketLength(length);
3877 delegate_.SetCanWriteAnything();
3878 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3879 .WillRepeatedly(
3880 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3881 QuicConsumedData consumed = creator_.ConsumeData(
3882 kDataStreamId1, absl::string_view(buf, kStreamFramePayloadSize), 0,
3883 FIN_AND_PADDING);
3884 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3885 consumed = creator_.ConsumeData(
3886 kDataStreamId2, absl::string_view(buf, kStreamFramePayloadSize), 0,
3887 FIN_AND_PADDING);
3888 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3889 creator_.Flush();
3890 EXPECT_FALSE(creator_.HasPendingFrames());
3891 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3892
3893 EXPECT_LE(2u, packets_.size());
3894 PacketContents contents;
3895 // The first packet has two stream frames.
3896 contents.num_stream_frames = 2;
3897 CheckPacketContains(contents, 0);
3898
3899 // The second packet has one stream frame and padding frames.
3900 contents.num_stream_frames = 1;
3901 contents.num_padding_frames = 1;
3902 CheckPacketContains(contents, 1);
3903
3904 for (size_t i = 2; i < packets_.size(); ++i) {
3905 // Following packets only have paddings.
3906 contents.num_stream_frames = 0;
3907 contents.num_padding_frames = 1;
3908 CheckPacketContains(contents, i);
3909 }
3910 }
3911
TEST_F(QuicPacketCreatorMultiplePacketsTest,AddMessageFrame)3912 TEST_F(QuicPacketCreatorMultiplePacketsTest, AddMessageFrame) {
3913 if (framer_.version().UsesTls()) {
3914 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
3915 }
3916 delegate_.SetCanWriteAnything();
3917 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3918 .WillOnce(
3919 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3920
3921 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3922 framer_.transport_version(), Perspective::IS_CLIENT),
3923 "foo", 0, FIN);
3924 EXPECT_EQ(MESSAGE_STATUS_SUCCESS,
3925 creator_.AddMessageFrame(1, MemSliceFromString("message")));
3926 EXPECT_TRUE(creator_.HasPendingFrames());
3927 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3928
3929 // Add a message which causes the flush of current packet.
3930 EXPECT_EQ(MESSAGE_STATUS_SUCCESS,
3931 creator_.AddMessageFrame(
3932 2, MemSliceFromString(std::string(
3933 creator_.GetCurrentLargestMessagePayload(), 'a'))));
3934 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3935
3936 // Failed to send messages which cannot fit into one packet.
3937 EXPECT_EQ(MESSAGE_STATUS_TOO_LARGE,
3938 creator_.AddMessageFrame(
3939 3, MemSliceFromString(std::string(
3940 creator_.GetCurrentLargestMessagePayload() + 10, 'a'))));
3941 }
3942
TEST_F(QuicPacketCreatorMultiplePacketsTest,ConnectionId)3943 TEST_F(QuicPacketCreatorMultiplePacketsTest, ConnectionId) {
3944 creator_.SetServerConnectionId(TestConnectionId(0x1337));
3945 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3946 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
3947 if (!framer_.version().SupportsClientConnectionIds()) {
3948 return;
3949 }
3950 creator_.SetClientConnectionId(TestConnectionId(0x33));
3951 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3952 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
3953 }
3954
3955 // Regresstion test for b/159812345.
TEST_F(QuicPacketCreatorMultiplePacketsTest,ExtraPaddingNeeded)3956 TEST_F(QuicPacketCreatorMultiplePacketsTest, ExtraPaddingNeeded) {
3957 if (!framer_.version().HasHeaderProtection()) {
3958 return;
3959 }
3960 delegate_.SetCanWriteAnything();
3961 // If the packet number length > 1, we won't get padding.
3962 EXPECT_EQ(QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3963 PACKET_1BYTE_PACKET_NUMBER);
3964 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3965 .WillOnce(
3966 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3967 // with no data and no offset, this is a 2B STREAM frame.
3968 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3969 framer_.transport_version(), Perspective::IS_CLIENT),
3970 "", 0, FIN);
3971 creator_.Flush();
3972 ASSERT_FALSE(packets_[0].nonretransmittable_frames.empty());
3973 QuicFrame padding = packets_[0].nonretransmittable_frames[0];
3974 // Verify stream frame expansion is excluded.
3975 EXPECT_EQ(padding.padding_frame.num_padding_bytes, 1);
3976 }
3977
TEST_F(QuicPacketCreatorMultiplePacketsTest,PeerAddressContextWithSameAddress)3978 TEST_F(QuicPacketCreatorMultiplePacketsTest,
3979 PeerAddressContextWithSameAddress) {
3980 QuicConnectionId client_connection_id = TestConnectionId(1);
3981 QuicConnectionId server_connection_id = TestConnectionId(2);
3982 QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
3983 creator_.SetDefaultPeerAddress(peer_addr);
3984 creator_.SetClientConnectionId(client_connection_id);
3985 creator_.SetServerConnectionId(server_connection_id);
3986 // Send some stream data.
3987 EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
3988 .WillRepeatedly(Return(true));
3989 QuicConsumedData consumed = creator_.ConsumeData(
3990 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
3991 Perspective::IS_CLIENT),
3992 "foo", 0, NO_FIN);
3993 EXPECT_EQ(3u, consumed.bytes_consumed);
3994 EXPECT_TRUE(creator_.HasPendingFrames());
3995 {
3996 // Set the same address via context which should not trigger flush.
3997 QuicPacketCreator::ScopedPeerAddressContext context(
3998 &creator_, peer_addr, client_connection_id, server_connection_id);
3999 ASSERT_EQ(client_connection_id, creator_.GetClientConnectionId());
4000 ASSERT_EQ(server_connection_id, creator_.GetServerConnectionId());
4001 EXPECT_TRUE(creator_.HasPendingFrames());
4002 // Queue another STREAM_FRAME.
4003 QuicConsumedData consumed = creator_.ConsumeData(
4004 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
4005 Perspective::IS_CLIENT),
4006 "foo", 0, FIN);
4007 EXPECT_EQ(3u, consumed.bytes_consumed);
4008 }
4009 // After exiting the scope, the last queued frame should be flushed.
4010 EXPECT_TRUE(creator_.HasPendingFrames());
4011 EXPECT_CALL(delegate_, OnSerializedPacket(_))
4012 .WillOnce(Invoke([=](SerializedPacket packet) {
4013 EXPECT_EQ(peer_addr, packet.peer_address);
4014 ASSERT_EQ(2u, packet.retransmittable_frames.size());
4015 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
4016 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.back().type);
4017 }));
4018 creator_.FlushCurrentPacket();
4019 }
4020
TEST_F(QuicPacketCreatorMultiplePacketsTest,PeerAddressContextWithDifferentAddress)4021 TEST_F(QuicPacketCreatorMultiplePacketsTest,
4022 PeerAddressContextWithDifferentAddress) {
4023 QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
4024 creator_.SetDefaultPeerAddress(peer_addr);
4025 // Send some stream data.
4026 EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
4027 .WillRepeatedly(Return(true));
4028 QuicConsumedData consumed = creator_.ConsumeData(
4029 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
4030 Perspective::IS_CLIENT),
4031 "foo", 0, NO_FIN);
4032 EXPECT_EQ(3u, consumed.bytes_consumed);
4033
4034 QuicSocketAddress peer_addr1(QuicIpAddress::Any4(), 12346);
4035 EXPECT_CALL(delegate_, OnSerializedPacket(_))
4036 .WillOnce(Invoke([=](SerializedPacket packet) {
4037 EXPECT_EQ(peer_addr, packet.peer_address);
4038 ASSERT_EQ(1u, packet.retransmittable_frames.size());
4039 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
4040 }))
4041 .WillOnce(Invoke([=](SerializedPacket packet) {
4042 EXPECT_EQ(peer_addr1, packet.peer_address);
4043 ASSERT_EQ(1u, packet.retransmittable_frames.size());
4044 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
4045 }));
4046 EXPECT_TRUE(creator_.HasPendingFrames());
4047 {
4048 QuicConnectionId client_connection_id = TestConnectionId(1);
4049 QuicConnectionId server_connection_id = TestConnectionId(2);
4050 // Set a different address via context which should trigger flush.
4051 QuicPacketCreator::ScopedPeerAddressContext context(
4052 &creator_, peer_addr1, client_connection_id, server_connection_id);
4053 ASSERT_EQ(client_connection_id, creator_.GetClientConnectionId());
4054 ASSERT_EQ(server_connection_id, creator_.GetServerConnectionId());
4055 EXPECT_FALSE(creator_.HasPendingFrames());
4056 // Queue another STREAM_FRAME.
4057 QuicConsumedData consumed = creator_.ConsumeData(
4058 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
4059 Perspective::IS_CLIENT),
4060 "foo", 0, FIN);
4061 EXPECT_EQ(3u, consumed.bytes_consumed);
4062 EXPECT_TRUE(creator_.HasPendingFrames());
4063 }
4064 // After exiting the scope, the last queued frame should be flushed.
4065 EXPECT_FALSE(creator_.HasPendingFrames());
4066 }
4067
TEST_F(QuicPacketCreatorMultiplePacketsTest,NestedPeerAddressContextWithDifferentAddress)4068 TEST_F(QuicPacketCreatorMultiplePacketsTest,
4069 NestedPeerAddressContextWithDifferentAddress) {
4070 QuicConnectionId client_connection_id1 = creator_.GetClientConnectionId();
4071 QuicConnectionId server_connection_id1 = creator_.GetServerConnectionId();
4072 QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
4073 creator_.SetDefaultPeerAddress(peer_addr);
4074 QuicPacketCreator::ScopedPeerAddressContext context(
4075 &creator_, peer_addr, client_connection_id1, server_connection_id1);
4076 ASSERT_EQ(client_connection_id1, creator_.GetClientConnectionId());
4077 ASSERT_EQ(server_connection_id1, creator_.GetServerConnectionId());
4078
4079 // Send some stream data.
4080 EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
4081 .WillRepeatedly(Return(true));
4082 QuicConsumedData consumed = creator_.ConsumeData(
4083 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
4084 Perspective::IS_CLIENT),
4085 "foo", 0, NO_FIN);
4086 EXPECT_EQ(3u, consumed.bytes_consumed);
4087 EXPECT_TRUE(creator_.HasPendingFrames());
4088
4089 QuicSocketAddress peer_addr1(QuicIpAddress::Any4(), 12346);
4090 EXPECT_CALL(delegate_, OnSerializedPacket(_))
4091 .WillOnce(Invoke([=](SerializedPacket packet) {
4092 EXPECT_EQ(peer_addr, packet.peer_address);
4093 ASSERT_EQ(1u, packet.retransmittable_frames.size());
4094 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
4095
4096 QuicConnectionId client_connection_id2 = TestConnectionId(3);
4097 QuicConnectionId server_connection_id2 = TestConnectionId(4);
4098 // Set up another context with a different address.
4099 QuicPacketCreator::ScopedPeerAddressContext context(
4100 &creator_, peer_addr1, client_connection_id2,
4101 server_connection_id2);
4102 ASSERT_EQ(client_connection_id2, creator_.GetClientConnectionId());
4103 ASSERT_EQ(server_connection_id2, creator_.GetServerConnectionId());
4104 EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
4105 .WillRepeatedly(Return(true));
4106 QuicConsumedData consumed = creator_.ConsumeData(
4107 QuicUtils::GetFirstBidirectionalStreamId(
4108 creator_.transport_version(), Perspective::IS_CLIENT),
4109 "foo", 0, NO_FIN);
4110 EXPECT_EQ(3u, consumed.bytes_consumed);
4111 EXPECT_TRUE(creator_.HasPendingFrames());
4112 // This should trigger another OnSerializedPacket() with the 2nd
4113 // address.
4114 creator_.FlushCurrentPacket();
4115 }))
4116 .WillOnce(Invoke([=](SerializedPacket packet) {
4117 EXPECT_EQ(peer_addr1, packet.peer_address);
4118 ASSERT_EQ(1u, packet.retransmittable_frames.size());
4119 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
4120 }));
4121 creator_.FlushCurrentPacket();
4122 }
4123
4124 } // namespace
4125 } // namespace test
4126 } // namespace quic
4127