• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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