blob: 7943ceec9a53bdd33ad7f80d738beb33c8e3a140 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/quic_packet_creator.h"
6
7#include <cstdint>
vasilvva57bbb32019-11-06 06:19:27 -08008#include <limits>
QUICHE teama6ef0a62019-03-07 20:34:33 -05009#include <memory>
10#include <ostream>
vasilvv872e7a32019-03-12 16:42:44 -070011#include <string>
bnc463f2352019-10-10 04:49:34 -070012#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -050013
zhongyi546cc452019-04-12 15:27:49 -070014#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050015#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
17#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
renjietangdbe98342019-10-18 11:00:57 -070018#include "net/third_party/quiche/src/quic/core/frames/quic_stream_frame.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050019#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050020#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
21#include "net/third_party/quiche/src/quic/core/quic_types.h"
22#include "net/third_party/quiche/src/quic/core/quic_utils.h"
23#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
renjietangdbe98342019-10-18 11:00:57 -070024#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
fayang08750832019-10-24 11:25:34 -070025#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050026#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050027#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
28#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
29#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
30#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
31#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
fayang4245c212019-11-05 13:33:46 -080032#include "net/third_party/quiche/src/quic/test_tools/simple_quic_framer.h"
bnc4e9283d2019-12-17 07:08:57 -080033#include "net/third_party/quiche/src/common/platform/api/quiche_arraysize.h"
dmcardlecf0bfcf2019-12-13 08:08:21 -080034#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h"
35#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
dmcardle8f7df532020-01-07 13:28:57 -080036#include "net/third_party/quiche/src/common/test_tools/quiche_test_utils.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050037
38using testing::_;
39using testing::DoAll;
40using testing::InSequence;
41using testing::Invoke;
42using testing::Return;
43using testing::SaveArg;
44using testing::StrictMock;
45
46namespace quic {
47namespace test {
48namespace {
49
renjietang4c704c82019-10-07 16:39:11 -070050const 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.
dschinazi423adc72019-10-23 09:58:55 -070053QuicConnectionId CreateTestConnectionId() {
54 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
55}
renjietang4c704c82019-10-07 16:39:11 -070056
QUICHE teama6ef0a62019-03-07 20:34:33 -050057// Run tests with combinations of {ParsedQuicVersion,
58// ToggleVersionSerialization}.
59struct TestParams {
60 TestParams(ParsedQuicVersion version, bool version_serialization)
61 : version(version), version_serialization(version_serialization) {}
62
QUICHE teama6ef0a62019-03-07 20:34:33 -050063 ParsedQuicVersion version;
64 bool version_serialization;
65};
66
dschinazi142051a2019-09-18 18:17:29 -070067// Used by ::testing::PrintToStringParamName().
68std::string PrintToString(const TestParams& p) {
dmcardlecf0bfcf2019-12-13 08:08:21 -080069 return quiche::QuicheStrCat(ParsedQuicVersionToString(p.version), "_",
70 (p.version_serialization ? "Include" : "No"),
71 "Version");
dschinazi142051a2019-09-18 18:17:29 -070072}
73
QUICHE teama6ef0a62019-03-07 20:34:33 -050074// Constructs various test permutations.
75std::vector<TestParams> GetTestParams() {
76 std::vector<TestParams> params;
77 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
78 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
79 params.push_back(TestParams(all_supported_versions[i], true));
80 params.push_back(TestParams(all_supported_versions[i], false));
81 }
82 return params;
83}
84
rchc76cd742019-03-26 16:00:03 -070085class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
86 public:
87 ~MockDebugDelegate() override = default;
88
wub713afae2020-04-27 07:48:31 -070089 MOCK_METHOD(void, OnFrameAddedToPacket, (const QuicFrame& frame), (override));
renjietangdbe98342019-10-18 11:00:57 -070090
wub713afae2020-04-27 07:48:31 -070091 MOCK_METHOD(void,
92 OnStreamFrameCoalesced,
93 (const QuicStreamFrame& frame),
94 (override));
rchc76cd742019-03-26 16:00:03 -070095};
96
QUICHE teama6ef0a62019-03-07 20:34:33 -050097class TestPacketCreator : public QuicPacketCreator {
98 public:
99 TestPacketCreator(QuicConnectionId connection_id,
100 QuicFramer* framer,
101 DelegateInterface* delegate,
102 SimpleDataProducer* producer)
103 : QuicPacketCreator(connection_id, framer, delegate),
104 producer_(producer),
105 version_(framer->transport_version()) {}
106
fayang62b637b2019-09-16 08:40:49 -0700107 bool ConsumeDataToFillCurrentPacket(QuicStreamId id,
108 const struct iovec* iov,
109 int iov_count,
110 size_t total_length,
111 size_t iov_offset,
112 QuicStreamOffset offset,
113 bool fin,
114 bool needs_full_padding,
115 TransmissionType transmission_type,
116 QuicFrame* frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500117 // Save data before data is consumed.
118 QuicByteCount data_length = total_length - iov_offset;
119 if (data_length > 0) {
120 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
121 }
fayang62b637b2019-09-16 08:40:49 -0700122 return QuicPacketCreator::ConsumeDataToFillCurrentPacket(
123 id, data_length - iov_offset, offset, fin, needs_full_padding,
124 transmission_type, frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500125 }
126
127 void StopSendingVersion() {
fayangd4291e42019-05-30 10:31:21 -0700128 if (VersionHasIetfInvariantHeader(version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500129 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
130 return;
131 }
132 QuicPacketCreator::StopSendingVersion();
133 }
134
135 SimpleDataProducer* producer_;
136 QuicTransportVersion version_;
137};
138
139class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
140 public:
wub8a5dafa2020-05-13 12:30:17 -0700141 void ClearSerializedPacketForTests(SerializedPacket /*serialized_packet*/) {
142 // serialized packet self-clears on destruction.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500143 }
144
wub8a5dafa2020-05-13 12:30:17 -0700145 void SaveSerializedPacket(SerializedPacket serialized_packet) {
146 serialized_packet_.reset(CopySerializedPacket(
147 serialized_packet, &allocator_, /*copy_buffer=*/true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500148 }
149
wub8a5dafa2020-05-13 12:30:17 -0700150 void DeleteSerializedPacket() { serialized_packet_ = nullptr; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500151
152 protected:
153 QuicPacketCreatorTest()
154 : connection_id_(TestConnectionId(2)),
155 server_framer_(SupportedVersions(GetParam().version),
156 QuicTime::Zero(),
157 Perspective::IS_SERVER,
158 connection_id_.length()),
159 client_framer_(SupportedVersions(GetParam().version),
160 QuicTime::Zero(),
161 Perspective::IS_CLIENT,
162 connection_id_.length()),
163 data_("foo"),
wub8a5dafa2020-05-13 12:30:17 -0700164 creator_(connection_id_, &client_framer_, &delegate_, &producer_) {
wub50d4c712020-05-19 15:48:28 -0700165 EXPECT_CALL(delegate_, GetPacketBuffer())
166 .WillRepeatedly(Return(QuicPacketBuffer()));
fayang15042962020-07-01 12:14:29 -0700167 if (GetQuicReloadableFlag(quic_determine_serialized_packet_fate_early)) {
168 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
169 .WillRepeatedly(Return(SEND_TO_WRITER));
170 }
nharperc6b99512019-09-19 11:13:48 -0700171 creator_.SetEncrypter(ENCRYPTION_INITIAL, std::make_unique<NullEncrypter>(
172 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700173 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, std::make_unique<NullEncrypter>(
QUICHE team88ea0082019-03-15 10:05:26 -0700174 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700175 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, std::make_unique<NullEncrypter>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500176 Perspective::IS_CLIENT));
177 creator_.SetEncrypter(
178 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700179 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500180 client_framer_.set_visitor(&framer_visitor_);
181 server_framer_.set_visitor(&framer_visitor_);
182 client_framer_.set_data_producer(&producer_);
zhongyi546cc452019-04-12 15:27:49 -0700183 if (server_framer_.version().KnowsWhichDecrypterToUse()) {
184 server_framer_.InstallDecrypter(
nharperc6b99512019-09-19 11:13:48 -0700185 ENCRYPTION_INITIAL,
186 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
187 server_framer_.InstallDecrypter(
zhongyi546cc452019-04-12 15:27:49 -0700188 ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -0700189 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700190 server_framer_.InstallDecrypter(
191 ENCRYPTION_HANDSHAKE,
vasilvv0fc587f2019-09-06 13:33:08 -0700192 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700193 server_framer_.InstallDecrypter(
194 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700195 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
nharperc6b99512019-09-19 11:13:48 -0700196 } else {
197 server_framer_.SetDecrypter(
198 ENCRYPTION_INITIAL,
199 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700200 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500201 }
202
wub8a5dafa2020-05-13 12:30:17 -0700203 ~QuicPacketCreatorTest() override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500204
205 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
206 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
dschinazi66dea072019-04-09 11:41:06 -0700207 &creator_, frames, buffer_, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500208 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
209 packet.encryption_level);
210 return packet;
211 }
212
213 void ProcessPacket(const SerializedPacket& packet) {
214 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
215 packet.encrypted_length);
216 server_framer_.ProcessPacket(encrypted_packet);
217 }
218
219 void CheckStreamFrame(const QuicFrame& frame,
220 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700221 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500222 QuicStreamOffset offset,
223 bool fin) {
224 EXPECT_EQ(STREAM_FRAME, frame.type);
225 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
dschinazi66dea072019-04-09 11:41:06 -0700226 char buf[kMaxOutgoingPacketSize];
QUICHE team173c48f2019-11-19 16:34:44 -0800227 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, quiche::HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500228 if (frame.stream_frame.data_length > 0) {
229 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
230 frame.stream_frame.data_length, &writer);
231 }
dmcardlecf0bfcf2019-12-13 08:08:21 -0800232 EXPECT_EQ(data,
233 quiche::QuicheStringPiece(buf, frame.stream_frame.data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500234 EXPECT_EQ(offset, frame.stream_frame.offset);
235 EXPECT_EQ(fin, frame.stream_frame.fin);
236 }
237
238 // Returns the number of bytes consumed by the header of packet, including
239 // the version.
240 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
241 return GetPacketHeaderSize(
242 version, creator_.GetDestinationConnectionIdLength(),
243 creator_.GetSourceConnectionIdLength(),
244 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
245 !kIncludeDiversificationNonce,
246 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
247 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
248 QuicPacketCreatorPeer::GetLengthLength(&creator_));
249 }
250
251 // Returns the number of bytes of overhead that will be added to a packet
252 // of maximum length.
253 size_t GetEncryptionOverhead() {
254 return creator_.max_packet_length() -
255 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
256 }
257
258 // Returns the number of bytes consumed by the non-data fields of a stream
259 // frame, assuming it is the last frame in the packet
260 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
261 return QuicFramer::GetMinStreamFrameSize(
262 version, GetNthClientInitiatedStreamId(1), kOffset, true,
263 /* data_length= */ 0);
264 }
265
QUICHE teama6ef0a62019-03-07 20:34:33 -0500266 bool IsDefaultTestConfiguration() {
267 TestParams p = GetParam();
268 return p.version == AllSupportedVersions()[0] && p.version_serialization;
269 }
270
271 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
dschinazi552accc2019-06-17 17:07:34 -0700272 return QuicUtils::GetFirstBidirectionalStreamId(
273 creator_.transport_version(), Perspective::IS_CLIENT) +
274 n * 2;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500275 }
276
QUICHE team897763c2020-04-14 08:15:58 -0700277 static constexpr QuicStreamOffset kOffset = 0u;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500278
dschinazi66dea072019-04-09 11:41:06 -0700279 char buffer_[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500280 QuicConnectionId connection_id_;
281 QuicFrames frames_;
282 QuicFramer server_framer_;
283 QuicFramer client_framer_;
284 StrictMock<MockFramerVisitor> framer_visitor_;
285 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700286 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500287 struct iovec iov_;
288 TestPacketCreator creator_;
wub8a5dafa2020-05-13 12:30:17 -0700289 std::unique_ptr<SerializedPacket> serialized_packet_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500290 SimpleDataProducer producer_;
291 SimpleBufferAllocator allocator_;
292};
293
294// Run all packet creator tests with all supported versions of QUIC, and with
295// and without version in the packet header, as well as doing a run for each
296// length of truncated connection id.
297INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
298 QuicPacketCreatorTest,
dschinazi142051a2019-09-18 18:17:29 -0700299 ::testing::ValuesIn(GetTestParams()),
300 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500301
302TEST_P(QuicPacketCreatorTest, SerializeFrames) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700303 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500304 EncryptionLevel level = static_cast<EncryptionLevel>(i);
305 creator_.set_encryption_level(level);
306 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700307 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
308 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang49523232019-05-03 06:28:22 -0700309 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800310 frames_.push_back(QuicFrame(
311 QuicStreamFrame(stream_id, false, 0u, quiche::QuicheStringPiece())));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700312 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500313 SerializedPacket serialized = SerializeAllFrames(frames_);
314 EXPECT_EQ(level, serialized.encryption_level);
315 delete frames_[0].ack_frame;
316 frames_.clear();
317
318 {
319 InSequence s;
320 EXPECT_CALL(framer_visitor_, OnPacket());
321 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
322 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
323 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
324 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
325 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
326 .WillOnce(Return(true));
327 EXPECT_CALL(framer_visitor_,
328 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
329 .WillOnce(Return(true));
330 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
331 .WillOnce(Return(true));
fayang49523232019-05-03 06:28:22 -0700332 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700333 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700334 }
nharperc32d8ab2019-10-09 11:09:06 -0700335 if (client_framer_.version().HasHeaderProtection()) {
336 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_))
337 .Times(testing::AnyNumber());
338 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500339 EXPECT_CALL(framer_visitor_, OnPacketComplete());
340 }
341 ProcessPacket(serialized);
342 }
343}
344
QUICHE teama6ef0a62019-03-07 20:34:33 -0500345TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
wub8a5dafa2020-05-13 12:30:17 -0700346 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
347 creator_.transport_version(), QUIC_NO_ERROR, "error",
348 /*transport_close_frame_type=*/0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500349
350 QuicFrames frames;
wub8a5dafa2020-05-13 12:30:17 -0700351 frames.push_back(QuicFrame(frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500352 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700353 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500354 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
355 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
356
357 InSequence s;
358 EXPECT_CALL(framer_visitor_, OnPacket());
359 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
360 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
361 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
362 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
363 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
364 EXPECT_CALL(framer_visitor_, OnPacketComplete());
365
366 ProcessPacket(serialized);
367}
368
fayang62b637b2019-09-16 08:40:49 -0700369TEST_P(QuicPacketCreatorTest, ConsumeCryptoDataToFillCurrentPacket) {
vasilvvc48c8712019-03-11 13:38:16 -0700370 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500371 QuicFrame frame;
fayang62b637b2019-09-16 08:40:49 -0700372 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
373 ENCRYPTION_INITIAL, data.length(), 0,
374 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500375 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
376 EXPECT_TRUE(creator_.HasPendingFrames());
377}
378
fayang62b637b2019-09-16 08:40:49 -0700379TEST_P(QuicPacketCreatorTest, ConsumeDataToFillCurrentPacket) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700380 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500381 QuicFrame frame;
382 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700383 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
384 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700385 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
386 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
387 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500388 size_t consumed = frame.stream_frame.data_length;
389 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700390 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500391 EXPECT_TRUE(creator_.HasPendingFrames());
392}
393
394TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700395 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500396 QuicFrame frame;
397 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700398 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
399 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700400 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
401 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
402 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500403 size_t consumed = frame.stream_frame.data_length;
404 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700405 CheckStreamFrame(frame, stream_id, "test", 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500406 EXPECT_TRUE(creator_.HasPendingFrames());
407}
408
409TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700410 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500411 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700412 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
413 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700414 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
415 stream_id, nullptr, 0u, 0u, 0u, 0u, true, false, NOT_RETRANSMISSION,
416 &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500417 size_t consumed = frame.stream_frame.data_length;
418 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700419 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500420 EXPECT_TRUE(creator_.HasPendingFrames());
421}
422
423TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
424 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
425 const size_t overhead =
426 GetPacketHeaderOverhead(client_framer_.transport_version()) +
427 GetEncryptionOverhead();
QUICHE team2252b702019-05-14 23:55:14 -0400428 for (size_t i = overhead + QuicPacketCreator::MinPlaintextPacketSize(
429 client_framer_.version());
nharper55fa6132019-05-07 19:37:21 -0700430 i < overhead + 100; ++i) {
431 SCOPED_TRACE(i);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500432 creator_.SetMaxPacketLength(i);
433 const bool should_have_room =
434 i >
435 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
436 ASSERT_EQ(should_have_room,
437 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
438 kOffset, /* data_size=*/0xffff));
439 if (should_have_room) {
440 QuicFrame frame;
441 MakeIOVector("testdata", &iov_);
442 EXPECT_CALL(delegate_, OnSerializedPacket(_))
443 .WillRepeatedly(Invoke(
444 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
fayang62b637b2019-09-16 08:40:49 -0700445 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
446 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u,
447 kOffset, false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500448 size_t bytes_consumed = frame.stream_frame.data_length;
449 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700450 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500451 }
452 }
453}
454
455TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
456 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
457 // Compute the total overhead for a single frame in packet.
458 const size_t overhead =
459 GetPacketHeaderOverhead(client_framer_.transport_version()) +
460 GetEncryptionOverhead() +
461 GetStreamFrameOverhead(client_framer_.transport_version());
462 size_t capacity = kDefaultMaxPacketSize - overhead;
463 // Now, test various sizes around this size.
464 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700465 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500466 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
467 QuicFrame frame;
468 MakeIOVector(data, &iov_);
fayang62b637b2019-09-16 08:40:49 -0700469 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
470 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
471 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500472
473 // BytesFree() returns bytes available for the next frame, which will
474 // be two bytes smaller since the stream frame would need to be grown.
475 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
476 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
477 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
478 EXPECT_CALL(delegate_, OnSerializedPacket(_))
479 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700480 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -0700481 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500482 DeleteSerializedPacket();
483 }
484}
485
486TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700487 // This test serializes crypto payloads slightly larger than a packet, which
488 // Causes the multi-packet ClientHello check to fail.
danzh88e3e052019-06-13 11:47:18 -0700489 SetQuicFlag(FLAGS_quic_enforce_single_packet_chlo, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500490 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700491 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500492 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700493 GetEncryptionOverhead();
494 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
dschinazi66dea072019-04-09 11:41:06 -0700495 overhead +=
496 QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxOutgoingPacketSize);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700497 } else {
498 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
499 }
dschinazi66dea072019-04-09 11:41:06 -0700500 ASSERT_GT(kMaxOutgoingPacketSize, overhead);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500501 size_t capacity = kDefaultMaxPacketSize - overhead;
502 // Now, test various sizes around this size.
503 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700504 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700505 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500506 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
507
508 QuicFrame frame;
509 MakeIOVector(data, &iov_);
510 EXPECT_CALL(delegate_, OnSerializedPacket(_))
511 .WillRepeatedly(
512 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang15042962020-07-01 12:14:29 -0700513 if (GetQuicReloadableFlag(quic_determine_serialized_packet_fate_early) &&
514 client_framer_.version().CanSendCoalescedPackets()) {
515 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
516 .WillRepeatedly(Return(COALESCE));
517 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700518 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
fayang62b637b2019-09-16 08:40:49 -0700519 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700520 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
521 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
522 &frame));
523 size_t bytes_consumed = frame.stream_frame.data_length;
524 EXPECT_LT(0u, bytes_consumed);
525 } else {
526 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
fayang62b637b2019-09-16 08:40:49 -0700527 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
nharper51961cf2019-05-13 13:23:24 -0700528 ENCRYPTION_INITIAL, data.length(), kOffset,
529 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700530 size_t bytes_consumed = frame.crypto_frame->data_length;
531 EXPECT_LT(0u, bytes_consumed);
532 }
fayang62b637b2019-09-16 08:40:49 -0700533 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -0700534 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500535 // If there is not enough space in the packet to fit a padding frame
536 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
537 // will not be padded.
fayang58f71072019-11-05 08:47:02 -0800538 // Padding is skipped when we try to send coalesced packets.
539 if ((bytes_free < 3 &&
540 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) ||
541 client_framer_.version().CanSendCoalescedPackets()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500542 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
wub8a5dafa2020-05-13 12:30:17 -0700543 serialized_packet_->encrypted_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500544 } else {
wub8a5dafa2020-05-13 12:30:17 -0700545 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_->encrypted_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500546 }
547 DeleteSerializedPacket();
548 }
549}
550
551TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
552 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
553 // Compute the total overhead for a single frame in packet.
554 const size_t overhead =
555 GetPacketHeaderOverhead(client_framer_.transport_version()) +
556 GetEncryptionOverhead() +
557 GetStreamFrameOverhead(client_framer_.transport_version());
558 ASSERT_GT(kDefaultMaxPacketSize, overhead);
559 size_t capacity = kDefaultMaxPacketSize - overhead;
560 // Now, test various sizes around this size.
561 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700562 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500563 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
564
565 QuicFrame frame;
566 MakeIOVector(data, &iov_);
567 EXPECT_CALL(delegate_, OnSerializedPacket(_))
568 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700569 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
570 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
571 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500572 size_t bytes_consumed = frame.stream_frame.data_length;
573 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700574 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -0700575 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500576 if (bytes_free > 0) {
577 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
wub8a5dafa2020-05-13 12:30:17 -0700578 serialized_packet_->encrypted_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500579 } else {
wub8a5dafa2020-05-13 12:30:17 -0700580 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_->encrypted_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500581 }
582 DeleteSerializedPacket();
583 }
584}
585
586TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
587 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
588 ParsedQuicVersionVector versions;
589 versions.push_back(test::QuicVersionMax());
fayangd4291e42019-05-30 10:31:21 -0700590 const bool ietf_quic =
renjietang4c704c82019-10-07 16:39:11 -0700591 VersionHasIetfInvariantHeader(creator_.transport_version());
dschinazi48ac9192019-07-31 00:07:26 -0700592 const bool has_length_prefix =
593 GetParam().version.HasLengthPrefixedConnectionIds();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500594 std::unique_ptr<QuicEncryptedPacket> encrypted(
dschinazi48ac9192019-07-31 00:07:26 -0700595 creator_.SerializeVersionNegotiationPacket(ietf_quic, has_length_prefix,
596 versions));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500597
598 {
599 InSequence s;
600 EXPECT_CALL(framer_visitor_, OnPacket());
601 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
602 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
603 }
604 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
605 client_framer_.ProcessPacket(*encrypted);
606}
607
renjietang4c704c82019-10-07 16:39:11 -0700608// Test that the path challenge connectivity probing packet is serialized
609// correctly as a padded PATH CHALLENGE packet.
610TEST_P(QuicPacketCreatorTest, BuildPathChallengePacket) {
611 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
612 // This frame is only for IETF QUIC.
613 return;
614 }
615
616 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700617 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700618 header.reset_flag = false;
619 header.version_flag = false;
620 header.packet_number = kPacketNumber;
621 QuicPathFrameBuffer payload;
622
623 // clang-format off
624 unsigned char packet[] = {
625 // type (short header, 4 byte packet number)
626 0x43,
627 // connection_id
628 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
629 // packet number
630 0x12, 0x34, 0x56, 0x78,
631
632 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
633 0x1a,
634 // 8 "random" bytes, MockRandom makes lots of r's
635 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
636 // frame type (padding frame)
637 0x00,
638 0x00, 0x00, 0x00, 0x00
639 };
640 // clang-format on
641
642 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
643 MockRandom randomizer;
644
645 size_t length = creator_.BuildPaddedPathChallengePacket(
bnc4e9283d2019-12-17 07:08:57 -0800646 header, buffer.get(), QUICHE_ARRAYSIZE(packet), &payload, &randomizer,
renjietang4c704c82019-10-07 16:39:11 -0700647 ENCRYPTION_INITIAL);
bnc4e9283d2019-12-17 07:08:57 -0800648 EXPECT_EQ(length, QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700649
650 // Payload has the random bytes that were generated. Copy them into packet,
651 // above, before checking that the generated packet is correct.
652 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
653
654 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
655 header);
656
dmcardle8f7df532020-01-07 13:28:57 -0800657 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700658 "constructed packet", data.data(), data.length(),
bnc4e9283d2019-12-17 07:08:57 -0800659 reinterpret_cast<char*>(packet), QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700660}
661
662TEST_P(QuicPacketCreatorTest, BuildConnectivityProbingPacket) {
663 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700664 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700665 header.reset_flag = false;
666 header.version_flag = false;
667 header.packet_number = kPacketNumber;
668
669 // clang-format off
670 unsigned char packet[] = {
671 // public flags (8 byte connection_id)
672 0x2C,
673 // connection_id
674 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
675 // packet number
676 0x12, 0x34, 0x56, 0x78,
677
678 // frame type (ping frame)
679 0x07,
680 // frame type (padding frame)
681 0x00,
682 0x00, 0x00, 0x00, 0x00
683 };
684
685 unsigned char packet46[] = {
686 // type (short header, 4 byte packet number)
687 0x43,
688 // connection_id
689 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
690 // packet number
691 0x12, 0x34, 0x56, 0x78,
692
693 // frame type
694 0x07,
695 // frame type (padding frame)
696 0x00,
697 0x00, 0x00, 0x00, 0x00
698 };
699
700 unsigned char packet99[] = {
701 // type (short header, 4 byte packet number)
702 0x43,
703 // connection_id
704 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
705 // packet number
706 0x12, 0x34, 0x56, 0x78,
707
708 // frame type (IETF_PING frame)
709 0x01,
710 // frame type (padding frame)
711 0x00,
712 0x00, 0x00, 0x00, 0x00
713 };
714 // clang-format on
715
716 unsigned char* p = packet;
bnc4e9283d2019-12-17 07:08:57 -0800717 size_t packet_size = QUICHE_ARRAYSIZE(packet);
dschinazi5c1d7d82020-07-29 16:42:50 -0700718 if (creator_.version().HasIetfQuicFrames()) {
renjietang4c704c82019-10-07 16:39:11 -0700719 p = packet99;
bnc4e9283d2019-12-17 07:08:57 -0800720 packet_size = QUICHE_ARRAYSIZE(packet99);
dschinazi5c1d7d82020-07-29 16:42:50 -0700721 } else if (creator_.version().HasIetfInvariantHeader()) {
renjietang4c704c82019-10-07 16:39:11 -0700722 p = packet46;
bnc4e9283d2019-12-17 07:08:57 -0800723 packet_size = QUICHE_ARRAYSIZE(packet46);
renjietang4c704c82019-10-07 16:39:11 -0700724 }
725
726 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
727
728 size_t length = creator_.BuildConnectivityProbingPacket(
729 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
730
731 EXPECT_NE(0u, length);
732 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
733 header);
734
dmcardle8f7df532020-01-07 13:28:57 -0800735 quiche::test::CompareCharArraysWithHexError(
736 "constructed packet", data.data(), data.length(),
737 reinterpret_cast<char*>(p), packet_size);
renjietang4c704c82019-10-07 16:39:11 -0700738}
739
740// Several tests that the path response connectivity probing packet is
741// serialized correctly as either a padded and unpadded PATH RESPONSE
742// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
743// exercised the single- and multiple- payload cases.
744TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponseUnpadded) {
745 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
746 // This frame is only for IETF QUIC.
747 return;
748 }
749
750 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700751 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700752 header.reset_flag = false;
753 header.version_flag = false;
754 header.packet_number = kPacketNumber;
755 QuicPathFrameBuffer payload0 = {
756 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
757
758 // Build 1 PATH RESPONSE, not padded
759 // clang-format off
760 unsigned char packet[] = {
761 // type (short header, 4 byte packet number)
762 0x43,
763 // connection_id
764 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
765 // packet number
766 0x12, 0x34, 0x56, 0x78,
767
768 // Path Response Frame type (IETF_PATH_RESPONSE)
769 0x1b,
770 // 8 "random" bytes
771 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
772 };
773 // clang-format on
774 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
wuba750aab2020-02-10 06:43:15 -0800775 QuicCircularDeque<QuicPathFrameBuffer> payloads;
renjietang4c704c82019-10-07 16:39:11 -0700776 payloads.push_back(payload0);
777 size_t length = creator_.BuildPathResponsePacket(
bnc4e9283d2019-12-17 07:08:57 -0800778 header, buffer.get(), QUICHE_ARRAYSIZE(packet), payloads,
renjietang4c704c82019-10-07 16:39:11 -0700779 /*is_padded=*/false, ENCRYPTION_INITIAL);
bnc4e9283d2019-12-17 07:08:57 -0800780 EXPECT_EQ(length, QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700781 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
782 header);
783
dmcardle8f7df532020-01-07 13:28:57 -0800784 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700785 "constructed packet", data.data(), data.length(),
bnc4e9283d2019-12-17 07:08:57 -0800786 reinterpret_cast<char*>(packet), QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700787}
788
789TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponsePadded) {
790 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
791 // This frame is only for IETF QUIC.
792 return;
793 }
794
795 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700796 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700797 header.reset_flag = false;
798 header.version_flag = false;
799 header.packet_number = kPacketNumber;
800 QuicPathFrameBuffer payload0 = {
801 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
802
803 // Build 1 PATH RESPONSE, padded
804 // clang-format off
805 unsigned char packet[] = {
806 // type (short header, 4 byte packet number)
807 0x43,
808 // connection_id
809 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
810 // packet number
811 0x12, 0x34, 0x56, 0x78,
812
813 // Path Response Frame type (IETF_PATH_RESPONSE)
814 0x1b,
815 // 8 "random" bytes
816 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
817 // Padding type and pad
818 0x00, 0x00, 0x00, 0x00, 0x00
819 };
820 // clang-format on
821 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
wuba750aab2020-02-10 06:43:15 -0800822 QuicCircularDeque<QuicPathFrameBuffer> payloads;
renjietang4c704c82019-10-07 16:39:11 -0700823 payloads.push_back(payload0);
824 size_t length = creator_.BuildPathResponsePacket(
bnc4e9283d2019-12-17 07:08:57 -0800825 header, buffer.get(), QUICHE_ARRAYSIZE(packet), payloads,
renjietang4c704c82019-10-07 16:39:11 -0700826 /*is_padded=*/true, ENCRYPTION_INITIAL);
bnc4e9283d2019-12-17 07:08:57 -0800827 EXPECT_EQ(length, QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700828 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
829 header);
830
dmcardle8f7df532020-01-07 13:28:57 -0800831 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700832 "constructed packet", data.data(), data.length(),
bnc4e9283d2019-12-17 07:08:57 -0800833 reinterpret_cast<char*>(packet), QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700834}
835
836TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesUnpadded) {
837 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
838 // This frame is only for IETF QUIC.
839 return;
840 }
841
842 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700843 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700844 header.reset_flag = false;
845 header.version_flag = false;
846 header.packet_number = kPacketNumber;
847 QuicPathFrameBuffer payload0 = {
848 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
849 QuicPathFrameBuffer payload1 = {
850 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
851 QuicPathFrameBuffer payload2 = {
852 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
853
854 // Build one packet with 3 PATH RESPONSES, no padding
855 // clang-format off
856 unsigned char packet[] = {
857 // type (short header, 4 byte packet number)
858 0x43,
859 // connection_id
860 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
861 // packet number
862 0x12, 0x34, 0x56, 0x78,
863
864 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
865 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
866 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
867 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
868 };
869 // clang-format on
870
871 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
wuba750aab2020-02-10 06:43:15 -0800872 QuicCircularDeque<QuicPathFrameBuffer> payloads;
renjietang4c704c82019-10-07 16:39:11 -0700873 payloads.push_back(payload0);
874 payloads.push_back(payload1);
875 payloads.push_back(payload2);
876 size_t length = creator_.BuildPathResponsePacket(
bnc4e9283d2019-12-17 07:08:57 -0800877 header, buffer.get(), QUICHE_ARRAYSIZE(packet), payloads,
renjietang4c704c82019-10-07 16:39:11 -0700878 /*is_padded=*/false, ENCRYPTION_INITIAL);
bnc4e9283d2019-12-17 07:08:57 -0800879 EXPECT_EQ(length, QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700880 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
881 header);
882
dmcardle8f7df532020-01-07 13:28:57 -0800883 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700884 "constructed packet", data.data(), data.length(),
bnc4e9283d2019-12-17 07:08:57 -0800885 reinterpret_cast<char*>(packet), QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700886}
887
888TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesPadded) {
889 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
890 // This frame is only for IETF QUIC.
891 return;
892 }
893
894 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700895 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700896 header.reset_flag = false;
897 header.version_flag = false;
898 header.packet_number = kPacketNumber;
899 QuicPathFrameBuffer payload0 = {
900 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
901 QuicPathFrameBuffer payload1 = {
902 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
903 QuicPathFrameBuffer payload2 = {
904 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
905
906 // Build one packet with 3 PATH RESPONSES, with padding
907 // clang-format off
908 unsigned char packet[] = {
909 // type (short header, 4 byte packet number)
910 0x43,
911 // connection_id
912 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
913 // packet number
914 0x12, 0x34, 0x56, 0x78,
915
916 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
917 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
918 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
919 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
920 // Padding
921 0x00, 0x00, 0x00, 0x00, 0x00
922 };
923 // clang-format on
924
925 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
wuba750aab2020-02-10 06:43:15 -0800926 QuicCircularDeque<QuicPathFrameBuffer> payloads;
renjietang4c704c82019-10-07 16:39:11 -0700927 payloads.push_back(payload0);
928 payloads.push_back(payload1);
929 payloads.push_back(payload2);
930 size_t length = creator_.BuildPathResponsePacket(
bnc4e9283d2019-12-17 07:08:57 -0800931 header, buffer.get(), QUICHE_ARRAYSIZE(packet), payloads,
renjietang4c704c82019-10-07 16:39:11 -0700932 /*is_padded=*/true, ENCRYPTION_INITIAL);
bnc4e9283d2019-12-17 07:08:57 -0800933 EXPECT_EQ(length, QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700934 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
935 header);
936
dmcardle8f7df532020-01-07 13:28:57 -0800937 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700938 "constructed packet", data.data(), data.length(),
bnc4e9283d2019-12-17 07:08:57 -0800939 reinterpret_cast<char*>(packet), QUICHE_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700940}
941
QUICHE teama6ef0a62019-03-07 20:34:33 -0500942TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
dschinazi1c6e5922020-06-19 10:35:03 -0700943 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500944
dschinazi1c6e5922020-06-19 10:35:03 -0700945 std::unique_ptr<SerializedPacket> encrypted;
946 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
947 QuicPathFrameBuffer payload = {
948 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
949 encrypted =
950 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
951 } else {
952 encrypted = creator_.SerializeConnectivityProbingPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500953 }
dschinazi1c6e5922020-06-19 10:35:03 -0700954 {
955 InSequence s;
956 EXPECT_CALL(framer_visitor_, OnPacket());
957 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
958 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
959 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
960 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
961 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
962 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
963 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
964 } else {
965 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
966 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
967 }
968 EXPECT_CALL(framer_visitor_, OnPacketComplete());
969 }
970 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
971 server_framer_.ProcessPacket(QuicEncryptedPacket(
972 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500973}
974
975TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
renjietang4c704c82019-10-07 16:39:11 -0700976 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500977 return;
978 }
979 QuicPathFrameBuffer payload = {
980 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
981
dschinazi1c6e5922020-06-19 10:35:03 -0700982 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500983
dschinazi1c6e5922020-06-19 10:35:03 -0700984 std::unique_ptr<SerializedPacket> encrypted(
985 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
986 {
987 InSequence s;
988 EXPECT_CALL(framer_visitor_, OnPacket());
989 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
990 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
991 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
992 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
993 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
994 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
995 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500996 }
dschinazi1c6e5922020-06-19 10:35:03 -0700997 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
998 server_framer_.ProcessPacket(QuicEncryptedPacket(
999 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001000}
1001
1002TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001003 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001004 return;
1005 }
1006 QuicPathFrameBuffer payload0 = {
1007 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1008
dschinazi1c6e5922020-06-19 10:35:03 -07001009 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001010
dschinazi1c6e5922020-06-19 10:35:03 -07001011 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1012 payloads.push_back(payload0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001013
dschinazi1c6e5922020-06-19 10:35:03 -07001014 std::unique_ptr<SerializedPacket> encrypted(
1015 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
1016 {
1017 InSequence s;
1018 EXPECT_CALL(framer_visitor_, OnPacket());
1019 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1020 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1021 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1022 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1023 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1024 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1025 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001026 }
dschinazi1c6e5922020-06-19 10:35:03 -07001027 server_framer_.ProcessPacket(QuicEncryptedPacket(
1028 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001029}
1030
1031TEST_P(QuicPacketCreatorTest,
1032 SerializePathResponseProbePacket1PayloadUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001033 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001034 return;
1035 }
1036 QuicPathFrameBuffer payload0 = {
1037 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1038
dschinazi1c6e5922020-06-19 10:35:03 -07001039 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001040
dschinazi1c6e5922020-06-19 10:35:03 -07001041 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1042 payloads.push_back(payload0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001043
dschinazi1c6e5922020-06-19 10:35:03 -07001044 std::unique_ptr<SerializedPacket> encrypted(
1045 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
1046 {
1047 InSequence s;
1048 EXPECT_CALL(framer_visitor_, OnPacket());
1049 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1050 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1051 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1052 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1053 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1054 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001055 }
dschinazi1c6e5922020-06-19 10:35:03 -07001056 server_framer_.ProcessPacket(QuicEncryptedPacket(
1057 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001058}
1059
1060TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001061 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001062 return;
1063 }
1064 QuicPathFrameBuffer payload0 = {
1065 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1066 QuicPathFrameBuffer payload1 = {
1067 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1068
dschinazi1c6e5922020-06-19 10:35:03 -07001069 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001070
dschinazi1c6e5922020-06-19 10:35:03 -07001071 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1072 payloads.push_back(payload0);
1073 payloads.push_back(payload1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001074
dschinazi1c6e5922020-06-19 10:35:03 -07001075 std::unique_ptr<SerializedPacket> encrypted(
1076 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
1077 {
1078 InSequence s;
1079 EXPECT_CALL(framer_visitor_, OnPacket());
1080 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1081 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1082 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1083 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1084 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1085 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1086 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001087 }
dschinazi1c6e5922020-06-19 10:35:03 -07001088 server_framer_.ProcessPacket(QuicEncryptedPacket(
1089 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001090}
1091
1092TEST_P(QuicPacketCreatorTest,
1093 SerializePathResponseProbePacket2PayloadsUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001094 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001095 return;
1096 }
1097 QuicPathFrameBuffer payload0 = {
1098 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1099 QuicPathFrameBuffer payload1 = {
1100 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1101
dschinazi1c6e5922020-06-19 10:35:03 -07001102 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001103
dschinazi1c6e5922020-06-19 10:35:03 -07001104 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1105 payloads.push_back(payload0);
1106 payloads.push_back(payload1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001107
dschinazi1c6e5922020-06-19 10:35:03 -07001108 std::unique_ptr<SerializedPacket> encrypted(
1109 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
1110 {
1111 InSequence s;
1112 EXPECT_CALL(framer_visitor_, OnPacket());
1113 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1114 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1115 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1116 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1117 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1118 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001119 }
dschinazi1c6e5922020-06-19 10:35:03 -07001120 server_framer_.ProcessPacket(QuicEncryptedPacket(
1121 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001122}
1123
1124TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001125 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001126 return;
1127 }
1128 QuicPathFrameBuffer payload0 = {
1129 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1130 QuicPathFrameBuffer payload1 = {
1131 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1132 QuicPathFrameBuffer payload2 = {
1133 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1134
dschinazi1c6e5922020-06-19 10:35:03 -07001135 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001136
dschinazi1c6e5922020-06-19 10:35:03 -07001137 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1138 payloads.push_back(payload0);
1139 payloads.push_back(payload1);
1140 payloads.push_back(payload2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001141
dschinazi1c6e5922020-06-19 10:35:03 -07001142 std::unique_ptr<SerializedPacket> encrypted(
1143 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
1144 {
1145 InSequence s;
1146 EXPECT_CALL(framer_visitor_, OnPacket());
1147 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1148 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1149 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1150 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1151 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1152 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1153 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001154 }
dschinazi1c6e5922020-06-19 10:35:03 -07001155 server_framer_.ProcessPacket(QuicEncryptedPacket(
1156 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001157}
1158
1159TEST_P(QuicPacketCreatorTest,
1160 SerializePathResponseProbePacket3PayloadsUnpadded) {
renjietang4c704c82019-10-07 16:39:11 -07001161 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001162 return;
1163 }
1164 QuicPathFrameBuffer payload0 = {
1165 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1166 QuicPathFrameBuffer payload1 = {
1167 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1168 QuicPathFrameBuffer payload2 = {
1169 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1170
dschinazi1c6e5922020-06-19 10:35:03 -07001171 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001172
dschinazi1c6e5922020-06-19 10:35:03 -07001173 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1174 payloads.push_back(payload0);
1175 payloads.push_back(payload1);
1176 payloads.push_back(payload2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001177
dschinazi1c6e5922020-06-19 10:35:03 -07001178 std::unique_ptr<SerializedPacket> encrypted(
1179 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
1180 InSequence s;
1181 EXPECT_CALL(framer_visitor_, OnPacket());
1182 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1183 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1184 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1185 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1186 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1187 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001188
dschinazi1c6e5922020-06-19 10:35:03 -07001189 server_framer_.ProcessPacket(QuicEncryptedPacket(
1190 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001191}
1192
1193TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
renjietang4c704c82019-10-07 16:39:11 -07001194 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001195 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001196 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1197 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1198 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1199 } else {
1200 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1201 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1202 }
1203
1204 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1205 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1206 10000 / kDefaultMaxPacketSize);
1207 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1208 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1209
1210 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1211 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1212 10000 / kDefaultMaxPacketSize);
1213 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1214 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1215
1216 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1217 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1218 10000 / kDefaultMaxPacketSize);
1219 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1220 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1221
1222 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1223 UINT64_C(64) * 256 * 256 * 256 * 256);
1224 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1225 10000 / kDefaultMaxPacketSize);
1226 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1227 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1228}
1229
1230TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1231 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001232 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001233 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001234 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1235 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1236 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1237 } else {
1238 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1239 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1240 }
1241
1242 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1243 10000 / kDefaultMaxPacketSize);
1244 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1245 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1246
1247 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1248 10000 * 256 / kDefaultMaxPacketSize);
1249 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1250 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1251
1252 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1253 10000 * 256 * 256 / kDefaultMaxPacketSize);
1254 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1255 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1256
1257 creator_.UpdatePacketNumberLength(
1258 QuicPacketNumber(1),
1259 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1260 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1261 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1262}
1263
fayang4c1c2362019-09-13 07:20:01 -07001264TEST_P(QuicPacketCreatorTest, SkipNPacketNumbers) {
1265 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001266 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang4c1c2362019-09-13 07:20:01 -07001267 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1268 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1269 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1270 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1271 } else {
1272 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1273 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1274 }
1275 creator_.SkipNPacketNumbers(63, QuicPacketNumber(2),
1276 10000 / kDefaultMaxPacketSize);
1277 EXPECT_EQ(QuicPacketNumber(64), creator_.packet_number());
1278 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1279 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1280
1281 creator_.SkipNPacketNumbers(64 * 255, QuicPacketNumber(2),
1282 10000 / kDefaultMaxPacketSize);
1283 EXPECT_EQ(QuicPacketNumber(64 * 256), creator_.packet_number());
1284 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1285 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1286
1287 creator_.SkipNPacketNumbers(64 * 256 * 255, QuicPacketNumber(2),
1288 10000 / kDefaultMaxPacketSize);
1289 EXPECT_EQ(QuicPacketNumber(64 * 256 * 256), creator_.packet_number());
1290 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1291 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1292}
1293
QUICHE teama6ef0a62019-03-07 20:34:33 -05001294TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1295 if (!GetParam().version_serialization) {
1296 creator_.StopSendingVersion();
1297 }
nharper55fa6132019-05-07 19:37:21 -07001298 std::string data("test data");
1299 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1300 QuicStreamFrame stream_frame(
1301 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001302 /*fin=*/false, 0u, quiche::QuicheStringPiece());
nharper55fa6132019-05-07 19:37:21 -07001303 frames_.push_back(QuicFrame(stream_frame));
1304 } else {
1305 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1306 frames_.push_back(
1307 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1308 }
1309 SerializedPacket serialized = SerializeAllFrames(frames_);
1310
1311 QuicPacketHeader header;
1312 {
1313 InSequence s;
1314 EXPECT_CALL(framer_visitor_, OnPacket());
1315 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1316 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1317 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1318 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1319 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1320 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1321 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1322 } else {
1323 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1324 }
1325 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1326 }
1327 ProcessPacket(serialized);
1328 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
nharper55fa6132019-05-07 19:37:21 -07001329}
1330
1331TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
1332 if (!GetParam().version_serialization) {
1333 creator_.StopSendingVersion();
1334 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001335 std::string data("a");
1336 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1337 QuicStreamFrame stream_frame(
1338 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001339 /*fin=*/false, 0u, quiche::QuicheStringPiece());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001340 frames_.push_back(QuicFrame(stream_frame));
1341 } else {
1342 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1343 frames_.push_back(
1344 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1345 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001346 SerializedPacket serialized = SerializeAllFrames(frames_);
1347
1348 QuicPacketHeader header;
1349 {
1350 InSequence s;
1351 EXPECT_CALL(framer_visitor_, OnPacket());
1352 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1353 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1354 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1355 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1356 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001357 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1358 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1359 } else {
1360 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1361 }
nharper55fa6132019-05-07 19:37:21 -07001362 if (client_framer_.version().HasHeaderProtection()) {
1363 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1364 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001365 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1366 }
1367 ProcessPacket(serialized);
1368 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1369}
1370
1371TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1372 if (!GetParam().version_serialization) {
1373 creator_.StopSendingVersion();
1374 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001375 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001376 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001377 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001378 size_t payload_length = creator_.max_packet_length();
1379 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001380 MakeIOVector(too_long_payload, &iov_);
1381 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1382 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001383 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1384 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001385 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1386 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
1387 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001388 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001389 // The entire payload could not be consumed.
1390 EXPECT_GT(payload_length, consumed);
fayang62b637b2019-09-16 08:40:49 -07001391 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001392 DeleteSerializedPacket();
1393}
1394
1395TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1396 if (!GetParam().version_serialization) {
1397 creator_.StopSendingVersion();
1398 }
1399 const size_t max_plaintext_size =
1400 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1401 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001402 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1403 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1404 client_framer_.transport_version(), Perspective::IS_CLIENT);
1405 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1406 stream_id =
1407 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1408 }
1409 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001410 EXPECT_EQ(max_plaintext_size -
1411 GetPacketHeaderSize(
1412 client_framer_.transport_version(),
1413 creator_.GetDestinationConnectionIdLength(),
1414 creator_.GetSourceConnectionIdLength(),
1415 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1416 !kIncludeDiversificationNonce,
1417 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1418 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1419 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1420 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001421 StrictMock<MockDebugDelegate> debug;
1422 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001423
1424 // Add a variety of frame types and then a padding frame.
1425 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001426 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
renjietangb63005e2019-11-19 23:08:53 -08001427 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001428 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001429 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001430
1431 QuicFrame frame;
1432 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001433 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
fayang62b637b2019-09-16 08:40:49 -07001434 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1435 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1436 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001437 size_t consumed = frame.stream_frame.data_length;
1438 EXPECT_EQ(4u, consumed);
1439 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001440 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001441
1442 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001443 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
renjietangb63005e2019-11-19 23:08:53 -08001444 EXPECT_TRUE(creator_.AddFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001445 EXPECT_TRUE(creator_.HasPendingFrames());
1446 EXPECT_EQ(0u, creator_.BytesFree());
1447
1448 // Packet is full. Creator will flush.
1449 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1450 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
renjietangb63005e2019-11-19 23:08:53 -08001451 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001452
1453 // Ensure the packet is successfully created.
wub8a5dafa2020-05-13 12:30:17 -07001454 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1455 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
1456 const QuicFrames& retransmittable =
1457 serialized_packet_->retransmittable_frames;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001458 ASSERT_EQ(1u, retransmittable.size());
1459 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
wub8a5dafa2020-05-13 12:30:17 -07001460 EXPECT_TRUE(serialized_packet_->has_ack);
1461 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_->largest_acked);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001462 DeleteSerializedPacket();
1463
1464 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001465 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001466 EXPECT_EQ(max_plaintext_size -
1467 GetPacketHeaderSize(
1468 client_framer_.transport_version(),
1469 creator_.GetDestinationConnectionIdLength(),
1470 creator_.GetSourceConnectionIdLength(),
1471 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1472 !kIncludeDiversificationNonce,
1473 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1474 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1475 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1476 creator_.BytesFree());
1477}
1478
1479TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
dschinazi1c6e5922020-06-19 10:35:03 -07001480 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001481 if (!GetParam().version_serialization) {
1482 creator_.StopSendingVersion();
1483 }
1484 EXPECT_FALSE(creator_.HasPendingFrames());
1485
1486 MakeIOVector("test", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001487 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1488 iov_.iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001489 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1490 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1491 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001492 StrictMock<MockDebugDelegate> debug;
1493 creator_.set_debug_delegate(&debug);
1494 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001495 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001496 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1497 NOT_RETRANSMISSION, &num_bytes_consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001498 EXPECT_EQ(4u, num_bytes_consumed);
1499
1500 // Ensure the packet is successfully created.
wub8a5dafa2020-05-13 12:30:17 -07001501 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1502 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
1503 const QuicFrames& retransmittable =
1504 serialized_packet_->retransmittable_frames;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001505 ASSERT_EQ(1u, retransmittable.size());
1506 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1507 DeleteSerializedPacket();
1508
1509 EXPECT_FALSE(creator_.HasPendingFrames());
1510}
1511
nharperebabffd2019-06-03 17:34:45 -07001512TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1513 // Regression test to check that CreateAndSerializeStreamFrame uses a
1514 // correctly formatted stream frame header when appending padding.
1515
dschinazi1c6e5922020-06-19 10:35:03 -07001516 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
nharperebabffd2019-06-03 17:34:45 -07001517 if (!GetParam().version_serialization) {
1518 creator_.StopSendingVersion();
1519 }
1520 EXPECT_FALSE(creator_.HasPendingFrames());
1521
1522 // Send one byte of stream data.
1523 MakeIOVector("a", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001524 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1525 iov_.iov_len);
nharperebabffd2019-06-03 17:34:45 -07001526 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1527 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1528 size_t num_bytes_consumed;
1529 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001530 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1531 NOT_RETRANSMISSION, &num_bytes_consumed);
nharperebabffd2019-06-03 17:34:45 -07001532 EXPECT_EQ(1u, num_bytes_consumed);
1533
1534 // Check that a packet is created.
wub8a5dafa2020-05-13 12:30:17 -07001535 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1536 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
nharperebabffd2019-06-03 17:34:45 -07001537 {
1538 InSequence s;
1539 EXPECT_CALL(framer_visitor_, OnPacket());
1540 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1541 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1542 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1543 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1544 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1545 if (client_framer_.version().HasHeaderProtection()) {
1546 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1547 }
1548 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1549 }
wub8a5dafa2020-05-13 12:30:17 -07001550 ProcessPacket(*serialized_packet_);
nharperebabffd2019-06-03 17:34:45 -07001551}
1552
QUICHE teama6ef0a62019-03-07 20:34:33 -05001553TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1554 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1555 if (!IsDefaultTestConfiguration()) {
1556 return;
1557 }
1558
QUICHE team6987b4a2019-03-15 16:23:04 -07001559 creator_.set_encryption_level(ENCRYPTION_INITIAL);
fkastenholz85f18902019-05-28 12:47:00 -07001560 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001561 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001562 /*fin=*/false, 0u, quiche::QuicheStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001563 EXPECT_QUIC_BUG(
renjietangb63005e2019-11-19 23:08:53 -08001564 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001565 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1566}
1567
1568TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1569 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1570 if (!IsDefaultTestConfiguration()) {
1571 return;
1572 }
1573
1574 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
fkastenholz85f18902019-05-28 12:47:00 -07001575 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001576 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001577 /*fin=*/false, 0u, quiche::QuicheStringPiece());
fayang49523232019-05-03 06:28:22 -07001578 EXPECT_QUIC_BUG(
renjietangb63005e2019-11-19 23:08:53 -08001579 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001580 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001581}
1582
1583TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1584 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1585 if (!IsDefaultTestConfiguration()) {
1586 return;
1587 }
1588
QUICHE teamdc41bf12019-03-20 12:58:42 -07001589 // This test only matters when the crypto handshake is sent in stream frames.
1590 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1591 // frames.
1592 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1593 return;
1594 }
1595
QUICHE teama6ef0a62019-03-07 20:34:33 -05001596 CryptoHandshakeMessage message;
1597 message.set_tag(kCHLO);
dschinazi66dea072019-04-09 11:41:06 -07001598 message.set_minimum_size(kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001599 CryptoFramer framer;
1600 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001601 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001602
1603 struct iovec iov;
dmcardlecf0bfcf2019-12-13 08:08:21 -08001604 MakeIOVector(
1605 quiche::QuicheStringPiece(message_data->data(), message_data->length()),
1606 &iov);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001607 QuicFrame frame;
fkastenholz85f18902019-05-28 12:47:00 -07001608 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
fayang62b637b2019-09-16 08:40:49 -07001609 EXPECT_QUIC_BUG(
1610 creator_.ConsumeDataToFillCurrentPacket(
1611 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1612 &iov, 1u, iov.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION,
1613 &frame),
1614 "Client hello won't fit in a single packet.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001615}
1616
1617TEST_P(QuicPacketCreatorTest, PendingPadding) {
1618 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1619 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1620 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1621
1622 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1623 .WillRepeatedly(
1624 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1625 // Flush all paddings.
1626 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001627 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001628 {
1629 InSequence s;
1630 EXPECT_CALL(framer_visitor_, OnPacket());
1631 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1632 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1633 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1634 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1635 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1636 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1637 }
1638 // Packet only contains padding.
wub8a5dafa2020-05-13 12:30:17 -07001639 ProcessPacket(*serialized_packet_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001640 }
1641 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1642}
1643
1644TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001645 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001646 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1647 QuicFrame frame;
1648 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001649 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1650 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001651 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001652 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001653 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1654 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1655 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001656 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001657 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1658}
1659
QUICHE teama6ef0a62019-03-07 20:34:33 -05001660TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001661 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001662 const QuicByteCount kStreamFramePayloadSize = 100u;
1663 // Set the packet size be enough for one stream frame with 0 stream offset +
1664 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001665 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1666 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001667 size_t length =
1668 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1669 GetEncryptionOverhead() +
1670 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001671 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001672 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1673 kStreamFramePayloadSize + 1;
1674 creator_.SetMaxPacketLength(length);
1675 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1676 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1677 QuicFrame frame;
1678 char buf[kStreamFramePayloadSize + 1] = {};
1679 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1680 .WillRepeatedly(
1681 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1682 // Send stream frame of size kStreamFramePayloadSize.
dmcardlecf0bfcf2019-12-13 08:08:21 -08001683 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001684 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1685 0u, 0u, false, false,
1686 NOT_RETRANSMISSION, &frame);
1687 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001688 // 1 byte padding is sent.
1689 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1690 // Send stream frame of size kStreamFramePayloadSize + 1.
dmcardlecf0bfcf2019-12-13 08:08:21 -08001691 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize + 1),
1692 &iov_);
fayang62b637b2019-09-16 08:40:49 -07001693 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1694 0u, kStreamFramePayloadSize, false,
1695 false, NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001696 // No padding is sent.
fayang62b637b2019-09-16 08:40:49 -07001697 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001698 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1699 // Flush all paddings.
1700 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001701 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001702 }
1703 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1704}
1705
1706TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001707 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
wub50d4c712020-05-19 15:48:28 -07001708 char* buffer = new char[kMaxOutgoingPacketSize];
1709 QuicPacketBuffer external_buffer = {buffer,
1710 [](const char* p) { delete[] p; }};
1711 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(external_buffer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001712
1713 QuicFrame frame;
1714 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001715 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1716 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001717 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001718 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001719 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1720
1721 EXPECT_CALL(delegate_, OnSerializedPacket(_))
wub50d4c712020-05-19 15:48:28 -07001722 .WillOnce(Invoke([&external_buffer](SerializedPacket serialized_packet) {
1723 EXPECT_EQ(external_buffer.buffer, serialized_packet.encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001724 }));
fayang62b637b2019-09-16 08:40:49 -07001725 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001726}
1727
1728// Test for error found in
1729// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1730// length that crosses an IETF VarInt length boundary would cause a
1731// failure. While this test is not applicable to versions other than version 99,
1732// it should still work. Hence, it is not made version-specific.
1733TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1734 QuicAckFrame ack_frame =
1735 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1736 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1737 frames_.push_back(QuicFrame(&ack_frame));
1738 SerializeAllFrames(frames_);
1739}
1740
1741TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
fayangd4291e42019-05-30 10:31:21 -07001742 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001743 return;
1744 }
dschinazied459c02020-05-07 16:12:23 -07001745 if (client_framer_.version().UsesTls()) {
1746 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1747 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001748 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001749 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1750 .Times(3)
1751 .WillRepeatedly(
1752 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1753 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1754 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001755 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1756 creator_.GetCurrentLargestMessagePayload()));
1757 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001758 QuicMessageFrame* message_frame =
1759 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
renjietangb63005e2019-11-19 23:08:53 -08001760 EXPECT_TRUE(creator_.AddFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001761 EXPECT_TRUE(creator_.HasPendingFrames());
fayang62b637b2019-09-16 08:40:49 -07001762 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001763
wub553a9662019-03-28 20:13:23 -07001764 QuicMessageFrame* frame2 =
1765 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001766 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001767 EXPECT_TRUE(creator_.HasPendingFrames());
1768 // Verify if a new frame is added, 1 byte message length will be added.
1769 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001770 QuicMessageFrame* frame3 =
1771 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001772 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001773 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
fayang62b637b2019-09-16 08:40:49 -07001774 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001775
1776 QuicFrame frame;
1777 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001778 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1779 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001780 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1781 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1782 NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001783 QuicMessageFrame* frame4 =
1784 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001785 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001786 EXPECT_TRUE(creator_.HasPendingFrames());
1787 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001788 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1789 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001790 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001791 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
renjietangb63005e2019-11-19 23:08:53 -08001792 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001793 EXPECT_FALSE(creator_.HasPendingFrames());
1794}
1795
1796TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
fayangd4291e42019-05-30 10:31:21 -07001797 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001798 return;
1799 }
dschinazied459c02020-05-07 16:12:23 -07001800 if (client_framer_.version().UsesTls()) {
1801 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1802 }
vasilvvc48c8712019-03-11 13:38:16 -07001803 std::string message_data(kDefaultMaxPacketSize, 'a');
dmcardlecf0bfcf2019-12-13 08:08:21 -08001804 quiche::QuicheStringPiece message_buffer(message_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001805 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001806 // Test all possible encryption levels of message frames.
1807 for (EncryptionLevel level :
1808 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1809 creator_.set_encryption_level(level);
1810 // Test all possible sizes of message frames.
1811 for (size_t message_size = 0;
1812 message_size <= creator_.GetCurrentLargestMessagePayload();
1813 ++message_size) {
1814 QuicMessageFrame* frame = new QuicMessageFrame(
dmcardlecf0bfcf2019-12-13 08:08:21 -08001815 0, MakeSpan(
1816 &allocator_,
1817 quiche::QuicheStringPiece(message_buffer.data(), message_size),
1818 &storage));
renjietangb63005e2019-11-19 23:08:53 -08001819 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame), NOT_RETRANSMISSION));
ianswettb239f862019-04-05 09:15:06 -07001820 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001821
ianswettb239f862019-04-05 09:15:06 -07001822 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1823 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1824 // Verify BytesFree returns bytes available for the next frame, which
1825 // should subtract the message length.
1826 size_t expected_bytes_free =
1827 creator_.GetCurrentLargestMessagePayload() - message_size <
1828 expansion_bytes
1829 ? 0
1830 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1831 message_size;
1832 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1833 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1834 creator_.GetCurrentLargestMessagePayload());
1835 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1836 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001837 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -07001838 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
ianswettb239f862019-04-05 09:15:06 -07001839 DeleteSerializedPacket();
1840 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001841 }
1842}
1843
nharperd43f1d62019-07-01 15:18:20 -07001844TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
dschinazied459c02020-05-07 16:12:23 -07001845 ParsedQuicVersion version = GetParam().version;
1846 if (!version.SupportsMessageFrames()) {
nharperd43f1d62019-07-01 15:18:20 -07001847 return;
1848 }
dschinazied459c02020-05-07 16:12:23 -07001849 if (version.UsesTls()) {
1850 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1851 }
nharperd43f1d62019-07-01 15:18:20 -07001852 QuicPacketLength expected_largest_payload = 1319;
dschinazied459c02020-05-07 16:12:23 -07001853 if (version.HasLongHeaderLengths()) {
nharperd43f1d62019-07-01 15:18:20 -07001854 expected_largest_payload -= 2;
1855 }
dschinazied459c02020-05-07 16:12:23 -07001856 if (version.HasLengthPrefixedConnectionIds()) {
dschinazi48ac9192019-07-31 00:07:26 -07001857 expected_largest_payload -= 1;
1858 }
nharperd43f1d62019-07-01 15:18:20 -07001859 EXPECT_EQ(expected_largest_payload,
1860 creator_.GetGuaranteedLargestMessagePayload());
dschinazied459c02020-05-07 16:12:23 -07001861 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1862 creator_.GetGuaranteedLargestMessagePayload()));
1863
1864 // Now test whether SetMaxDatagramFrameSize works.
1865 creator_.SetMaxDatagramFrameSize(expected_largest_payload + 1 +
1866 kQuicFrameTypeSize);
1867 EXPECT_EQ(expected_largest_payload,
1868 creator_.GetGuaranteedLargestMessagePayload());
1869 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1870 creator_.GetGuaranteedLargestMessagePayload()));
1871
1872 creator_.SetMaxDatagramFrameSize(expected_largest_payload +
1873 kQuicFrameTypeSize);
1874 EXPECT_EQ(expected_largest_payload,
1875 creator_.GetGuaranteedLargestMessagePayload());
1876 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1877 creator_.GetGuaranteedLargestMessagePayload()));
1878
1879 creator_.SetMaxDatagramFrameSize(expected_largest_payload - 1 +
1880 kQuicFrameTypeSize);
1881 EXPECT_EQ(expected_largest_payload - 1,
1882 creator_.GetGuaranteedLargestMessagePayload());
1883 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1884 creator_.GetGuaranteedLargestMessagePayload()));
1885
1886 constexpr QuicPacketLength kFrameSizeLimit = 1000;
1887 constexpr QuicPacketLength kPayloadSizeLimit =
1888 kFrameSizeLimit - kQuicFrameTypeSize;
1889 creator_.SetMaxDatagramFrameSize(kFrameSizeLimit);
1890 EXPECT_EQ(creator_.GetGuaranteedLargestMessagePayload(), kPayloadSizeLimit);
1891 EXPECT_TRUE(creator_.HasRoomForMessageFrame(kPayloadSizeLimit));
1892 EXPECT_FALSE(creator_.HasRoomForMessageFrame(kPayloadSizeLimit + 1));
1893}
1894
1895TEST_P(QuicPacketCreatorTest, GetCurrentLargestMessagePayload) {
1896 ParsedQuicVersion version = GetParam().version;
1897 if (!version.SupportsMessageFrames()) {
1898 return;
1899 }
1900 if (version.UsesTls()) {
1901 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1902 }
1903 QuicPacketLength expected_largest_payload = 1319;
1904 if (version.SendsVariableLengthPacketNumberInLongHeader()) {
1905 expected_largest_payload += 3;
1906 }
1907 if (version.HasLongHeaderLengths()) {
1908 expected_largest_payload -= 2;
1909 }
1910 if (version.HasLengthPrefixedConnectionIds()) {
1911 expected_largest_payload -= 1;
1912 }
1913 EXPECT_EQ(expected_largest_payload,
1914 creator_.GetCurrentLargestMessagePayload());
1915
1916 // Now test whether SetMaxDatagramFrameSize works.
1917 creator_.SetMaxDatagramFrameSize(expected_largest_payload + 1 +
1918 kQuicFrameTypeSize);
1919 EXPECT_EQ(expected_largest_payload,
1920 creator_.GetCurrentLargestMessagePayload());
1921
1922 creator_.SetMaxDatagramFrameSize(expected_largest_payload +
1923 kQuicFrameTypeSize);
1924 EXPECT_EQ(expected_largest_payload,
1925 creator_.GetCurrentLargestMessagePayload());
1926
1927 creator_.SetMaxDatagramFrameSize(expected_largest_payload - 1 +
1928 kQuicFrameTypeSize);
1929 EXPECT_EQ(expected_largest_payload - 1,
1930 creator_.GetCurrentLargestMessagePayload());
nharperd43f1d62019-07-01 15:18:20 -07001931}
1932
QUICHE teama6ef0a62019-03-07 20:34:33 -05001933TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001934 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001935
1936 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1937 QuicFrame ack_frame(&temp_ack_frame);
1938 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1939
QUICHE teamdc41bf12019-03-20 12:58:42 -07001940 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1941 client_framer_.transport_version(), Perspective::IS_CLIENT);
1942 QuicFrame stream_frame(QuicStreamFrame(stream_id,
dmcardlecf0bfcf2019-12-13 08:08:21 -08001943 /*fin=*/false, 0u,
1944 quiche::QuicheStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001945 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1946
1947 QuicFrame padding_frame{QuicPaddingFrame()};
1948 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1949
1950 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1951 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1952
renjietangb63005e2019-11-19 23:08:53 -08001953 EXPECT_TRUE(creator_.AddFrame(ack_frame, LOSS_RETRANSMISSION));
wub8a5dafa2020-05-13 12:30:17 -07001954 ASSERT_EQ(serialized_packet_, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001955
renjietangb63005e2019-11-19 23:08:53 -08001956 EXPECT_TRUE(creator_.AddFrame(stream_frame, RTO_RETRANSMISSION));
wub8a5dafa2020-05-13 12:30:17 -07001957 ASSERT_EQ(serialized_packet_, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001958
renjietangb63005e2019-11-19 23:08:53 -08001959 EXPECT_TRUE(creator_.AddFrame(padding_frame, TLP_RETRANSMISSION));
fayang62b637b2019-09-16 08:40:49 -07001960 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -07001961 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001962
fayangcff885a2019-10-22 07:39:04 -07001963 // The last retransmittable frame on packet is a stream frame, the packet's
1964 // transmission type should be the same as the stream frame's.
wub8a5dafa2020-05-13 12:30:17 -07001965 EXPECT_EQ(serialized_packet_->transmission_type, RTO_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001966 DeleteSerializedPacket();
1967}
1968
1969TEST_P(QuicPacketCreatorTest, RetryToken) {
1970 if (!GetParam().version_serialization ||
1971 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1972 return;
1973 }
1974
1975 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1976 9, 10, 11, 12, 13, 14, 15, 16};
1977
1978 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001979 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001980
QUICHE teamdc41bf12019-03-20 12:58:42 -07001981 std::string data("a");
1982 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1983 QuicStreamFrame stream_frame(
1984 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001985 /*fin=*/false, 0u, quiche::QuicheStringPiece());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001986 frames_.push_back(QuicFrame(stream_frame));
1987 } else {
1988 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1989 frames_.push_back(
1990 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1991 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001992 SerializedPacket serialized = SerializeAllFrames(frames_);
1993
1994 QuicPacketHeader header;
1995 {
1996 InSequence s;
1997 EXPECT_CALL(framer_visitor_, OnPacket());
1998 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1999 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2000 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2001 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
2002 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07002003 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
2004 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
2005 } else {
2006 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2007 }
nharper55fa6132019-05-07 19:37:21 -07002008 if (client_framer_.version().HasHeaderProtection()) {
2009 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2010 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002011 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2012 }
2013 ProcessPacket(serialized);
2014 ASSERT_TRUE(header.version_flag);
2015 ASSERT_EQ(header.long_packet_type, INITIAL);
2016 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
dmcardle8f7df532020-01-07 13:28:57 -08002017 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05002018 "retry token", header.retry_token.data(), header.retry_token.length(),
2019 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002020}
2021
QUICHE team2252b702019-05-14 23:55:14 -04002022TEST_P(QuicPacketCreatorTest, GetConnectionId) {
QUICHE team2252b702019-05-14 23:55:14 -04002023 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
2024 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
2025}
2026
dschinazi346b7ce2019-06-05 01:38:18 -07002027TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
dschinazi346b7ce2019-06-05 01:38:18 -07002028 if (!client_framer_.version().SupportsClientConnectionIds()) {
2029 return;
2030 }
2031 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
2032 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
2033 creator_.SetClientConnectionId(TestConnectionId(0x33));
2034 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
2035 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
2036}
2037
renjietangdbe98342019-10-18 11:00:57 -07002038TEST_P(QuicPacketCreatorTest, CoalesceStreamFrames) {
2039 InSequence s;
2040 if (!GetParam().version_serialization) {
2041 creator_.StopSendingVersion();
2042 }
renjietangdbe98342019-10-18 11:00:57 -07002043 const size_t max_plaintext_size =
2044 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
2045 EXPECT_FALSE(creator_.HasPendingFrames());
2046 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2047 QuicStreamId stream_id1 = QuicUtils::GetFirstBidirectionalStreamId(
2048 client_framer_.transport_version(), Perspective::IS_CLIENT);
2049 QuicStreamId stream_id2 = GetNthClientInitiatedStreamId(1);
2050 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2051 EXPECT_EQ(max_plaintext_size -
2052 GetPacketHeaderSize(
2053 client_framer_.transport_version(),
2054 creator_.GetDestinationConnectionIdLength(),
2055 creator_.GetSourceConnectionIdLength(),
2056 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2057 !kIncludeDiversificationNonce,
2058 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2059 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
2060 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
2061 creator_.BytesFree());
2062 StrictMock<MockDebugDelegate> debug;
2063 creator_.set_debug_delegate(&debug);
2064
2065 MakeIOVector("test", &iov_);
2066 QuicFrame frame;
2067 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2068 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2069 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2070 NOT_RETRANSMISSION, &frame));
2071 EXPECT_TRUE(creator_.HasPendingFrames());
2072 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2073
2074 MakeIOVector("coalesce", &iov_);
2075 // frame will be coalesced with the first frame.
2076 const auto previous_size = creator_.PacketSize();
renjietang2a6ba792019-10-22 10:44:58 -07002077 QuicStreamFrame target(stream_id1, true, 0, 12);
2078 EXPECT_CALL(debug, OnStreamFrameCoalesced(target));
renjietangdbe98342019-10-18 11:00:57 -07002079 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2080 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 4u, true, false,
2081 NOT_RETRANSMISSION, &frame));
2082 EXPECT_EQ(frame.stream_frame.data_length,
2083 creator_.PacketSize() - previous_size);
renjietangdbe98342019-10-18 11:00:57 -07002084
2085 // frame is for another stream, so it won't be coalesced.
2086 const auto length = creator_.BytesFree() - 10u;
renjietang7f46be32019-10-21 16:55:17 -07002087 std::string large_data(length, 'x');
renjietangdbe98342019-10-18 11:00:57 -07002088 MakeIOVector(large_data, &iov_);
2089 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2090 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2091 stream_id2, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2092 NOT_RETRANSMISSION, &frame));
2093 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id2));
2094
2095 // The packet doesn't have enough free bytes for all data, but will still be
2096 // able to consume and coalesce part of them.
2097 EXPECT_CALL(debug, OnStreamFrameCoalesced(_));
2098 MakeIOVector("somerandomdata", &iov_);
2099 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2100 stream_id2, &iov_, 1u, iov_.iov_len, 0u, length, false, false,
2101 NOT_RETRANSMISSION, &frame));
2102
2103 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2104 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2105 creator_.FlushCurrentPacket();
2106 EXPECT_CALL(framer_visitor_, OnPacket());
2107 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2108 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2109 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2110 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2111 // The packet should only have 2 stream frames.
2112 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2113 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2114 EXPECT_CALL(framer_visitor_, OnPacketComplete());
wub8a5dafa2020-05-13 12:30:17 -07002115 ProcessPacket(*serialized_packet_);
renjietangdbe98342019-10-18 11:00:57 -07002116}
2117
fayang51152fd2019-10-21 06:48:09 -07002118TEST_P(QuicPacketCreatorTest, SaveNonRetransmittableFrames) {
fayang51152fd2019-10-21 06:48:09 -07002119 QuicAckFrame ack_frame(InitAckFrame(1));
2120 frames_.push_back(QuicFrame(&ack_frame));
2121 frames_.push_back(QuicFrame(QuicPaddingFrame(-1)));
2122 SerializedPacket serialized = SerializeAllFrames(frames_);
2123 ASSERT_EQ(2u, serialized.nonretransmittable_frames.size());
2124 EXPECT_EQ(ACK_FRAME, serialized.nonretransmittable_frames[0].type);
2125 EXPECT_EQ(PADDING_FRAME, serialized.nonretransmittable_frames[1].type);
fayangeb268412019-10-21 14:05:38 -07002126 // Verify full padding frame is translated to a padding frame with actual
2127 // bytes of padding.
2128 EXPECT_LT(
2129 0,
2130 serialized.nonretransmittable_frames[1].padding_frame.num_padding_bytes);
fayang51152fd2019-10-21 06:48:09 -07002131 frames_.clear();
2132
2133 // Serialize another packet with the same frames.
2134 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
2135 &creator_, serialized.nonretransmittable_frames, buffer_,
2136 kMaxOutgoingPacketSize);
2137 // Verify the packet length of both packets are equal.
2138 EXPECT_EQ(serialized.encrypted_length, packet.encrypted_length);
2139}
2140
fayang08750832019-10-24 11:25:34 -07002141TEST_P(QuicPacketCreatorTest, SerializeCoalescedPacket) {
fayang08750832019-10-24 11:25:34 -07002142 QuicCoalescedPacket coalesced;
2143 SimpleBufferAllocator allocator;
2144 QuicSocketAddress self_address(QuicIpAddress::Loopback4(), 1);
2145 QuicSocketAddress peer_address(QuicIpAddress::Loopback4(), 2);
2146 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2147 EncryptionLevel level = static_cast<EncryptionLevel>(i);
2148 creator_.set_encryption_level(level);
2149 QuicAckFrame ack_frame(InitAckFrame(1));
2150 frames_.push_back(QuicFrame(&ack_frame));
2151 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
dmcardlecf0bfcf2019-12-13 08:08:21 -08002152 frames_.push_back(QuicFrame(
2153 QuicStreamFrame(1, false, 0u, quiche::QuicheStringPiece())));
fayang08750832019-10-24 11:25:34 -07002154 }
2155 SerializedPacket serialized = SerializeAllFrames(frames_);
2156 EXPECT_EQ(level, serialized.encryption_level);
2157 frames_.clear();
2158 ASSERT_TRUE(coalesced.MaybeCoalescePacket(serialized, self_address,
2159 peer_address, &allocator,
2160 creator_.max_packet_length()));
2161 }
2162 char buffer[kMaxOutgoingPacketSize];
2163 size_t coalesced_length = creator_.SerializeCoalescedPacket(
2164 coalesced, buffer, kMaxOutgoingPacketSize);
2165 // Verify packet is padded to full.
2166 ASSERT_EQ(coalesced.max_packet_length(), coalesced_length);
2167 if (!QuicVersionHasLongHeaderLengths(server_framer_.transport_version())) {
2168 return;
2169 }
2170 // Verify packet process.
2171 std::unique_ptr<QuicEncryptedPacket> packets[NUM_ENCRYPTION_LEVELS];
2172 packets[ENCRYPTION_INITIAL] =
bnc40d0fa52019-10-29 11:40:48 -07002173 std::make_unique<QuicEncryptedPacket>(buffer, coalesced_length);
fayang08750832019-10-24 11:25:34 -07002174 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2175 InSequence s;
2176 EXPECT_CALL(framer_visitor_, OnPacket());
2177 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2178 if (i < ENCRYPTION_FORWARD_SECURE) {
2179 // Save coalesced packet.
2180 EXPECT_CALL(framer_visitor_, OnCoalescedPacket(_))
2181 .WillOnce(Invoke([i, &packets](const QuicEncryptedPacket& packet) {
2182 packets[i + 1] = packet.Clone();
2183 }));
2184 }
2185 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2186 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2187 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2188 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _)).WillOnce(Return(true));
2189 EXPECT_CALL(framer_visitor_,
2190 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
2191 .WillOnce(Return(true));
2192 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(_)).WillOnce(Return(true));
2193 if (i == ENCRYPTION_INITIAL) {
2194 // Verify padding is added.
2195 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2196 } else {
2197 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(testing::AtMost(1));
2198 }
2199 if (i != ENCRYPTION_INITIAL && i != ENCRYPTION_HANDSHAKE) {
2200 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2201 }
2202 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2203
2204 server_framer_.ProcessPacket(*packets[i]);
2205 }
2206}
2207
fayang2ab1e852019-11-04 11:24:36 -08002208TEST_P(QuicPacketCreatorTest, SoftMaxPacketLength) {
2209 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2210 QuicByteCount previous_max_packet_length = creator_.max_packet_length();
2211 const size_t overhead =
2212 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2213 QuicPacketCreator::MinPlaintextPacketSize(client_framer_.version()) +
2214 GetEncryptionOverhead();
2215 // Make sure a length which cannot accommodate header (includes header
2216 // protection minimal length) gets rejected.
2217 creator_.SetSoftMaxPacketLength(overhead - 1);
2218 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2219
2220 creator_.SetSoftMaxPacketLength(overhead);
2221 EXPECT_EQ(overhead, creator_.max_packet_length());
2222
2223 // Verify creator has room for stream frame because max_packet_length_ gets
2224 // restored.
vasilvva57bbb32019-11-06 06:19:27 -08002225 ASSERT_TRUE(creator_.HasRoomForStreamFrame(
2226 GetNthClientInitiatedStreamId(1), kMaxIetfVarInt,
2227 std::numeric_limits<uint32_t>::max()));
fayang2ab1e852019-11-04 11:24:36 -08002228 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2229
2230 // Same for message frame.
2231 if (VersionSupportsMessageFrames(client_framer_.transport_version())) {
2232 creator_.SetSoftMaxPacketLength(overhead);
dschinazied459c02020-05-07 16:12:23 -07002233 if (client_framer_.version().UsesTls()) {
2234 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
2235 }
fayang2ab1e852019-11-04 11:24:36 -08002236 // Verify GetCurrentLargestMessagePayload is based on the actual
2237 // max_packet_length.
2238 EXPECT_LT(1u, creator_.GetCurrentLargestMessagePayload());
2239 EXPECT_EQ(overhead, creator_.max_packet_length());
2240 ASSERT_TRUE(creator_.HasRoomForMessageFrame(
2241 creator_.GetCurrentLargestMessagePayload()));
2242 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2243 }
2244
2245 // Verify creator can consume crypto data because max_packet_length_ gets
2246 // restored.
2247 creator_.SetSoftMaxPacketLength(overhead);
2248 EXPECT_EQ(overhead, creator_.max_packet_length());
2249 std::string data = "crypto data";
2250 MakeIOVector(data, &iov_);
2251 QuicFrame frame;
2252 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
2253 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2254 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
2255 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
2256 &frame));
2257 size_t bytes_consumed = frame.stream_frame.data_length;
2258 EXPECT_LT(0u, bytes_consumed);
2259 } else {
2260 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
2261 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
2262 ENCRYPTION_INITIAL, data.length(), kOffset,
2263 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
2264 size_t bytes_consumed = frame.crypto_frame->data_length;
2265 EXPECT_LT(0u, bytes_consumed);
2266 }
2267 EXPECT_TRUE(creator_.HasPendingFrames());
2268 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2269 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2270 creator_.FlushCurrentPacket();
2271
2272 // Verify ACK frame can be consumed.
2273 creator_.SetSoftMaxPacketLength(overhead);
2274 EXPECT_EQ(overhead, creator_.max_packet_length());
2275 QuicAckFrame ack_frame(InitAckFrame(10u));
renjietangb63005e2019-11-19 23:08:53 -08002276 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
fayang2ab1e852019-11-04 11:24:36 -08002277 EXPECT_TRUE(creator_.HasPendingFrames());
2278}
2279
fayang4245c212019-11-05 13:33:46 -08002280class MockDelegate : public QuicPacketCreator::DelegateInterface {
2281 public:
2282 MockDelegate() {}
2283 MockDelegate(const MockDelegate&) = delete;
2284 MockDelegate& operator=(const MockDelegate&) = delete;
2285 ~MockDelegate() override {}
2286
wub713afae2020-04-27 07:48:31 -07002287 MOCK_METHOD(bool,
2288 ShouldGeneratePacket,
2289 (HasRetransmittableData retransmittable, IsHandshake handshake),
2290 (override));
2291 MOCK_METHOD(const QuicFrames,
2292 MaybeBundleAckOpportunistically,
2293 (),
2294 (override));
wub50d4c712020-05-19 15:48:28 -07002295 MOCK_METHOD(QuicPacketBuffer, GetPacketBuffer, (), (override));
wub8a5dafa2020-05-13 12:30:17 -07002296 MOCK_METHOD(void, OnSerializedPacket, (SerializedPacket), (override));
wub713afae2020-04-27 07:48:31 -07002297 MOCK_METHOD(void,
2298 OnUnrecoverableError,
2299 (QuicErrorCode, const std::string&),
2300 (override));
fayang15042962020-07-01 12:14:29 -07002301 MOCK_METHOD(SerializedPacketFate,
2302 GetSerializedPacketFate,
2303 (bool, EncryptionLevel),
2304 (override));
fayang4245c212019-11-05 13:33:46 -08002305
2306 void SetCanWriteAnything() {
2307 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
2308 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2309 .WillRepeatedly(Return(true));
2310 }
2311
2312 void SetCanNotWrite() {
2313 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2314 .WillRepeatedly(Return(false));
2315 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2316 .WillRepeatedly(Return(false));
2317 }
2318
2319 // Use this when only ack frames should be allowed to be written.
2320 void SetCanWriteOnlyNonRetransmittable() {
2321 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2322 .WillRepeatedly(Return(false));
2323 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2324 .WillRepeatedly(Return(true));
2325 }
2326};
2327
2328// Simple struct for describing the contents of a packet.
2329// Useful in conjunction with a SimpleQuicFrame for validating that a packet
2330// contains the expected frames.
2331struct PacketContents {
2332 PacketContents()
2333 : num_ack_frames(0),
2334 num_connection_close_frames(0),
2335 num_goaway_frames(0),
2336 num_rst_stream_frames(0),
2337 num_stop_waiting_frames(0),
2338 num_stream_frames(0),
2339 num_crypto_frames(0),
2340 num_ping_frames(0),
2341 num_mtu_discovery_frames(0),
2342 num_padding_frames(0) {}
2343
2344 size_t num_ack_frames;
2345 size_t num_connection_close_frames;
2346 size_t num_goaway_frames;
2347 size_t num_rst_stream_frames;
2348 size_t num_stop_waiting_frames;
2349 size_t num_stream_frames;
2350 size_t num_crypto_frames;
2351 size_t num_ping_frames;
2352 size_t num_mtu_discovery_frames;
2353 size_t num_padding_frames;
2354};
2355
2356class MultiplePacketsTestPacketCreator : public QuicPacketCreator {
2357 public:
2358 MultiplePacketsTestPacketCreator(
2359 QuicConnectionId connection_id,
2360 QuicFramer* framer,
2361 QuicRandom* random_generator,
2362 QuicPacketCreator::DelegateInterface* delegate,
2363 SimpleDataProducer* producer)
2364 : QuicPacketCreator(connection_id, framer, random_generator, delegate),
2365 ack_frame_(InitAckFrame(1)),
2366 delegate_(static_cast<MockDelegate*>(delegate)),
2367 producer_(producer) {}
2368
2369 bool ConsumeRetransmittableControlFrame(const QuicFrame& frame,
2370 bool bundle_ack) {
2371 if (!has_ack()) {
2372 QuicFrames frames;
2373 if (bundle_ack) {
2374 frames.push_back(QuicFrame(&ack_frame_));
2375 }
2376 if (delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2377 NOT_HANDSHAKE)) {
2378 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically())
2379 .WillOnce(Return(frames));
2380 }
2381 }
2382 return QuicPacketCreator::ConsumeRetransmittableControlFrame(frame);
2383 }
2384
2385 QuicConsumedData ConsumeDataFastPath(QuicStreamId id,
2386 const struct iovec* iov,
2387 int iov_count,
2388 size_t total_length,
2389 QuicStreamOffset offset,
2390 bool fin) {
2391 // Save data before data is consumed.
2392 if (total_length > 0) {
2393 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2394 }
2395 return QuicPacketCreator::ConsumeDataFastPath(id, total_length, offset, fin,
2396 0);
2397 }
2398
2399 QuicConsumedData ConsumeData(QuicStreamId id,
2400 const struct iovec* iov,
2401 int iov_count,
2402 size_t total_length,
2403 QuicStreamOffset offset,
2404 StreamSendingState state) {
2405 // Save data before data is consumed.
2406 if (total_length > 0) {
2407 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2408 }
2409 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2410 NOT_HANDSHAKE)) {
2411 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2412 }
2413 return QuicPacketCreator::ConsumeData(id, total_length, offset, state);
2414 }
2415
2416 MessageStatus AddMessageFrame(QuicMessageId message_id,
2417 QuicMemSliceSpan message) {
2418 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2419 NOT_HANDSHAKE)) {
2420 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2421 }
2422 return QuicPacketCreator::AddMessageFrame(message_id, message);
2423 }
2424
2425 size_t ConsumeCryptoData(EncryptionLevel level,
dmcardlecf0bfcf2019-12-13 08:08:21 -08002426 quiche::QuicheStringPiece data,
fayang4245c212019-11-05 13:33:46 -08002427 QuicStreamOffset offset) {
2428 producer_->SaveCryptoData(level, offset, data);
2429 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2430 NOT_HANDSHAKE)) {
2431 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2432 }
2433 return QuicPacketCreator::ConsumeCryptoData(level, data.length(), offset);
2434 }
2435
2436 QuicAckFrame ack_frame_;
2437 MockDelegate* delegate_;
2438 SimpleDataProducer* producer_;
2439};
2440
2441class QuicPacketCreatorMultiplePacketsTest : public QuicTest {
2442 public:
2443 QuicPacketCreatorMultiplePacketsTest()
2444 : framer_(AllSupportedVersions(),
2445 QuicTime::Zero(),
2446 Perspective::IS_CLIENT,
2447 kQuicDefaultConnectionIdLength),
2448 creator_(TestConnectionId(),
2449 &framer_,
2450 &random_creator_,
2451 &delegate_,
2452 &producer_),
2453 ack_frame_(InitAckFrame(1)) {
wub50d4c712020-05-19 15:48:28 -07002454 EXPECT_CALL(delegate_, GetPacketBuffer())
2455 .WillRepeatedly(Return(QuicPacketBuffer()));
fayang15042962020-07-01 12:14:29 -07002456 if (GetQuicReloadableFlag(quic_determine_serialized_packet_fate_early)) {
2457 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
2458 .WillRepeatedly(Return(SEND_TO_WRITER));
2459 }
fayang4245c212019-11-05 13:33:46 -08002460 creator_.SetEncrypter(
2461 ENCRYPTION_FORWARD_SECURE,
2462 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
2463 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2464 framer_.set_data_producer(&producer_);
2465 if (simple_framer_.framer()->version().KnowsWhichDecrypterToUse()) {
2466 simple_framer_.framer()->InstallDecrypter(
2467 ENCRYPTION_FORWARD_SECURE,
2468 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
2469 }
2470 creator_.AttachPacketFlusher();
2471 }
2472
wub8a5dafa2020-05-13 12:30:17 -07002473 ~QuicPacketCreatorMultiplePacketsTest() override {}
fayang4245c212019-11-05 13:33:46 -08002474
wub8a5dafa2020-05-13 12:30:17 -07002475 void SavePacket(SerializedPacket packet) {
2476 DCHECK(packet.release_encrypted_buffer == nullptr);
2477 packet.encrypted_buffer = CopyBuffer(packet);
2478 packet.release_encrypted_buffer = [](const char* p) { delete[] p; };
2479 packets_.push_back(std::move(packet));
fayang4245c212019-11-05 13:33:46 -08002480 }
2481
2482 protected:
2483 QuicRstStreamFrame* CreateRstStreamFrame() {
2484 return new QuicRstStreamFrame(1, 1, QUIC_STREAM_NO_ERROR, 0);
2485 }
2486
2487 QuicGoAwayFrame* CreateGoAwayFrame() {
2488 return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, std::string());
2489 }
2490
2491 void CheckPacketContains(const PacketContents& contents,
2492 size_t packet_index) {
2493 ASSERT_GT(packets_.size(), packet_index);
2494 const SerializedPacket& packet = packets_[packet_index];
2495 size_t num_retransmittable_frames =
2496 contents.num_connection_close_frames + contents.num_goaway_frames +
2497 contents.num_rst_stream_frames + contents.num_stream_frames +
2498 contents.num_crypto_frames + contents.num_ping_frames;
2499 size_t num_frames =
2500 contents.num_ack_frames + contents.num_stop_waiting_frames +
2501 contents.num_mtu_discovery_frames + contents.num_padding_frames +
2502 num_retransmittable_frames;
2503
2504 if (num_retransmittable_frames == 0) {
2505 ASSERT_TRUE(packet.retransmittable_frames.empty());
2506 } else {
2507 ASSERT_FALSE(packet.retransmittable_frames.empty());
2508 EXPECT_EQ(num_retransmittable_frames,
2509 packet.retransmittable_frames.size());
2510 }
2511
2512 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2513 ASSERT_TRUE(simple_framer_.ProcessPacket(
2514 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2515 size_t num_padding_frames = 0;
2516 if (contents.num_padding_frames == 0) {
2517 num_padding_frames = simple_framer_.padding_frames().size();
2518 }
2519 EXPECT_EQ(num_frames + num_padding_frames, simple_framer_.num_frames());
2520 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
2521 EXPECT_EQ(contents.num_connection_close_frames,
2522 simple_framer_.connection_close_frames().size());
2523 EXPECT_EQ(contents.num_goaway_frames,
2524 simple_framer_.goaway_frames().size());
2525 EXPECT_EQ(contents.num_rst_stream_frames,
2526 simple_framer_.rst_stream_frames().size());
2527 EXPECT_EQ(contents.num_stream_frames,
2528 simple_framer_.stream_frames().size());
2529 EXPECT_EQ(contents.num_crypto_frames,
2530 simple_framer_.crypto_frames().size());
2531 EXPECT_EQ(contents.num_stop_waiting_frames,
2532 simple_framer_.stop_waiting_frames().size());
2533 if (contents.num_padding_frames != 0) {
2534 EXPECT_EQ(contents.num_padding_frames,
2535 simple_framer_.padding_frames().size());
2536 }
2537
2538 // From the receiver's perspective, MTU discovery frames are ping frames.
2539 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames,
2540 simple_framer_.ping_frames().size());
2541 }
2542
2543 void CheckPacketHasSingleStreamFrame(size_t packet_index) {
2544 ASSERT_GT(packets_.size(), packet_index);
2545 const SerializedPacket& packet = packets_[packet_index];
2546 ASSERT_FALSE(packet.retransmittable_frames.empty());
2547 EXPECT_EQ(1u, packet.retransmittable_frames.size());
2548 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2549 ASSERT_TRUE(simple_framer_.ProcessPacket(
2550 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2551 EXPECT_EQ(1u, simple_framer_.num_frames());
2552 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
2553 }
2554
2555 void CheckAllPacketsHaveSingleStreamFrame() {
2556 for (size_t i = 0; i < packets_.size(); i++) {
2557 CheckPacketHasSingleStreamFrame(i);
2558 }
2559 }
2560
2561 void CreateData(size_t len) {
2562 data_array_.reset(new char[len]);
2563 memset(data_array_.get(), '?', len);
2564 iov_.iov_base = data_array_.get();
2565 iov_.iov_len = len;
2566 }
2567
2568 QuicFramer framer_;
2569 MockRandom random_creator_;
2570 StrictMock<MockDelegate> delegate_;
2571 MultiplePacketsTestPacketCreator creator_;
2572 SimpleQuicFramer simple_framer_;
2573 std::vector<SerializedPacket> packets_;
2574 QuicAckFrame ack_frame_;
2575 struct iovec iov_;
2576 SimpleBufferAllocator allocator_;
2577
2578 private:
2579 std::unique_ptr<char[]> data_array_;
2580 SimpleDataProducer producer_;
2581};
2582
2583TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_NotWritable) {
2584 delegate_.SetCanNotWrite();
2585
2586 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2587 const bool consumed =
2588 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2589 /*bundle_ack=*/false);
2590 EXPECT_FALSE(consumed);
2591 EXPECT_FALSE(creator_.HasPendingFrames());
2592 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2593 delete rst_frame;
2594}
2595
2596TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_OnlyAckWritable) {
2597 delegate_.SetCanWriteOnlyNonRetransmittable();
2598
2599 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2600 const bool consumed =
2601 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2602 /*bundle_ack=*/false);
2603 EXPECT_FALSE(consumed);
2604 EXPECT_FALSE(creator_.HasPendingFrames());
2605 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2606 delete rst_frame;
2607}
2608
2609TEST_F(QuicPacketCreatorMultiplePacketsTest,
2610 AddControlFrame_WritableAndShouldNotFlush) {
2611 delegate_.SetCanWriteAnything();
2612
2613 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2614 /*bundle_ack=*/false);
2615 EXPECT_TRUE(creator_.HasPendingFrames());
2616 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2617}
2618
2619TEST_F(QuicPacketCreatorMultiplePacketsTest,
2620 AddControlFrame_NotWritableBatchThenFlush) {
2621 delegate_.SetCanNotWrite();
2622
2623 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2624 const bool consumed =
2625 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2626 /*bundle_ack=*/false);
2627 EXPECT_FALSE(consumed);
2628 EXPECT_FALSE(creator_.HasPendingFrames());
2629 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2630 delete rst_frame;
2631}
2632
2633TEST_F(QuicPacketCreatorMultiplePacketsTest,
2634 AddControlFrame_WritableAndShouldFlush) {
2635 delegate_.SetCanWriteAnything();
2636
2637 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2638 .WillOnce(
2639 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2640
2641 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2642 /*bundle_ack=*/false);
2643 creator_.Flush();
2644 EXPECT_FALSE(creator_.HasPendingFrames());
2645 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2646
2647 PacketContents contents;
2648 contents.num_rst_stream_frames = 1;
2649 CheckPacketContains(contents, 0);
2650}
2651
2652TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeCryptoData) {
2653 delegate_.SetCanWriteAnything();
2654
2655 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2656 .WillOnce(
2657 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2658 std::string data = "crypto data";
2659 size_t consumed_bytes =
2660 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2661 creator_.Flush();
2662 EXPECT_EQ(data.length(), consumed_bytes);
2663 EXPECT_FALSE(creator_.HasPendingFrames());
2664 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2665
2666 PacketContents contents;
2667 contents.num_crypto_frames = 1;
2668 contents.num_padding_frames = 1;
2669 CheckPacketContains(contents, 0);
2670}
2671
fayang09207712020-05-15 12:36:42 -07002672TEST_F(QuicPacketCreatorMultiplePacketsTest,
2673 ConsumeCryptoDataCheckShouldGeneratePacket) {
2674 delegate_.SetCanNotWrite();
2675
fayangd6c5bd02020-06-29 07:25:34 -07002676 EXPECT_CALL(delegate_, OnSerializedPacket(_)).Times(0);
fayang09207712020-05-15 12:36:42 -07002677 std::string data = "crypto data";
2678 size_t consumed_bytes =
2679 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2680 creator_.Flush();
fayangd6c5bd02020-06-29 07:25:34 -07002681 EXPECT_EQ(0u, consumed_bytes);
fayang09207712020-05-15 12:36:42 -07002682 EXPECT_FALSE(creator_.HasPendingFrames());
2683 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
fayang09207712020-05-15 12:36:42 -07002684}
2685
fayang4245c212019-11-05 13:33:46 -08002686TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_NotWritable) {
2687 delegate_.SetCanNotWrite();
2688
2689 MakeIOVector("foo", &iov_);
2690 QuicConsumedData consumed = creator_.ConsumeData(
2691 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2692 Perspective::IS_CLIENT),
2693 &iov_, 1u, iov_.iov_len, 0, FIN);
2694 EXPECT_EQ(0u, consumed.bytes_consumed);
2695 EXPECT_FALSE(consumed.fin_consumed);
2696 EXPECT_FALSE(creator_.HasPendingFrames());
2697 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2698}
2699
2700TEST_F(QuicPacketCreatorMultiplePacketsTest,
2701 ConsumeData_WritableAndShouldNotFlush) {
2702 delegate_.SetCanWriteAnything();
2703
2704 MakeIOVector("foo", &iov_);
2705 QuicConsumedData consumed = creator_.ConsumeData(
2706 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2707 Perspective::IS_CLIENT),
2708 &iov_, 1u, iov_.iov_len, 0, FIN);
2709 EXPECT_EQ(3u, consumed.bytes_consumed);
2710 EXPECT_TRUE(consumed.fin_consumed);
2711 EXPECT_TRUE(creator_.HasPendingFrames());
2712 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2713}
2714
2715TEST_F(QuicPacketCreatorMultiplePacketsTest,
2716 ConsumeData_WritableAndShouldFlush) {
2717 delegate_.SetCanWriteAnything();
2718
2719 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2720 .WillOnce(
2721 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2722 MakeIOVector("foo", &iov_);
2723 QuicConsumedData consumed = creator_.ConsumeData(
2724 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2725 Perspective::IS_CLIENT),
2726 &iov_, 1u, iov_.iov_len, 0, FIN);
2727 creator_.Flush();
2728 EXPECT_EQ(3u, consumed.bytes_consumed);
2729 EXPECT_TRUE(consumed.fin_consumed);
2730 EXPECT_FALSE(creator_.HasPendingFrames());
2731 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2732
2733 PacketContents contents;
2734 contents.num_stream_frames = 1;
2735 CheckPacketContains(contents, 0);
2736}
2737
2738// Test the behavior of ConsumeData when the data consumed is for the crypto
2739// handshake stream. Ensure that the packet is always sent and padded even if
2740// the creator operates in batch mode.
2741TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_Handshake) {
2742 delegate_.SetCanWriteAnything();
2743
2744 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2745 .WillOnce(
2746 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2747 std::string data = "foo bar";
2748 MakeIOVector(data, &iov_);
2749 size_t consumed_bytes = 0;
2750 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2751 consumed_bytes = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2752 } else {
2753 consumed_bytes =
2754 creator_
2755 .ConsumeData(
2756 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2757 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2758 .bytes_consumed;
2759 }
2760 EXPECT_EQ(7u, consumed_bytes);
2761 EXPECT_FALSE(creator_.HasPendingFrames());
2762 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2763
2764 PacketContents contents;
2765 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2766 contents.num_crypto_frames = 1;
2767 } else {
2768 contents.num_stream_frames = 1;
2769 }
2770 contents.num_padding_frames = 1;
2771 CheckPacketContains(contents, 0);
2772
2773 ASSERT_EQ(1u, packets_.size());
2774 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2775 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
2776}
2777
2778// Test the behavior of ConsumeData when the data is for the crypto handshake
2779// stream, but padding is disabled.
2780TEST_F(QuicPacketCreatorMultiplePacketsTest,
2781 ConsumeData_Handshake_PaddingDisabled) {
2782 creator_.set_fully_pad_crypto_handshake_packets(false);
2783
2784 delegate_.SetCanWriteAnything();
2785
2786 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2787 .WillOnce(
2788 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2789 std::string data = "foo";
2790 MakeIOVector(data, &iov_);
2791 size_t bytes_consumed = 0;
2792 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2793 bytes_consumed = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2794 } else {
2795 bytes_consumed =
2796 creator_
2797 .ConsumeData(
2798 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2799 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2800 .bytes_consumed;
2801 }
2802 EXPECT_EQ(3u, bytes_consumed);
2803 EXPECT_FALSE(creator_.HasPendingFrames());
2804 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2805
2806 PacketContents contents;
2807 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2808 contents.num_crypto_frames = 1;
2809 } else {
2810 contents.num_stream_frames = 1;
2811 }
2812 contents.num_padding_frames = 0;
2813 CheckPacketContains(contents, 0);
2814
2815 ASSERT_EQ(1u, packets_.size());
2816
2817 // Packet is not fully padded, but we want to future packets to be larger.
2818 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2819 size_t expected_packet_length = 27;
2820 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2821 // The framing of CRYPTO frames is slightly different than that of stream
2822 // frames, so the expected packet length differs slightly.
2823 expected_packet_length = 28;
2824 }
2825 if (framer_.version().HasHeaderProtection()) {
2826 expected_packet_length = 29;
2827 }
2828 EXPECT_EQ(expected_packet_length, packets_[0].encrypted_length);
2829}
2830
2831TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_EmptyData) {
2832 delegate_.SetCanWriteAnything();
2833
2834 EXPECT_QUIC_BUG(creator_.ConsumeData(
2835 QuicUtils::QuicUtils::GetFirstBidirectionalStreamId(
2836 framer_.transport_version(), Perspective::IS_CLIENT),
2837 nullptr, 0, 0, 0, NO_FIN),
2838 "Attempt to consume empty data without FIN.");
2839}
2840
2841TEST_F(QuicPacketCreatorMultiplePacketsTest,
2842 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
2843 delegate_.SetCanWriteAnything();
2844
2845 MakeIOVector("foo", &iov_);
2846 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2847 framer_.transport_version(), Perspective::IS_CLIENT),
2848 &iov_, 1u, iov_.iov_len, 0, FIN);
2849 MakeIOVector("quux", &iov_);
2850 QuicConsumedData consumed =
2851 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 3, NO_FIN);
2852 EXPECT_EQ(4u, consumed.bytes_consumed);
2853 EXPECT_FALSE(consumed.fin_consumed);
2854 EXPECT_TRUE(creator_.HasPendingFrames());
2855 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2856}
2857
2858TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_BatchOperations) {
2859 delegate_.SetCanWriteAnything();
2860
2861 MakeIOVector("foo", &iov_);
2862 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2863 framer_.transport_version(), Perspective::IS_CLIENT),
2864 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2865 MakeIOVector("quux", &iov_);
2866 QuicConsumedData consumed = creator_.ConsumeData(
2867 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2868 Perspective::IS_CLIENT),
2869 &iov_, 1u, iov_.iov_len, 3, FIN);
2870 EXPECT_EQ(4u, consumed.bytes_consumed);
2871 EXPECT_TRUE(consumed.fin_consumed);
2872 EXPECT_TRUE(creator_.HasPendingFrames());
2873 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2874
2875 // Now both frames will be flushed out.
2876 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2877 .WillOnce(
2878 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2879 creator_.Flush();
2880 EXPECT_FALSE(creator_.HasPendingFrames());
2881 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2882
2883 PacketContents contents;
renjietange426d622020-01-02 11:58:46 -08002884 contents.num_stream_frames = 1;
fayang4245c212019-11-05 13:33:46 -08002885 CheckPacketContains(contents, 0);
2886}
2887
2888TEST_F(QuicPacketCreatorMultiplePacketsTest,
2889 ConsumeData_FramesPreviouslyQueued) {
2890 // Set the packet size be enough for two stream frames with 0 stream offset,
2891 // but not enough for a stream frame of 0 offset and one with non-zero offset.
2892 size_t length =
2893 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
2894 GetPacketHeaderSize(
2895 framer_.transport_version(),
2896 creator_.GetDestinationConnectionIdLength(),
2897 creator_.GetSourceConnectionIdLength(),
2898 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2899 !kIncludeDiversificationNonce,
2900 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2901 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
2902 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
2903 // Add an extra 3 bytes for the payload and 1 byte so
2904 // BytesFree is larger than the GetMinStreamFrameSize.
2905 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0,
2906 false, 3) +
2907 3 +
2908 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0, true,
2909 1) +
2910 1;
2911 creator_.SetMaxPacketLength(length);
2912 delegate_.SetCanWriteAnything();
2913 {
2914 InSequence dummy;
2915 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2916 .WillOnce(
2917 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2918 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2919 .WillOnce(
2920 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2921 }
2922 // Queue enough data to prevent a stream frame with a non-zero offset from
2923 // fitting.
2924 MakeIOVector("foo", &iov_);
2925 QuicConsumedData consumed = creator_.ConsumeData(
2926 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2927 Perspective::IS_CLIENT),
2928 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2929 EXPECT_EQ(3u, consumed.bytes_consumed);
2930 EXPECT_FALSE(consumed.fin_consumed);
2931 EXPECT_TRUE(creator_.HasPendingFrames());
2932 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2933
2934 // This frame will not fit with the existing frame, causing the queued frame
2935 // to be serialized, and it will be added to a new open packet.
2936 MakeIOVector("bar", &iov_);
2937 consumed = creator_.ConsumeData(
2938 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2939 Perspective::IS_CLIENT),
2940 &iov_, 1u, iov_.iov_len, 3, FIN);
2941 EXPECT_EQ(3u, consumed.bytes_consumed);
2942 EXPECT_TRUE(consumed.fin_consumed);
2943 EXPECT_TRUE(creator_.HasPendingFrames());
2944 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2945
2946 creator_.FlushCurrentPacket();
2947 EXPECT_FALSE(creator_.HasPendingFrames());
2948 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2949
2950 PacketContents contents;
2951 contents.num_stream_frames = 1;
2952 CheckPacketContains(contents, 0);
2953 CheckPacketContains(contents, 1);
2954}
2955
2956TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataFastPath) {
2957 delegate_.SetCanWriteAnything();
2958 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
2959
2960 // Create a 10000 byte IOVector.
2961 CreateData(10000);
2962 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2963 .WillRepeatedly(
2964 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2965 QuicConsumedData consumed = creator_.ConsumeDataFastPath(
2966 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2967 Perspective::IS_CLIENT),
2968 &iov_, 1u, iov_.iov_len, 0, true);
2969 EXPECT_EQ(10000u, consumed.bytes_consumed);
2970 EXPECT_TRUE(consumed.fin_consumed);
2971 EXPECT_FALSE(creator_.HasPendingFrames());
2972 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2973
2974 PacketContents contents;
2975 contents.num_stream_frames = 1;
2976 CheckPacketContains(contents, 0);
2977 EXPECT_FALSE(packets_.empty());
wub8a5dafa2020-05-13 12:30:17 -07002978 SerializedPacket& packet = packets_.back();
fayang4245c212019-11-05 13:33:46 -08002979 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2980 EXPECT_EQ(LOSS_RETRANSMISSION, packet.transmission_type);
2981 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2982 const QuicStreamFrame& stream_frame =
2983 packet.retransmittable_frames.front().stream_frame;
2984 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2985}
2986
2987TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLarge) {
2988 delegate_.SetCanWriteAnything();
2989
2990 // Create a 10000 byte IOVector.
2991 CreateData(10000);
2992 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2993 .WillRepeatedly(
2994 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2995 QuicConsumedData consumed = creator_.ConsumeData(
2996 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2997 Perspective::IS_CLIENT),
2998 &iov_, 1u, iov_.iov_len, 0, FIN);
2999 EXPECT_EQ(10000u, consumed.bytes_consumed);
3000 EXPECT_TRUE(consumed.fin_consumed);
3001 EXPECT_FALSE(creator_.HasPendingFrames());
3002 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3003
3004 PacketContents contents;
3005 contents.num_stream_frames = 1;
3006 CheckPacketContains(contents, 0);
3007 EXPECT_FALSE(packets_.empty());
wub8a5dafa2020-05-13 12:30:17 -07003008 SerializedPacket& packet = packets_.back();
fayang4245c212019-11-05 13:33:46 -08003009 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3010 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3011 const QuicStreamFrame& stream_frame =
3012 packet.retransmittable_frames.front().stream_frame;
3013 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3014}
3015
3016TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckFalse) {
3017 delegate_.SetCanNotWrite();
3018
3019 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3020 const bool success =
3021 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3022 /*bundle_ack=*/true);
3023 EXPECT_FALSE(success);
3024 EXPECT_FALSE(creator_.HasPendingFrames());
3025 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3026
3027 delegate_.SetCanWriteAnything();
3028
3029 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3030 /*bundle_ack=*/false);
3031
3032 // Create a 10000 byte IOVector.
3033 CreateData(10000);
3034 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3035 .WillRepeatedly(
3036 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3037 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
3038 /*bundle_ack=*/true);
3039 QuicConsumedData consumed = creator_.ConsumeData(
3040 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3041 Perspective::IS_CLIENT),
3042 &iov_, 1u, iov_.iov_len, 0, FIN);
3043 creator_.Flush();
3044
3045 EXPECT_EQ(10000u, consumed.bytes_consumed);
3046 EXPECT_TRUE(consumed.fin_consumed);
3047 EXPECT_FALSE(creator_.HasPendingFrames());
3048 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3049
3050 EXPECT_FALSE(packets_.empty());
wub8a5dafa2020-05-13 12:30:17 -07003051 SerializedPacket& packet = packets_.back();
fayang4245c212019-11-05 13:33:46 -08003052 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3053 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3054 const QuicStreamFrame& stream_frame =
3055 packet.retransmittable_frames.front().stream_frame;
3056 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3057}
3058
3059TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckTrue) {
fayang4245c212019-11-05 13:33:46 -08003060 delegate_.SetCanNotWrite();
3061 delegate_.SetCanWriteAnything();
3062
3063 // Create a 10000 byte IOVector.
3064 CreateData(10000);
3065 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3066 .WillRepeatedly(
3067 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3068 QuicConsumedData consumed = creator_.ConsumeData(
3069 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3070 Perspective::IS_CLIENT),
3071 &iov_, 1u, iov_.iov_len, 0, FIN);
3072 creator_.Flush();
3073
3074 EXPECT_EQ(10000u, consumed.bytes_consumed);
3075 EXPECT_TRUE(consumed.fin_consumed);
3076 EXPECT_FALSE(creator_.HasPendingFrames());
3077 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3078
3079 EXPECT_FALSE(packets_.empty());
wub8a5dafa2020-05-13 12:30:17 -07003080 SerializedPacket& packet = packets_.back();
fayang4245c212019-11-05 13:33:46 -08003081 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3082 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3083 const QuicStreamFrame& stream_frame =
3084 packet.retransmittable_frames.front().stream_frame;
3085 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3086}
3087
3088TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations) {
3089 delegate_.SetCanNotWrite();
3090
3091 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3092 const bool consumed =
3093 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3094 /*bundle_ack=*/true);
3095 EXPECT_FALSE(consumed);
3096 EXPECT_FALSE(creator_.HasPendingFrames());
3097 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3098 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3099
3100 delegate_.SetCanWriteAnything();
3101
3102 EXPECT_TRUE(
3103 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3104 /*bundle_ack=*/false));
3105 // Send some data and a control frame
3106 MakeIOVector("quux", &iov_);
3107 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3108 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3109 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3110 /*bundle_ack=*/false);
3111 }
3112 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(3));
3113
3114 // All five frames will be flushed out in a single packet.
3115 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3116 .WillOnce(
3117 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3118 creator_.Flush();
3119 EXPECT_FALSE(creator_.HasPendingFrames());
3120 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3121 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3122
3123 PacketContents contents;
3124 // ACK will be flushed by connection.
3125 contents.num_ack_frames = 0;
3126 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3127 contents.num_goaway_frames = 1;
3128 } else {
3129 contents.num_goaway_frames = 0;
3130 }
3131 contents.num_rst_stream_frames = 1;
3132 contents.num_stream_frames = 1;
3133 CheckPacketContains(contents, 0);
3134}
3135
3136TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations2) {
3137 delegate_.SetCanNotWrite();
3138
3139 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3140 const bool success =
3141 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3142 /*bundle_ack=*/true);
3143 EXPECT_FALSE(success);
3144 EXPECT_FALSE(creator_.HasPendingFrames());
3145 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3146
3147 delegate_.SetCanWriteAnything();
3148
3149 {
3150 InSequence dummy;
3151 // All five frames will be flushed out in a single packet
3152 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3153 .WillOnce(
3154 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3155 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3156 .WillOnce(
3157 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3158 }
3159 EXPECT_TRUE(
3160 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3161 /*bundle_ack=*/false));
3162 // Send enough data to exceed one packet
3163 size_t data_len = kDefaultMaxPacketSize + 100;
3164 CreateData(data_len);
3165 QuicConsumedData consumed =
3166 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, FIN);
3167 EXPECT_EQ(data_len, consumed.bytes_consumed);
3168 EXPECT_TRUE(consumed.fin_consumed);
3169 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3170 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3171 /*bundle_ack=*/false);
3172 }
3173
3174 creator_.Flush();
3175 EXPECT_FALSE(creator_.HasPendingFrames());
3176 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3177
3178 // The first packet should have the queued data and part of the stream data.
3179 PacketContents contents;
3180 // ACK will be sent by connection.
3181 contents.num_ack_frames = 0;
3182 contents.num_rst_stream_frames = 1;
3183 contents.num_stream_frames = 1;
3184 CheckPacketContains(contents, 0);
3185
3186 // The second should have the remainder of the stream data.
3187 PacketContents contents2;
3188 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3189 contents2.num_goaway_frames = 1;
3190 } else {
3191 contents2.num_goaway_frames = 0;
3192 }
3193 contents2.num_stream_frames = 1;
3194 CheckPacketContains(contents2, 1);
3195}
3196
3197// Regression test of b/120493795.
3198TEST_F(QuicPacketCreatorMultiplePacketsTest, PacketTransmissionType) {
3199 delegate_.SetCanWriteAnything();
3200
3201 // The first ConsumeData will fill the packet without flush.
3202 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
3203
3204 size_t data_len = 1324;
3205 CreateData(data_len);
3206 QuicStreamId stream1_id = QuicUtils::GetFirstBidirectionalStreamId(
3207 framer_.transport_version(), Perspective::IS_CLIENT);
3208 QuicConsumedData consumed =
3209 creator_.ConsumeData(stream1_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3210 EXPECT_EQ(data_len, consumed.bytes_consumed);
3211 ASSERT_EQ(0u, creator_.BytesFree())
3212 << "Test setup failed: Please increase data_len to "
3213 << data_len + creator_.BytesFree() << " bytes.";
3214
3215 // The second ConsumeData can not be added to the packet and will flush.
3216 creator_.SetTransmissionType(NOT_RETRANSMISSION);
3217
3218 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3219 .WillOnce(
3220 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3221
3222 QuicStreamId stream2_id = stream1_id + 4;
3223
3224 consumed =
3225 creator_.ConsumeData(stream2_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3226 EXPECT_EQ(data_len, consumed.bytes_consumed);
3227
3228 // Ensure the packet is successfully created.
3229 ASSERT_EQ(1u, packets_.size());
3230 ASSERT_TRUE(packets_[0].encrypted_buffer);
3231 ASSERT_EQ(1u, packets_[0].retransmittable_frames.size());
3232 EXPECT_EQ(stream1_id,
3233 packets_[0].retransmittable_frames[0].stream_frame.stream_id);
3234
3235 // Since the second frame was not added, the packet's transmission type
3236 // should be the first frame's type.
3237 EXPECT_EQ(packets_[0].transmission_type, LOSS_RETRANSMISSION);
3238}
3239
3240TEST_F(QuicPacketCreatorMultiplePacketsTest, TestConnectionIdLength) {
3241 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
3242 creator_.SetServerConnectionIdLength(0);
3243 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3244 creator_.GetDestinationConnectionIdLength());
3245
3246 for (size_t i = 1; i < 10; i++) {
3247 creator_.SetServerConnectionIdLength(i);
3248 if (VersionHasIetfInvariantHeader(framer_.transport_version())) {
3249 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3250 creator_.GetDestinationConnectionIdLength());
3251 } else {
3252 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID,
3253 creator_.GetDestinationConnectionIdLength());
3254 }
3255 }
3256}
3257
3258// Test whether SetMaxPacketLength() works in the situation when the queue is
3259// empty, and we send three packets worth of data.
3260TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Initial) {
3261 delegate_.SetCanWriteAnything();
3262
3263 // Send enough data for three packets.
3264 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
3265 size_t packet_len = kDefaultMaxPacketSize + 100;
3266 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3267 creator_.SetMaxPacketLength(packet_len);
3268 EXPECT_EQ(packet_len, creator_.max_packet_length());
3269
3270 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3271 .Times(3)
3272 .WillRepeatedly(
3273 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3274 CreateData(data_len);
3275 QuicConsumedData consumed = creator_.ConsumeData(
3276 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3277 Perspective::IS_CLIENT),
3278 &iov_, 1u, iov_.iov_len,
3279 /*offset=*/0, FIN);
3280 EXPECT_EQ(data_len, consumed.bytes_consumed);
3281 EXPECT_TRUE(consumed.fin_consumed);
3282 EXPECT_FALSE(creator_.HasPendingFrames());
3283 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3284
3285 // We expect three packets, and first two of them have to be of packet_len
3286 // size. We check multiple packets (instead of just one) because we want to
3287 // ensure that |max_packet_length_| does not get changed incorrectly by the
3288 // creator after first packet is serialized.
3289 ASSERT_EQ(3u, packets_.size());
3290 EXPECT_EQ(packet_len, packets_[0].encrypted_length);
3291 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3292 CheckAllPacketsHaveSingleStreamFrame();
3293}
3294
3295// Test whether SetMaxPacketLength() works in the situation when we first write
3296// data, then change packet size, then write data again.
3297TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Middle) {
3298 delegate_.SetCanWriteAnything();
3299
3300 // We send enough data to overflow default packet length, but not the altered
3301 // one.
3302 size_t data_len = kDefaultMaxPacketSize;
3303 size_t packet_len = kDefaultMaxPacketSize + 100;
3304 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3305
3306 // We expect to see three packets in total.
3307 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3308 .Times(3)
3309 .WillRepeatedly(
3310 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3311
3312 // Send two packets before packet size change.
3313 CreateData(data_len);
3314 QuicConsumedData consumed = creator_.ConsumeData(
3315 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3316 Perspective::IS_CLIENT),
3317 &iov_, 1u, iov_.iov_len,
3318 /*offset=*/0, NO_FIN);
3319 creator_.Flush();
3320 EXPECT_EQ(data_len, consumed.bytes_consumed);
3321 EXPECT_FALSE(consumed.fin_consumed);
3322 EXPECT_FALSE(creator_.HasPendingFrames());
3323 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3324
3325 // Make sure we already have two packets.
3326 ASSERT_EQ(2u, packets_.size());
3327
3328 // Increase packet size.
3329 creator_.SetMaxPacketLength(packet_len);
3330 EXPECT_EQ(packet_len, creator_.max_packet_length());
3331
3332 // Send a packet after packet size change.
3333 CreateData(data_len);
3334 creator_.AttachPacketFlusher();
3335 consumed = creator_.ConsumeData(
3336 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3337 Perspective::IS_CLIENT),
3338 &iov_, 1u, iov_.iov_len, data_len, FIN);
3339 creator_.Flush();
3340 EXPECT_EQ(data_len, consumed.bytes_consumed);
3341 EXPECT_TRUE(consumed.fin_consumed);
3342 EXPECT_FALSE(creator_.HasPendingFrames());
3343 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3344
3345 // We expect first data chunk to get fragmented, but the second one to fit
3346 // into a single packet.
3347 ASSERT_EQ(3u, packets_.size());
3348 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3349 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length);
3350 CheckAllPacketsHaveSingleStreamFrame();
3351}
3352
3353// Test whether SetMaxPacketLength() works correctly when we force the change of
3354// the packet size in the middle of the batched packet.
3355TEST_F(QuicPacketCreatorMultiplePacketsTest,
3356 SetMaxPacketLength_MidpacketFlush) {
3357 delegate_.SetCanWriteAnything();
3358
3359 size_t first_write_len = kDefaultMaxPacketSize / 2;
3360 size_t packet_len = kDefaultMaxPacketSize + 100;
3361 size_t second_write_len = packet_len + 1;
3362 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3363
3364 // First send half of the packet worth of data. We are in the batch mode, so
3365 // should not cause packet serialization.
3366 CreateData(first_write_len);
3367 QuicConsumedData consumed = creator_.ConsumeData(
3368 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3369 Perspective::IS_CLIENT),
3370 &iov_, 1u, iov_.iov_len,
3371 /*offset=*/0, NO_FIN);
3372 EXPECT_EQ(first_write_len, consumed.bytes_consumed);
3373 EXPECT_FALSE(consumed.fin_consumed);
3374 EXPECT_TRUE(creator_.HasPendingFrames());
3375 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3376
3377 // Make sure we have no packets so far.
3378 ASSERT_EQ(0u, packets_.size());
3379
3380 // Expect a packet to be flushed.
3381 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3382 .WillOnce(
3383 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3384
3385 // Increase packet size after flushing all frames.
3386 // Ensure it's immediately enacted.
3387 creator_.FlushCurrentPacket();
3388 creator_.SetMaxPacketLength(packet_len);
3389 EXPECT_EQ(packet_len, creator_.max_packet_length());
3390 EXPECT_FALSE(creator_.HasPendingFrames());
3391 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3392
3393 // We expect to see exactly one packet serialized after that, because we send
3394 // a value somewhat exceeding new max packet size, and the tail data does not
3395 // get serialized because we are still in the batch mode.
3396 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3397 .WillOnce(
3398 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3399
3400 // Send a more than a packet worth of data to the same stream. This should
3401 // trigger serialization of one packet, and queue another one.
3402 CreateData(second_write_len);
3403 consumed = creator_.ConsumeData(
3404 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3405 Perspective::IS_CLIENT),
3406 &iov_, 1u, iov_.iov_len,
3407 /*offset=*/first_write_len, FIN);
3408 EXPECT_EQ(second_write_len, consumed.bytes_consumed);
3409 EXPECT_TRUE(consumed.fin_consumed);
3410 EXPECT_TRUE(creator_.HasPendingFrames());
3411 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3412
3413 // We expect the first packet to be underfilled, and the second packet be up
3414 // to the new max packet size.
3415 ASSERT_EQ(2u, packets_.size());
3416 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3417 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3418
3419 CheckAllPacketsHaveSingleStreamFrame();
3420}
3421
3422// Test sending a connectivity probing packet.
3423TEST_F(QuicPacketCreatorMultiplePacketsTest,
3424 GenerateConnectivityProbingPacket) {
3425 delegate_.SetCanWriteAnything();
3426
wub8a5dafa2020-05-13 12:30:17 -07003427 std::unique_ptr<SerializedPacket> probing_packet;
fayang4245c212019-11-05 13:33:46 -08003428 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3429 QuicPathFrameBuffer payload = {
3430 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
3431 probing_packet =
3432 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
3433 } else {
3434 probing_packet = creator_.SerializeConnectivityProbingPacket();
3435 }
3436
3437 ASSERT_TRUE(simple_framer_.ProcessPacket(QuicEncryptedPacket(
3438 probing_packet->encrypted_buffer, probing_packet->encrypted_length)));
3439
3440 EXPECT_EQ(2u, simple_framer_.num_frames());
3441 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3442 EXPECT_EQ(1u, simple_framer_.path_challenge_frames().size());
3443 } else {
3444 EXPECT_EQ(1u, simple_framer_.ping_frames().size());
3445 }
3446 EXPECT_EQ(1u, simple_framer_.padding_frames().size());
3447}
3448
3449// Test sending an MTU probe, without any surrounding data.
3450TEST_F(QuicPacketCreatorMultiplePacketsTest,
3451 GenerateMtuDiscoveryPacket_Simple) {
3452 delegate_.SetCanWriteAnything();
3453
3454 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3455 static_assert(target_mtu < kMaxOutgoingPacketSize,
3456 "The MTU probe used by the test exceeds maximum packet size");
3457
3458 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3459 .WillOnce(
3460 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3461
3462 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3463
3464 EXPECT_FALSE(creator_.HasPendingFrames());
3465 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3466 ASSERT_EQ(1u, packets_.size());
3467 EXPECT_EQ(target_mtu, packets_[0].encrypted_length);
3468
3469 PacketContents contents;
3470 contents.num_mtu_discovery_frames = 1;
3471 contents.num_padding_frames = 1;
3472 CheckPacketContains(contents, 0);
3473}
3474
3475// Test sending an MTU probe. Surround it with data, to ensure that it resets
3476// the MTU to the value before the probe was sent.
3477TEST_F(QuicPacketCreatorMultiplePacketsTest,
3478 GenerateMtuDiscoveryPacket_SurroundedByData) {
3479 delegate_.SetCanWriteAnything();
3480
3481 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3482 static_assert(target_mtu < kMaxOutgoingPacketSize,
3483 "The MTU probe used by the test exceeds maximum packet size");
3484
3485 // Send enough data so it would always cause two packets to be sent.
3486 const size_t data_len = target_mtu + 1;
3487
3488 // Send a total of five packets: two packets before the probe, the probe
3489 // itself, and two packets after the probe.
3490 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3491 .Times(5)
3492 .WillRepeatedly(
3493 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3494
3495 // Send data before the MTU probe.
3496 CreateData(data_len);
3497 QuicConsumedData consumed = creator_.ConsumeData(
3498 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3499 Perspective::IS_CLIENT),
3500 &iov_, 1u, iov_.iov_len,
3501 /*offset=*/0, NO_FIN);
3502 creator_.Flush();
3503 EXPECT_EQ(data_len, consumed.bytes_consumed);
3504 EXPECT_FALSE(consumed.fin_consumed);
3505 EXPECT_FALSE(creator_.HasPendingFrames());
3506 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3507
3508 // Send the MTU probe.
3509 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3510 EXPECT_FALSE(creator_.HasPendingFrames());
3511 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3512
3513 // Send data after the MTU probe.
3514 CreateData(data_len);
3515 creator_.AttachPacketFlusher();
3516 consumed = creator_.ConsumeData(
3517 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3518 Perspective::IS_CLIENT),
3519 &iov_, 1u, iov_.iov_len,
3520 /*offset=*/data_len, FIN);
3521 creator_.Flush();
3522 EXPECT_EQ(data_len, consumed.bytes_consumed);
3523 EXPECT_TRUE(consumed.fin_consumed);
3524 EXPECT_FALSE(creator_.HasPendingFrames());
3525 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3526
3527 ASSERT_EQ(5u, packets_.size());
3528 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3529 EXPECT_EQ(target_mtu, packets_[2].encrypted_length);
3530 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length);
3531
3532 PacketContents probe_contents;
3533 probe_contents.num_mtu_discovery_frames = 1;
3534 probe_contents.num_padding_frames = 1;
3535
3536 CheckPacketHasSingleStreamFrame(0);
3537 CheckPacketHasSingleStreamFrame(1);
3538 CheckPacketContains(probe_contents, 2);
3539 CheckPacketHasSingleStreamFrame(3);
3540 CheckPacketHasSingleStreamFrame(4);
3541}
3542
3543TEST_F(QuicPacketCreatorMultiplePacketsTest, DontCrashOnInvalidStopWaiting) {
3544 if (VersionSupportsMessageFrames(framer_.transport_version())) {
3545 return;
3546 }
3547 // Test added to ensure the creator does not crash when an invalid frame is
3548 // added. Because this is an indication of internal programming errors,
3549 // DFATALs are expected.
3550 // A 1 byte packet number length can't encode a gap of 1000.
3551 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1000);
3552
3553 delegate_.SetCanNotWrite();
3554 delegate_.SetCanWriteAnything();
3555
3556 // This will not serialize any packets, because of the invalid frame.
3557 EXPECT_CALL(delegate_,
3558 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _));
3559 EXPECT_QUIC_BUG(creator_.Flush(),
3560 "packet_number_length 1 is too small "
3561 "for least_unacked_delta: 1001");
3562}
3563
3564// Regression test for b/31486443.
3565TEST_F(QuicPacketCreatorMultiplePacketsTest,
3566 ConnectionCloseFrameLargerThanPacketSize) {
3567 delegate_.SetCanWriteAnything();
3568 char buf[2000] = {};
dmcardlecf0bfcf2019-12-13 08:08:21 -08003569 quiche::QuicheStringPiece error_details(buf, 2000);
fayang4245c212019-11-05 13:33:46 -08003570 const QuicErrorCode kQuicErrorCode = QUIC_PACKET_WRITE_ERROR;
3571
3572 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
3573 framer_.transport_version(), kQuicErrorCode, std::string(error_details),
3574 /*transport_close_frame_type=*/0);
3575 creator_.ConsumeRetransmittableControlFrame(QuicFrame(frame),
3576 /*bundle_ack=*/false);
3577 EXPECT_TRUE(creator_.HasPendingFrames());
3578 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3579}
3580
3581TEST_F(QuicPacketCreatorMultiplePacketsTest,
3582 RandomPaddingAfterFinSingleStreamSinglePacket) {
3583 const QuicByteCount kStreamFramePayloadSize = 100u;
3584 char buf[kStreamFramePayloadSize] = {};
3585 const QuicStreamId kDataStreamId = 5;
3586 // Set the packet size be enough for one stream frame with 0 stream offset and
3587 // max size of random padding.
3588 size_t length =
3589 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3590 GetPacketHeaderSize(
3591 framer_.transport_version(),
3592 creator_.GetDestinationConnectionIdLength(),
3593 creator_.GetSourceConnectionIdLength(),
3594 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3595 !kIncludeDiversificationNonce,
3596 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3597 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3598 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3599 QuicFramer::GetMinStreamFrameSize(
3600 framer_.transport_version(), kDataStreamId, 0,
3601 /*last_frame_in_packet=*/false,
3602 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes) +
3603 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes;
3604 creator_.SetMaxPacketLength(length);
3605 delegate_.SetCanWriteAnything();
3606 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3607 .WillOnce(
3608 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
dmcardlecf0bfcf2019-12-13 08:08:21 -08003609 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003610 QuicConsumedData consumed = creator_.ConsumeData(
3611 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3612 creator_.Flush();
3613 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3614 EXPECT_FALSE(creator_.HasPendingFrames());
3615 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3616
3617 EXPECT_EQ(1u, packets_.size());
3618 PacketContents contents;
3619 // The packet has both stream and padding frames.
3620 contents.num_padding_frames = 1;
3621 contents.num_stream_frames = 1;
3622 CheckPacketContains(contents, 0);
3623}
3624
3625TEST_F(QuicPacketCreatorMultiplePacketsTest,
3626 RandomPaddingAfterFinSingleStreamMultiplePackets) {
3627 const QuicByteCount kStreamFramePayloadSize = 100u;
3628 char buf[kStreamFramePayloadSize] = {};
3629 const QuicStreamId kDataStreamId = 5;
3630 // Set the packet size be enough for one stream frame with 0 stream offset +
3631 // 1. One or more packets will accommodate.
3632 size_t length =
3633 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3634 GetPacketHeaderSize(
3635 framer_.transport_version(),
3636 creator_.GetDestinationConnectionIdLength(),
3637 creator_.GetSourceConnectionIdLength(),
3638 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3639 !kIncludeDiversificationNonce,
3640 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3641 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3642 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3643 QuicFramer::GetMinStreamFrameSize(
3644 framer_.transport_version(), kDataStreamId, 0,
3645 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
3646 kStreamFramePayloadSize + 1;
3647 creator_.SetMaxPacketLength(length);
3648 delegate_.SetCanWriteAnything();
3649 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3650 .WillRepeatedly(
3651 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
dmcardlecf0bfcf2019-12-13 08:08:21 -08003652 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003653 QuicConsumedData consumed = creator_.ConsumeData(
3654 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3655 creator_.Flush();
3656 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3657 EXPECT_FALSE(creator_.HasPendingFrames());
3658 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3659
3660 EXPECT_LE(1u, packets_.size());
3661 PacketContents contents;
3662 // The first packet has both stream and padding frames.
3663 contents.num_stream_frames = 1;
3664 contents.num_padding_frames = 1;
3665 CheckPacketContains(contents, 0);
3666
3667 for (size_t i = 1; i < packets_.size(); ++i) {
3668 // Following packets only have paddings.
3669 contents.num_stream_frames = 0;
3670 contents.num_padding_frames = 1;
3671 CheckPacketContains(contents, i);
3672 }
3673}
3674
3675TEST_F(QuicPacketCreatorMultiplePacketsTest,
3676 RandomPaddingAfterFinMultipleStreamsMultiplePackets) {
3677 const QuicByteCount kStreamFramePayloadSize = 100u;
3678 char buf[kStreamFramePayloadSize] = {};
3679 const QuicStreamId kDataStreamId1 = 5;
3680 const QuicStreamId kDataStreamId2 = 6;
3681 // Set the packet size be enough for first frame with 0 stream offset + second
3682 // frame + 1 byte payload. two or more packets will accommodate.
3683 size_t length =
3684 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3685 GetPacketHeaderSize(
3686 framer_.transport_version(),
3687 creator_.GetDestinationConnectionIdLength(),
3688 creator_.GetSourceConnectionIdLength(),
3689 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3690 !kIncludeDiversificationNonce,
3691 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3692 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3693 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3694 QuicFramer::GetMinStreamFrameSize(
3695 framer_.transport_version(), kDataStreamId1, 0,
3696 /*last_frame_in_packet=*/false, kStreamFramePayloadSize) +
3697 kStreamFramePayloadSize +
3698 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(),
3699 kDataStreamId1, 0,
3700 /*last_frame_in_packet=*/false, 1) +
3701 1;
3702 creator_.SetMaxPacketLength(length);
3703 delegate_.SetCanWriteAnything();
3704 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3705 .WillRepeatedly(
3706 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
dmcardlecf0bfcf2019-12-13 08:08:21 -08003707 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003708 QuicConsumedData consumed = creator_.ConsumeData(
3709 kDataStreamId1, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3710 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
dmcardlecf0bfcf2019-12-13 08:08:21 -08003711 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003712 consumed = creator_.ConsumeData(kDataStreamId2, &iov_, 1u, iov_.iov_len, 0,
3713 FIN_AND_PADDING);
3714 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3715 creator_.Flush();
3716 EXPECT_FALSE(creator_.HasPendingFrames());
3717 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3718
3719 EXPECT_LE(2u, packets_.size());
3720 PacketContents contents;
3721 // The first packet has two stream frames.
3722 contents.num_stream_frames = 2;
3723 CheckPacketContains(contents, 0);
3724
3725 // The second packet has one stream frame and padding frames.
3726 contents.num_stream_frames = 1;
3727 contents.num_padding_frames = 1;
3728 CheckPacketContains(contents, 1);
3729
3730 for (size_t i = 2; i < packets_.size(); ++i) {
3731 // Following packets only have paddings.
3732 contents.num_stream_frames = 0;
3733 contents.num_padding_frames = 1;
3734 CheckPacketContains(contents, i);
3735 }
3736}
3737
3738TEST_F(QuicPacketCreatorMultiplePacketsTest, AddMessageFrame) {
3739 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
3740 return;
3741 }
dschinazied459c02020-05-07 16:12:23 -07003742 if (framer_.version().UsesTls()) {
3743 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
3744 }
fayang4245c212019-11-05 13:33:46 -08003745 quic::QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
3746 delegate_.SetCanWriteAnything();
3747 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3748 .WillOnce(
3749 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3750
3751 MakeIOVector("foo", &iov_);
3752 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3753 framer_.transport_version(), Perspective::IS_CLIENT),
3754 &iov_, 1u, iov_.iov_len, 0, FIN);
3755 EXPECT_EQ(
3756 MESSAGE_STATUS_SUCCESS,
3757 creator_.AddMessageFrame(1, MakeSpan(&allocator_, "message", &storage)));
3758 EXPECT_TRUE(creator_.HasPendingFrames());
3759 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3760
3761 // Add a message which causes the flush of current packet.
3762 EXPECT_EQ(
3763 MESSAGE_STATUS_SUCCESS,
3764 creator_.AddMessageFrame(
3765 2,
3766 MakeSpan(&allocator_,
3767 std::string(creator_.GetCurrentLargestMessagePayload(), 'a'),
3768 &storage)));
3769 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3770
3771 // Failed to send messages which cannot fit into one packet.
3772 EXPECT_EQ(
3773 MESSAGE_STATUS_TOO_LARGE,
3774 creator_.AddMessageFrame(
3775 3, MakeSpan(&allocator_,
3776 std::string(
3777 creator_.GetCurrentLargestMessagePayload() + 10, 'a'),
3778 &storage)));
3779}
3780
3781TEST_F(QuicPacketCreatorMultiplePacketsTest, ConnectionId) {
3782 creator_.SetServerConnectionId(TestConnectionId(0x1337));
3783 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3784 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
3785 if (!framer_.version().SupportsClientConnectionIds()) {
3786 return;
3787 }
3788 creator_.SetClientConnectionId(TestConnectionId(0x33));
3789 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3790 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
3791}
3792
fayangfce2f722020-06-26 10:27:32 -07003793// Regresstion test for b/159812345.
3794TEST_F(QuicPacketCreatorMultiplePacketsTest, ExtraPaddingNeeded) {
3795 if (!framer_.version().HasHeaderProtection()) {
3796 return;
3797 }
3798 delegate_.SetCanWriteAnything();
3799
3800 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3801 .WillOnce(
3802 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3803 MakeIOVector("a", &iov_);
3804 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3805 framer_.transport_version(), Perspective::IS_CLIENT),
3806 &iov_, 1u, iov_.iov_len, 0, FIN);
3807 creator_.Flush();
3808 ASSERT_FALSE(packets_[0].nonretransmittable_frames.empty());
3809 QuicFrame padding = packets_[0].nonretransmittable_frames[0];
3810 if (GetQuicReloadableFlag(quic_fix_extra_padding_bytes)) {
3811 // Verify stream frame expansion is excluded.
3812 padding.padding_frame.num_padding_bytes = 3;
3813 } else {
3814 padding.padding_frame.num_padding_bytes = 4;
3815 }
3816}
3817
QUICHE teama6ef0a62019-03-07 20:34:33 -05003818} // namespace
3819} // namespace test
3820} // namespace quic