blob: 56c62cbe7c96bfba3241ffe02cf423ecf961446f [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"
renjietang4c704c82019-10-07 16:39:11 -070023#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050024#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
renjietangdbe98342019-10-18 11:00:57 -070025#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
fayang08750832019-10-24 11:25:34 -070026#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050027#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050028#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
29#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
30#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
31#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
32#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
fayang4245c212019-11-05 13:33:46 -080033#include "net/third_party/quiche/src/quic/test_tools/simple_quic_framer.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"
QUICHE teama6ef0a62019-03-07 20:34:33 -050036
37using testing::_;
38using testing::DoAll;
39using testing::InSequence;
40using testing::Invoke;
41using testing::Return;
42using testing::SaveArg;
43using testing::StrictMock;
44
45namespace quic {
46namespace test {
47namespace {
48
renjietang4c704c82019-10-07 16:39:11 -070049const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
50// Use fields in which each byte is distinct to ensure that every byte is
51// framed correctly. The values are otherwise arbitrary.
dschinazi423adc72019-10-23 09:58:55 -070052QuicConnectionId CreateTestConnectionId() {
53 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
54}
renjietang4c704c82019-10-07 16:39:11 -070055
QUICHE teama6ef0a62019-03-07 20:34:33 -050056// Run tests with combinations of {ParsedQuicVersion,
57// ToggleVersionSerialization}.
58struct TestParams {
59 TestParams(ParsedQuicVersion version, bool version_serialization)
60 : version(version), version_serialization(version_serialization) {}
61
QUICHE teama6ef0a62019-03-07 20:34:33 -050062 ParsedQuicVersion version;
63 bool version_serialization;
64};
65
dschinazi142051a2019-09-18 18:17:29 -070066// Used by ::testing::PrintToStringParamName().
67std::string PrintToString(const TestParams& p) {
dmcardlecf0bfcf2019-12-13 08:08:21 -080068 return quiche::QuicheStrCat(ParsedQuicVersionToString(p.version), "_",
69 (p.version_serialization ? "Include" : "No"),
70 "Version");
dschinazi142051a2019-09-18 18:17:29 -070071}
72
QUICHE teama6ef0a62019-03-07 20:34:33 -050073// Constructs various test permutations.
74std::vector<TestParams> GetTestParams() {
75 std::vector<TestParams> params;
76 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
77 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
78 params.push_back(TestParams(all_supported_versions[i], true));
79 params.push_back(TestParams(all_supported_versions[i], false));
80 }
81 return params;
82}
83
rchc76cd742019-03-26 16:00:03 -070084class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
85 public:
86 ~MockDebugDelegate() override = default;
87
88 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame& frame));
renjietangdbe98342019-10-18 11:00:57 -070089
90 MOCK_METHOD1(OnStreamFrameCoalesced, void(const QuicStreamFrame& frame));
rchc76cd742019-03-26 16:00:03 -070091};
92
QUICHE teama6ef0a62019-03-07 20:34:33 -050093class TestPacketCreator : public QuicPacketCreator {
94 public:
95 TestPacketCreator(QuicConnectionId connection_id,
96 QuicFramer* framer,
97 DelegateInterface* delegate,
98 SimpleDataProducer* producer)
99 : QuicPacketCreator(connection_id, framer, delegate),
100 producer_(producer),
101 version_(framer->transport_version()) {}
102
fayang62b637b2019-09-16 08:40:49 -0700103 bool ConsumeDataToFillCurrentPacket(QuicStreamId id,
104 const struct iovec* iov,
105 int iov_count,
106 size_t total_length,
107 size_t iov_offset,
108 QuicStreamOffset offset,
109 bool fin,
110 bool needs_full_padding,
111 TransmissionType transmission_type,
112 QuicFrame* frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500113 // Save data before data is consumed.
114 QuicByteCount data_length = total_length - iov_offset;
115 if (data_length > 0) {
116 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
117 }
fayang62b637b2019-09-16 08:40:49 -0700118 return QuicPacketCreator::ConsumeDataToFillCurrentPacket(
119 id, data_length - iov_offset, offset, fin, needs_full_padding,
120 transmission_type, frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500121 }
122
123 void StopSendingVersion() {
fayangd4291e42019-05-30 10:31:21 -0700124 if (VersionHasIetfInvariantHeader(version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500125 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
126 return;
127 }
128 QuicPacketCreator::StopSendingVersion();
129 }
130
131 SimpleDataProducer* producer_;
132 QuicTransportVersion version_;
133};
134
135class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
136 public:
137 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) {
138 if (serialized_packet == nullptr) {
139 return;
140 }
141 ClearSerializedPacket(serialized_packet);
142 }
143
144 void SaveSerializedPacket(SerializedPacket* serialized_packet) {
145 if (serialized_packet == nullptr) {
146 return;
147 }
148 delete[] serialized_packet_.encrypted_buffer;
149 serialized_packet_ = *serialized_packet;
150 serialized_packet_.encrypted_buffer = CopyBuffer(*serialized_packet);
151 serialized_packet->retransmittable_frames.clear();
152 }
153
154 void DeleteSerializedPacket() {
155 delete[] serialized_packet_.encrypted_buffer;
156 serialized_packet_.encrypted_buffer = nullptr;
157 ClearSerializedPacket(&serialized_packet_);
158 }
159
160 protected:
161 QuicPacketCreatorTest()
162 : connection_id_(TestConnectionId(2)),
163 server_framer_(SupportedVersions(GetParam().version),
164 QuicTime::Zero(),
165 Perspective::IS_SERVER,
166 connection_id_.length()),
167 client_framer_(SupportedVersions(GetParam().version),
168 QuicTime::Zero(),
169 Perspective::IS_CLIENT,
170 connection_id_.length()),
171 data_("foo"),
172 creator_(connection_id_, &client_framer_, &delegate_, &producer_),
173 serialized_packet_(creator_.NoPacket()) {
174 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
nharperc6b99512019-09-19 11:13:48 -0700175 creator_.SetEncrypter(ENCRYPTION_INITIAL, std::make_unique<NullEncrypter>(
176 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700177 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, std::make_unique<NullEncrypter>(
QUICHE team88ea0082019-03-15 10:05:26 -0700178 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700179 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, std::make_unique<NullEncrypter>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500180 Perspective::IS_CLIENT));
181 creator_.SetEncrypter(
182 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700183 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500184 client_framer_.set_visitor(&framer_visitor_);
185 server_framer_.set_visitor(&framer_visitor_);
186 client_framer_.set_data_producer(&producer_);
zhongyi546cc452019-04-12 15:27:49 -0700187 if (server_framer_.version().KnowsWhichDecrypterToUse()) {
188 server_framer_.InstallDecrypter(
nharperc6b99512019-09-19 11:13:48 -0700189 ENCRYPTION_INITIAL,
190 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
191 server_framer_.InstallDecrypter(
zhongyi546cc452019-04-12 15:27:49 -0700192 ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -0700193 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700194 server_framer_.InstallDecrypter(
195 ENCRYPTION_HANDSHAKE,
vasilvv0fc587f2019-09-06 13:33:08 -0700196 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700197 server_framer_.InstallDecrypter(
198 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700199 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
nharperc6b99512019-09-19 11:13:48 -0700200 } else {
201 server_framer_.SetDecrypter(
202 ENCRYPTION_INITIAL,
203 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700204 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500205 }
206
207 ~QuicPacketCreatorTest() override {
208 delete[] serialized_packet_.encrypted_buffer;
209 ClearSerializedPacket(&serialized_packet_);
210 }
211
212 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
213 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
dschinazi66dea072019-04-09 11:41:06 -0700214 &creator_, frames, buffer_, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500215 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
216 packet.encryption_level);
217 return packet;
218 }
219
220 void ProcessPacket(const SerializedPacket& packet) {
221 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
222 packet.encrypted_length);
223 server_framer_.ProcessPacket(encrypted_packet);
224 }
225
226 void CheckStreamFrame(const QuicFrame& frame,
227 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700228 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229 QuicStreamOffset offset,
230 bool fin) {
231 EXPECT_EQ(STREAM_FRAME, frame.type);
232 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
dschinazi66dea072019-04-09 11:41:06 -0700233 char buf[kMaxOutgoingPacketSize];
QUICHE team173c48f2019-11-19 16:34:44 -0800234 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, quiche::HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500235 if (frame.stream_frame.data_length > 0) {
236 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
237 frame.stream_frame.data_length, &writer);
238 }
dmcardlecf0bfcf2019-12-13 08:08:21 -0800239 EXPECT_EQ(data,
240 quiche::QuicheStringPiece(buf, frame.stream_frame.data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500241 EXPECT_EQ(offset, frame.stream_frame.offset);
242 EXPECT_EQ(fin, frame.stream_frame.fin);
243 }
244
245 // Returns the number of bytes consumed by the header of packet, including
246 // the version.
247 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
248 return GetPacketHeaderSize(
249 version, creator_.GetDestinationConnectionIdLength(),
250 creator_.GetSourceConnectionIdLength(),
251 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
252 !kIncludeDiversificationNonce,
253 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
254 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
255 QuicPacketCreatorPeer::GetLengthLength(&creator_));
256 }
257
258 // Returns the number of bytes of overhead that will be added to a packet
259 // of maximum length.
260 size_t GetEncryptionOverhead() {
261 return creator_.max_packet_length() -
262 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
263 }
264
265 // Returns the number of bytes consumed by the non-data fields of a stream
266 // frame, assuming it is the last frame in the packet
267 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
268 return QuicFramer::GetMinStreamFrameSize(
269 version, GetNthClientInitiatedStreamId(1), kOffset, true,
270 /* data_length= */ 0);
271 }
272
QUICHE teama6ef0a62019-03-07 20:34:33 -0500273 bool IsDefaultTestConfiguration() {
274 TestParams p = GetParam();
275 return p.version == AllSupportedVersions()[0] && p.version_serialization;
276 }
277
278 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
dschinazi552accc2019-06-17 17:07:34 -0700279 return QuicUtils::GetFirstBidirectionalStreamId(
280 creator_.transport_version(), Perspective::IS_CLIENT) +
281 n * 2;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500282 }
283
284 static const QuicStreamOffset kOffset = 0u;
285
dschinazi66dea072019-04-09 11:41:06 -0700286 char buffer_[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500287 QuicConnectionId connection_id_;
288 QuicFrames frames_;
289 QuicFramer server_framer_;
290 QuicFramer client_framer_;
291 StrictMock<MockFramerVisitor> framer_visitor_;
292 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700293 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500294 struct iovec iov_;
295 TestPacketCreator creator_;
296 SerializedPacket serialized_packet_;
297 SimpleDataProducer producer_;
298 SimpleBufferAllocator allocator_;
299};
300
301// Run all packet creator tests with all supported versions of QUIC, and with
302// and without version in the packet header, as well as doing a run for each
303// length of truncated connection id.
304INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
305 QuicPacketCreatorTest,
dschinazi142051a2019-09-18 18:17:29 -0700306 ::testing::ValuesIn(GetTestParams()),
307 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500308
309TEST_P(QuicPacketCreatorTest, SerializeFrames) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700310 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500311 EncryptionLevel level = static_cast<EncryptionLevel>(i);
312 creator_.set_encryption_level(level);
313 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700314 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
315 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang49523232019-05-03 06:28:22 -0700316 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800317 frames_.push_back(QuicFrame(
318 QuicStreamFrame(stream_id, false, 0u, quiche::QuicheStringPiece())));
renjietang6beb5112019-11-11 14:43:19 -0800319 if (!GetQuicRestartFlag(quic_coalesce_stream_frames_2)) {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800320 frames_.push_back(QuicFrame(
321 QuicStreamFrame(stream_id, true, 0u, quiche::QuicheStringPiece())));
renjietangdbe98342019-10-18 11:00:57 -0700322 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700323 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500324 SerializedPacket serialized = SerializeAllFrames(frames_);
325 EXPECT_EQ(level, serialized.encryption_level);
326 delete frames_[0].ack_frame;
327 frames_.clear();
328
329 {
330 InSequence s;
331 EXPECT_CALL(framer_visitor_, OnPacket());
332 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
333 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
334 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
335 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
336 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
337 .WillOnce(Return(true));
338 EXPECT_CALL(framer_visitor_,
339 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
340 .WillOnce(Return(true));
341 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
342 .WillOnce(Return(true));
fayang49523232019-05-03 06:28:22 -0700343 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700344 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
renjietang6beb5112019-11-11 14:43:19 -0800345 if (!GetQuicRestartFlag(quic_coalesce_stream_frames_2)) {
renjietangdbe98342019-10-18 11:00:57 -0700346 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
347 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700348 }
nharperc32d8ab2019-10-09 11:09:06 -0700349 if (client_framer_.version().HasHeaderProtection()) {
350 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_))
351 .Times(testing::AnyNumber());
352 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500353 EXPECT_CALL(framer_visitor_, OnPacketComplete());
354 }
355 ProcessPacket(serialized);
356 }
357}
358
QUICHE teama6ef0a62019-03-07 20:34:33 -0500359TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
renjietang4c704c82019-10-07 16:39:11 -0700360 QuicConnectionCloseFrame frame(creator_.transport_version(), QUIC_NO_ERROR,
361 "error",
fkastenholz591814c2019-09-06 12:11:46 -0700362 /*transport_close_frame_type=*/0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500363
364 QuicFrames frames;
365 frames.push_back(QuicFrame(&frame));
366 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700367 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500368 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
369 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
370
371 InSequence s;
372 EXPECT_CALL(framer_visitor_, OnPacket());
373 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
374 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
375 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
376 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
377 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
378 EXPECT_CALL(framer_visitor_, OnPacketComplete());
379
380 ProcessPacket(serialized);
381}
382
fayang62b637b2019-09-16 08:40:49 -0700383TEST_P(QuicPacketCreatorTest, ConsumeCryptoDataToFillCurrentPacket) {
vasilvvc48c8712019-03-11 13:38:16 -0700384 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500385 QuicFrame frame;
fayang62b637b2019-09-16 08:40:49 -0700386 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
387 ENCRYPTION_INITIAL, data.length(), 0,
388 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500389 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
390 EXPECT_TRUE(creator_.HasPendingFrames());
391}
392
fayang62b637b2019-09-16 08:40:49 -0700393TEST_P(QuicPacketCreatorTest, ConsumeDataToFillCurrentPacket) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700394 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500395 QuicFrame frame;
396 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700397 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
398 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700399 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
400 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
401 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 size_t consumed = frame.stream_frame.data_length;
403 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700404 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405 EXPECT_TRUE(creator_.HasPendingFrames());
406}
407
408TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700409 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500410 QuicFrame frame;
411 MakeIOVector("test", &iov_);
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, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
416 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500417 size_t consumed = frame.stream_frame.data_length;
418 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700419 CheckStreamFrame(frame, stream_id, "test", 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500420 EXPECT_TRUE(creator_.HasPendingFrames());
421}
422
423TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700424 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500425 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700426 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
427 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700428 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
429 stream_id, nullptr, 0u, 0u, 0u, 0u, true, false, NOT_RETRANSMISSION,
430 &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500431 size_t consumed = frame.stream_frame.data_length;
432 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700433 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500434 EXPECT_TRUE(creator_.HasPendingFrames());
435}
436
437TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
438 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
439 const size_t overhead =
440 GetPacketHeaderOverhead(client_framer_.transport_version()) +
441 GetEncryptionOverhead();
QUICHE team2252b702019-05-14 23:55:14 -0400442 for (size_t i = overhead + QuicPacketCreator::MinPlaintextPacketSize(
443 client_framer_.version());
nharper55fa6132019-05-07 19:37:21 -0700444 i < overhead + 100; ++i) {
445 SCOPED_TRACE(i);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500446 creator_.SetMaxPacketLength(i);
447 const bool should_have_room =
448 i >
449 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
450 ASSERT_EQ(should_have_room,
451 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
452 kOffset, /* data_size=*/0xffff));
453 if (should_have_room) {
454 QuicFrame frame;
455 MakeIOVector("testdata", &iov_);
456 EXPECT_CALL(delegate_, OnSerializedPacket(_))
457 .WillRepeatedly(Invoke(
458 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
fayang62b637b2019-09-16 08:40:49 -0700459 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
460 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u,
461 kOffset, false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500462 size_t bytes_consumed = frame.stream_frame.data_length;
463 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700464 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500465 }
466 }
467}
468
469TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
470 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
471 // Compute the total overhead for a single frame in packet.
472 const size_t overhead =
473 GetPacketHeaderOverhead(client_framer_.transport_version()) +
474 GetEncryptionOverhead() +
475 GetStreamFrameOverhead(client_framer_.transport_version());
476 size_t capacity = kDefaultMaxPacketSize - overhead;
477 // Now, test various sizes around this size.
478 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700479 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500480 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
481 QuicFrame frame;
482 MakeIOVector(data, &iov_);
fayang62b637b2019-09-16 08:40:49 -0700483 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
484 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
485 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500486
487 // BytesFree() returns bytes available for the next frame, which will
488 // be two bytes smaller since the stream frame would need to be grown.
489 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
490 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
491 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
492 EXPECT_CALL(delegate_, OnSerializedPacket(_))
493 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700494 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500495 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
496 DeleteSerializedPacket();
497 }
498}
499
500TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700501 // This test serializes crypto payloads slightly larger than a packet, which
502 // Causes the multi-packet ClientHello check to fail.
danzh88e3e052019-06-13 11:47:18 -0700503 SetQuicFlag(FLAGS_quic_enforce_single_packet_chlo, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500504 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700505 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500506 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700507 GetEncryptionOverhead();
508 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
dschinazi66dea072019-04-09 11:41:06 -0700509 overhead +=
510 QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxOutgoingPacketSize);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700511 } else {
512 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
513 }
dschinazi66dea072019-04-09 11:41:06 -0700514 ASSERT_GT(kMaxOutgoingPacketSize, overhead);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500515 size_t capacity = kDefaultMaxPacketSize - overhead;
516 // Now, test various sizes around this size.
517 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700518 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700519 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500520 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
521
522 QuicFrame frame;
523 MakeIOVector(data, &iov_);
524 EXPECT_CALL(delegate_, OnSerializedPacket(_))
525 .WillRepeatedly(
526 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700527 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
fayang62b637b2019-09-16 08:40:49 -0700528 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700529 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
530 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
531 &frame));
532 size_t bytes_consumed = frame.stream_frame.data_length;
533 EXPECT_LT(0u, bytes_consumed);
534 } else {
535 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
fayang62b637b2019-09-16 08:40:49 -0700536 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
nharper51961cf2019-05-13 13:23:24 -0700537 ENCRYPTION_INITIAL, data.length(), kOffset,
538 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700539 size_t bytes_consumed = frame.crypto_frame->data_length;
540 EXPECT_LT(0u, bytes_consumed);
541 }
fayang62b637b2019-09-16 08:40:49 -0700542 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500543 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
544 // If there is not enough space in the packet to fit a padding frame
545 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
546 // will not be padded.
fayang58f71072019-11-05 08:47:02 -0800547 // Padding is skipped when we try to send coalesced packets.
548 if ((bytes_free < 3 &&
549 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) ||
550 client_framer_.version().CanSendCoalescedPackets()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500551 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
552 serialized_packet_.encrypted_length);
553 } else {
554 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
555 }
556 DeleteSerializedPacket();
557 }
558}
559
560TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
561 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
562 // Compute the total overhead for a single frame in packet.
563 const size_t overhead =
564 GetPacketHeaderOverhead(client_framer_.transport_version()) +
565 GetEncryptionOverhead() +
566 GetStreamFrameOverhead(client_framer_.transport_version());
567 ASSERT_GT(kDefaultMaxPacketSize, overhead);
568 size_t capacity = kDefaultMaxPacketSize - overhead;
569 // Now, test various sizes around this size.
570 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700571 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500572 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
573
574 QuicFrame frame;
575 MakeIOVector(data, &iov_);
576 EXPECT_CALL(delegate_, OnSerializedPacket(_))
577 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700578 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
579 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
580 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500581 size_t bytes_consumed = frame.stream_frame.data_length;
582 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700583 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500584 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
585 if (bytes_free > 0) {
586 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
587 serialized_packet_.encrypted_length);
588 } else {
589 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
590 }
591 DeleteSerializedPacket();
592 }
593}
594
595TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
596 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
597 ParsedQuicVersionVector versions;
598 versions.push_back(test::QuicVersionMax());
fayangd4291e42019-05-30 10:31:21 -0700599 const bool ietf_quic =
renjietang4c704c82019-10-07 16:39:11 -0700600 VersionHasIetfInvariantHeader(creator_.transport_version());
dschinazi48ac9192019-07-31 00:07:26 -0700601 const bool has_length_prefix =
602 GetParam().version.HasLengthPrefixedConnectionIds();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500603 std::unique_ptr<QuicEncryptedPacket> encrypted(
dschinazi48ac9192019-07-31 00:07:26 -0700604 creator_.SerializeVersionNegotiationPacket(ietf_quic, has_length_prefix,
605 versions));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500606
607 {
608 InSequence s;
609 EXPECT_CALL(framer_visitor_, OnPacket());
610 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
611 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
612 }
613 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
614 client_framer_.ProcessPacket(*encrypted);
615}
616
renjietang4c704c82019-10-07 16:39:11 -0700617// Test that the path challenge connectivity probing packet is serialized
618// correctly as a padded PATH CHALLENGE packet.
619TEST_P(QuicPacketCreatorTest, BuildPathChallengePacket) {
620 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
621 // This frame is only for IETF QUIC.
622 return;
623 }
624
625 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700626 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700627 header.reset_flag = false;
628 header.version_flag = false;
629 header.packet_number = kPacketNumber;
630 QuicPathFrameBuffer payload;
631
632 // clang-format off
633 unsigned char packet[] = {
634 // type (short header, 4 byte packet number)
635 0x43,
636 // connection_id
637 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
638 // packet number
639 0x12, 0x34, 0x56, 0x78,
640
641 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
642 0x1a,
643 // 8 "random" bytes, MockRandom makes lots of r's
644 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
645 // frame type (padding frame)
646 0x00,
647 0x00, 0x00, 0x00, 0x00
648 };
649 // clang-format on
650
651 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
652 MockRandom randomizer;
653
654 size_t length = creator_.BuildPaddedPathChallengePacket(
655 header, buffer.get(), QUIC_ARRAYSIZE(packet), &payload, &randomizer,
656 ENCRYPTION_INITIAL);
657 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
658
659 // Payload has the random bytes that were generated. Copy them into packet,
660 // above, before checking that the generated packet is correct.
661 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
662
663 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
664 header);
665
666 test::CompareCharArraysWithHexError(
667 "constructed packet", data.data(), data.length(),
668 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
669}
670
671TEST_P(QuicPacketCreatorTest, BuildConnectivityProbingPacket) {
672 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700673 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700674 header.reset_flag = false;
675 header.version_flag = false;
676 header.packet_number = kPacketNumber;
677
678 // clang-format off
679 unsigned char packet[] = {
680 // public flags (8 byte connection_id)
681 0x2C,
682 // connection_id
683 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
684 // packet number
685 0x12, 0x34, 0x56, 0x78,
686
687 // frame type (ping frame)
688 0x07,
689 // frame type (padding frame)
690 0x00,
691 0x00, 0x00, 0x00, 0x00
692 };
693
694 unsigned char packet46[] = {
695 // type (short header, 4 byte packet number)
696 0x43,
697 // connection_id
698 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
699 // packet number
700 0x12, 0x34, 0x56, 0x78,
701
702 // frame type
703 0x07,
704 // frame type (padding frame)
705 0x00,
706 0x00, 0x00, 0x00, 0x00
707 };
708
709 unsigned char packet99[] = {
710 // type (short header, 4 byte packet number)
711 0x43,
712 // connection_id
713 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
714 // packet number
715 0x12, 0x34, 0x56, 0x78,
716
717 // frame type (IETF_PING frame)
718 0x01,
719 // frame type (padding frame)
720 0x00,
721 0x00, 0x00, 0x00, 0x00
722 };
723 // clang-format on
724
725 unsigned char* p = packet;
726 size_t packet_size = QUIC_ARRAYSIZE(packet);
727 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
728 p = packet99;
729 packet_size = QUIC_ARRAYSIZE(packet99);
730 } else if (creator_.transport_version() >= QUIC_VERSION_46) {
731 p = packet46;
732 packet_size = QUIC_ARRAYSIZE(packet46);
733 }
734
735 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
736
737 size_t length = creator_.BuildConnectivityProbingPacket(
738 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
739
740 EXPECT_NE(0u, length);
741 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
742 header);
743
744 test::CompareCharArraysWithHexError("constructed packet", data.data(),
745 data.length(), reinterpret_cast<char*>(p),
746 packet_size);
747}
748
749// Several tests that the path response connectivity probing packet is
750// serialized correctly as either a padded and unpadded PATH RESPONSE
751// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
752// exercised the single- and multiple- payload cases.
753TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponseUnpadded) {
754 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
755 // This frame is only for IETF QUIC.
756 return;
757 }
758
759 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700760 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700761 header.reset_flag = false;
762 header.version_flag = false;
763 header.packet_number = kPacketNumber;
764 QuicPathFrameBuffer payload0 = {
765 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
766
767 // Build 1 PATH RESPONSE, not padded
768 // clang-format off
769 unsigned char packet[] = {
770 // type (short header, 4 byte packet number)
771 0x43,
772 // connection_id
773 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
774 // packet number
775 0x12, 0x34, 0x56, 0x78,
776
777 // Path Response Frame type (IETF_PATH_RESPONSE)
778 0x1b,
779 // 8 "random" bytes
780 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
781 };
782 // clang-format on
783 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
784 QuicDeque<QuicPathFrameBuffer> payloads;
785 payloads.push_back(payload0);
786 size_t length = creator_.BuildPathResponsePacket(
787 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
788 /*is_padded=*/false, ENCRYPTION_INITIAL);
789 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
790 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
791 header);
792
793 test::CompareCharArraysWithHexError(
794 "constructed packet", data.data(), data.length(),
795 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
796}
797
798TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponsePadded) {
799 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
800 // This frame is only for IETF QUIC.
801 return;
802 }
803
804 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700805 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700806 header.reset_flag = false;
807 header.version_flag = false;
808 header.packet_number = kPacketNumber;
809 QuicPathFrameBuffer payload0 = {
810 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
811
812 // Build 1 PATH RESPONSE, padded
813 // clang-format off
814 unsigned char packet[] = {
815 // type (short header, 4 byte packet number)
816 0x43,
817 // connection_id
818 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
819 // packet number
820 0x12, 0x34, 0x56, 0x78,
821
822 // Path Response Frame type (IETF_PATH_RESPONSE)
823 0x1b,
824 // 8 "random" bytes
825 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
826 // Padding type and pad
827 0x00, 0x00, 0x00, 0x00, 0x00
828 };
829 // clang-format on
830 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
831 QuicDeque<QuicPathFrameBuffer> payloads;
832 payloads.push_back(payload0);
833 size_t length = creator_.BuildPathResponsePacket(
834 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
835 /*is_padded=*/true, ENCRYPTION_INITIAL);
836 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
837 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
838 header);
839
840 test::CompareCharArraysWithHexError(
841 "constructed packet", data.data(), data.length(),
842 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
843}
844
845TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesUnpadded) {
846 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
847 // This frame is only for IETF QUIC.
848 return;
849 }
850
851 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700852 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700853 header.reset_flag = false;
854 header.version_flag = false;
855 header.packet_number = kPacketNumber;
856 QuicPathFrameBuffer payload0 = {
857 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
858 QuicPathFrameBuffer payload1 = {
859 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
860 QuicPathFrameBuffer payload2 = {
861 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
862
863 // Build one packet with 3 PATH RESPONSES, no padding
864 // clang-format off
865 unsigned char packet[] = {
866 // type (short header, 4 byte packet number)
867 0x43,
868 // connection_id
869 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
870 // packet number
871 0x12, 0x34, 0x56, 0x78,
872
873 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
874 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
875 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
876 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
877 };
878 // clang-format on
879
880 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
881 QuicDeque<QuicPathFrameBuffer> payloads;
882 payloads.push_back(payload0);
883 payloads.push_back(payload1);
884 payloads.push_back(payload2);
885 size_t length = creator_.BuildPathResponsePacket(
886 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
887 /*is_padded=*/false, ENCRYPTION_INITIAL);
888 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
889 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
890 header);
891
892 test::CompareCharArraysWithHexError(
893 "constructed packet", data.data(), data.length(),
894 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
895}
896
897TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesPadded) {
898 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
899 // This frame is only for IETF QUIC.
900 return;
901 }
902
903 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700904 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700905 header.reset_flag = false;
906 header.version_flag = false;
907 header.packet_number = kPacketNumber;
908 QuicPathFrameBuffer payload0 = {
909 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
910 QuicPathFrameBuffer payload1 = {
911 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
912 QuicPathFrameBuffer payload2 = {
913 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
914
915 // Build one packet with 3 PATH RESPONSES, with padding
916 // clang-format off
917 unsigned char packet[] = {
918 // type (short header, 4 byte packet number)
919 0x43,
920 // connection_id
921 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
922 // packet number
923 0x12, 0x34, 0x56, 0x78,
924
925 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
926 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
927 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
928 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
929 // Padding
930 0x00, 0x00, 0x00, 0x00, 0x00
931 };
932 // clang-format on
933
934 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
935 QuicDeque<QuicPathFrameBuffer> payloads;
936 payloads.push_back(payload0);
937 payloads.push_back(payload1);
938 payloads.push_back(payload2);
939 size_t length = creator_.BuildPathResponsePacket(
940 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
941 /*is_padded=*/true, ENCRYPTION_INITIAL);
942 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
943 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
944 header);
945
946 test::CompareCharArraysWithHexError(
947 "constructed packet", data.data(), data.length(),
948 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
949}
950
QUICHE teama6ef0a62019-03-07 20:34:33 -0500951TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700952 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500953 EncryptionLevel level = static_cast<EncryptionLevel>(i);
954
955 creator_.set_encryption_level(level);
956
957 OwningSerializedPacketPointer encrypted;
renjietang4c704c82019-10-07 16:39:11 -0700958 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500959 QuicPathFrameBuffer payload = {
960 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
961 encrypted =
962 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
963 } else {
964 encrypted = creator_.SerializeConnectivityProbingPacket();
965 }
966 {
967 InSequence s;
968 EXPECT_CALL(framer_visitor_, OnPacket());
969 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
970 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
971 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
972 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
renjietang4c704c82019-10-07 16:39:11 -0700973 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500974 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
975 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
976 } else {
977 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
978 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
979 }
980 EXPECT_CALL(framer_visitor_, OnPacketComplete());
981 }
982 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
983 server_framer_.ProcessPacket(QuicEncryptedPacket(
984 encrypted->encrypted_buffer, encrypted->encrypted_length));
985 }
986}
987
988TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
renjietang4c704c82019-10-07 16:39:11 -0700989 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500990 return;
991 }
992 QuicPathFrameBuffer payload = {
993 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
994
QUICHE team6987b4a2019-03-15 16:23:04 -0700995 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500996 EncryptionLevel level = static_cast<EncryptionLevel>(i);
997
998 creator_.set_encryption_level(level);
999
1000 OwningSerializedPacketPointer encrypted(
1001 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
1002 {
1003 InSequence s;
1004 EXPECT_CALL(framer_visitor_, OnPacket());
1005 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1006 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1007 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1008 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1009 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
1010 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1011 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1012 }
1013 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
1014 server_framer_.ProcessPacket(QuicEncryptedPacket(
1015 encrypted->encrypted_buffer, encrypted->encrypted_length));
1016 }
1017}
1018
1019TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001020 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001021 return;
1022 }
1023 QuicPathFrameBuffer payload0 = {
1024 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1025
QUICHE team6987b4a2019-03-15 16:23:04 -07001026 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001027 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1028 creator_.set_encryption_level(level);
1029
1030 QuicDeque<QuicPathFrameBuffer> payloads;
1031 payloads.push_back(payload0);
1032
1033 OwningSerializedPacketPointer encrypted(
1034 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1035 true));
1036 {
1037 InSequence s;
1038 EXPECT_CALL(framer_visitor_, OnPacket());
1039 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1040 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1041 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1042 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1043 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1044 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1045 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1046 }
1047 server_framer_.ProcessPacket(QuicEncryptedPacket(
1048 encrypted->encrypted_buffer, encrypted->encrypted_length));
1049 }
1050}
1051
1052TEST_P(QuicPacketCreatorTest,
1053 SerializePathResponseProbePacket1PayloadUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001054 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001055 return;
1056 }
1057 QuicPathFrameBuffer payload0 = {
1058 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1059
QUICHE team6987b4a2019-03-15 16:23:04 -07001060 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001061 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1062 creator_.set_encryption_level(level);
1063
1064 QuicDeque<QuicPathFrameBuffer> payloads;
1065 payloads.push_back(payload0);
1066
1067 OwningSerializedPacketPointer encrypted(
1068 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1069 false));
1070 {
1071 InSequence s;
1072 EXPECT_CALL(framer_visitor_, OnPacket());
1073 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1074 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1075 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1076 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1077 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1078 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1079 }
1080 server_framer_.ProcessPacket(QuicEncryptedPacket(
1081 encrypted->encrypted_buffer, encrypted->encrypted_length));
1082 }
1083}
1084
1085TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001086 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001087 return;
1088 }
1089 QuicPathFrameBuffer payload0 = {
1090 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1091 QuicPathFrameBuffer payload1 = {
1092 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1093
QUICHE team6987b4a2019-03-15 16:23:04 -07001094 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001095 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1096 creator_.set_encryption_level(level);
1097
1098 QuicDeque<QuicPathFrameBuffer> payloads;
1099 payloads.push_back(payload0);
1100 payloads.push_back(payload1);
1101
1102 OwningSerializedPacketPointer encrypted(
1103 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1104 true));
1105 {
1106 InSequence s;
1107 EXPECT_CALL(framer_visitor_, OnPacket());
1108 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1109 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1110 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1111 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1112 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1113 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1114 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1115 }
1116 server_framer_.ProcessPacket(QuicEncryptedPacket(
1117 encrypted->encrypted_buffer, encrypted->encrypted_length));
1118 }
1119}
1120
1121TEST_P(QuicPacketCreatorTest,
1122 SerializePathResponseProbePacket2PayloadsUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001123 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001124 return;
1125 }
1126 QuicPathFrameBuffer payload0 = {
1127 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1128 QuicPathFrameBuffer payload1 = {
1129 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1130
QUICHE team6987b4a2019-03-15 16:23:04 -07001131 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001132 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1133 creator_.set_encryption_level(level);
1134
1135 QuicDeque<QuicPathFrameBuffer> payloads;
1136 payloads.push_back(payload0);
1137 payloads.push_back(payload1);
1138
1139 OwningSerializedPacketPointer encrypted(
1140 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1141 false));
1142 {
1143 InSequence s;
1144 EXPECT_CALL(framer_visitor_, OnPacket());
1145 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1146 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1147 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1148 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1149 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1150 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1151 }
1152 server_framer_.ProcessPacket(QuicEncryptedPacket(
1153 encrypted->encrypted_buffer, encrypted->encrypted_length));
1154 }
1155}
1156
1157TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001158 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001159 return;
1160 }
1161 QuicPathFrameBuffer payload0 = {
1162 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1163 QuicPathFrameBuffer payload1 = {
1164 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1165 QuicPathFrameBuffer payload2 = {
1166 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1167
QUICHE team6987b4a2019-03-15 16:23:04 -07001168 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001169 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1170 creator_.set_encryption_level(level);
1171
1172 QuicDeque<QuicPathFrameBuffer> payloads;
1173 payloads.push_back(payload0);
1174 payloads.push_back(payload1);
1175 payloads.push_back(payload2);
1176
1177 OwningSerializedPacketPointer encrypted(
1178 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1179 true));
1180 {
1181 InSequence s;
1182 EXPECT_CALL(framer_visitor_, OnPacket());
1183 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1184 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1185 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1186 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1187 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1188 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1189 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1190 }
1191 server_framer_.ProcessPacket(QuicEncryptedPacket(
1192 encrypted->encrypted_buffer, encrypted->encrypted_length));
1193 }
1194}
1195
1196TEST_P(QuicPacketCreatorTest,
1197 SerializePathResponseProbePacket3PayloadsUnpadded) {
renjietang4c704c82019-10-07 16:39:11 -07001198 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001199 return;
1200 }
1201 QuicPathFrameBuffer payload0 = {
1202 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1203 QuicPathFrameBuffer payload1 = {
1204 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1205 QuicPathFrameBuffer payload2 = {
1206 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1207
QUICHE team6987b4a2019-03-15 16:23:04 -07001208 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001209 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1210 creator_.set_encryption_level(level);
1211
1212 QuicDeque<QuicPathFrameBuffer> payloads;
1213 payloads.push_back(payload0);
1214 payloads.push_back(payload1);
1215 payloads.push_back(payload2);
1216
1217 OwningSerializedPacketPointer encrypted(
1218 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1219 false));
1220 InSequence s;
1221 EXPECT_CALL(framer_visitor_, OnPacket());
1222 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1223 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1224 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1225 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1226 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1227 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1228
1229 server_framer_.ProcessPacket(QuicEncryptedPacket(
1230 encrypted->encrypted_buffer, encrypted->encrypted_length));
1231 }
1232}
1233
1234TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
renjietang4c704c82019-10-07 16:39:11 -07001235 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001236 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001237 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1238 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1239 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1240 } else {
1241 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1242 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1243 }
1244
1245 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1246 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1247 10000 / kDefaultMaxPacketSize);
1248 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1249 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1250
1251 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1252 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1253 10000 / kDefaultMaxPacketSize);
1254 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1255 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1256
1257 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1258 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1259 10000 / kDefaultMaxPacketSize);
1260 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1261 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1262
1263 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1264 UINT64_C(64) * 256 * 256 * 256 * 256);
1265 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1266 10000 / kDefaultMaxPacketSize);
1267 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1268 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1269}
1270
1271TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1272 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001273 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001274 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001275 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1276 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1277 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1278 } else {
1279 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1280 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1281 }
1282
1283 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1284 10000 / kDefaultMaxPacketSize);
1285 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1286 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1287
1288 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1289 10000 * 256 / kDefaultMaxPacketSize);
1290 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1291 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1292
1293 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1294 10000 * 256 * 256 / kDefaultMaxPacketSize);
1295 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1296 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1297
1298 creator_.UpdatePacketNumberLength(
1299 QuicPacketNumber(1),
1300 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1301 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1302 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1303}
1304
fayang4c1c2362019-09-13 07:20:01 -07001305TEST_P(QuicPacketCreatorTest, SkipNPacketNumbers) {
1306 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001307 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang4c1c2362019-09-13 07:20:01 -07001308 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1309 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1310 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1311 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1312 } else {
1313 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1314 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1315 }
1316 creator_.SkipNPacketNumbers(63, QuicPacketNumber(2),
1317 10000 / kDefaultMaxPacketSize);
1318 EXPECT_EQ(QuicPacketNumber(64), creator_.packet_number());
1319 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1320 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1321
1322 creator_.SkipNPacketNumbers(64 * 255, QuicPacketNumber(2),
1323 10000 / kDefaultMaxPacketSize);
1324 EXPECT_EQ(QuicPacketNumber(64 * 256), creator_.packet_number());
1325 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1326 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1327
1328 creator_.SkipNPacketNumbers(64 * 256 * 255, QuicPacketNumber(2),
1329 10000 / kDefaultMaxPacketSize);
1330 EXPECT_EQ(QuicPacketNumber(64 * 256 * 256), creator_.packet_number());
1331 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1332 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1333}
1334
QUICHE teama6ef0a62019-03-07 20:34:33 -05001335TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1336 if (!GetParam().version_serialization) {
1337 creator_.StopSendingVersion();
1338 }
nharper55fa6132019-05-07 19:37:21 -07001339 std::string data("test data");
1340 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1341 QuicStreamFrame stream_frame(
1342 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001343 /*fin=*/false, 0u, quiche::QuicheStringPiece());
nharper55fa6132019-05-07 19:37:21 -07001344 frames_.push_back(QuicFrame(stream_frame));
1345 } else {
1346 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1347 frames_.push_back(
1348 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1349 }
1350 SerializedPacket serialized = SerializeAllFrames(frames_);
1351
1352 QuicPacketHeader header;
1353 {
1354 InSequence s;
1355 EXPECT_CALL(framer_visitor_, OnPacket());
1356 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1357 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1358 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1359 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1360 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1361 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1362 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1363 } else {
1364 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1365 }
1366 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1367 }
1368 ProcessPacket(serialized);
1369 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1370 DeleteFrames(&frames_);
1371}
1372
1373TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
1374 if (!GetParam().version_serialization) {
1375 creator_.StopSendingVersion();
1376 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001377 std::string data("a");
1378 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1379 QuicStreamFrame stream_frame(
1380 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001381 /*fin=*/false, 0u, quiche::QuicheStringPiece());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001382 frames_.push_back(QuicFrame(stream_frame));
1383 } else {
1384 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1385 frames_.push_back(
1386 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1387 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001388 SerializedPacket serialized = SerializeAllFrames(frames_);
1389
1390 QuicPacketHeader header;
1391 {
1392 InSequence s;
1393 EXPECT_CALL(framer_visitor_, OnPacket());
1394 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1395 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1396 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1397 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1398 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001399 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1400 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1401 } else {
1402 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1403 }
nharper55fa6132019-05-07 19:37:21 -07001404 if (client_framer_.version().HasHeaderProtection()) {
1405 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1406 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001407 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1408 }
1409 ProcessPacket(serialized);
1410 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001411 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001412}
1413
1414TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1415 if (!GetParam().version_serialization) {
1416 creator_.StopSendingVersion();
1417 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001418 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001419 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001420 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001421 size_t payload_length = creator_.max_packet_length();
1422 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001423 MakeIOVector(too_long_payload, &iov_);
1424 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1425 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001426 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1427 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001428 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1429 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
1430 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001431 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001432 // The entire payload could not be consumed.
1433 EXPECT_GT(payload_length, consumed);
fayang62b637b2019-09-16 08:40:49 -07001434 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001435 DeleteSerializedPacket();
1436}
1437
1438TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1439 if (!GetParam().version_serialization) {
1440 creator_.StopSendingVersion();
1441 }
1442 const size_t max_plaintext_size =
1443 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1444 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001445 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1446 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1447 client_framer_.transport_version(), Perspective::IS_CLIENT);
1448 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1449 stream_id =
1450 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1451 }
1452 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001453 EXPECT_EQ(max_plaintext_size -
1454 GetPacketHeaderSize(
1455 client_framer_.transport_version(),
1456 creator_.GetDestinationConnectionIdLength(),
1457 creator_.GetSourceConnectionIdLength(),
1458 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1459 !kIncludeDiversificationNonce,
1460 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1461 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1462 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1463 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001464 StrictMock<MockDebugDelegate> debug;
1465 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001466
1467 // Add a variety of frame types and then a padding frame.
1468 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001469 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
renjietangb63005e2019-11-19 23:08:53 -08001470 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001471 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001472 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001473
1474 QuicFrame frame;
1475 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001476 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
fayang62b637b2019-09-16 08:40:49 -07001477 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1478 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1479 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001480 size_t consumed = frame.stream_frame.data_length;
1481 EXPECT_EQ(4u, consumed);
1482 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001483 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001484
1485 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001486 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
renjietangb63005e2019-11-19 23:08:53 -08001487 EXPECT_TRUE(creator_.AddFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001488 EXPECT_TRUE(creator_.HasPendingFrames());
1489 EXPECT_EQ(0u, creator_.BytesFree());
1490
1491 // Packet is full. Creator will flush.
1492 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1493 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
renjietangb63005e2019-11-19 23:08:53 -08001494 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001495
1496 // Ensure the packet is successfully created.
1497 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1498 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1499 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1500 ASSERT_EQ(1u, retransmittable.size());
1501 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1502 EXPECT_TRUE(serialized_packet_.has_ack);
1503 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1504 DeleteSerializedPacket();
1505
1506 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001507 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001508 EXPECT_EQ(max_plaintext_size -
1509 GetPacketHeaderSize(
1510 client_framer_.transport_version(),
1511 creator_.GetDestinationConnectionIdLength(),
1512 creator_.GetSourceConnectionIdLength(),
1513 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1514 !kIncludeDiversificationNonce,
1515 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1516 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1517 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1518 creator_.BytesFree());
1519}
1520
1521TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1522 if (!GetParam().version_serialization) {
1523 creator_.StopSendingVersion();
1524 }
1525 EXPECT_FALSE(creator_.HasPendingFrames());
1526
1527 MakeIOVector("test", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001528 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1529 iov_.iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001530 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1531 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1532 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001533 StrictMock<MockDebugDelegate> debug;
1534 creator_.set_debug_delegate(&debug);
1535 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001536 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001537 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1538 NOT_RETRANSMISSION, &num_bytes_consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001539 EXPECT_EQ(4u, num_bytes_consumed);
1540
1541 // Ensure the packet is successfully created.
1542 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1543 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1544 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1545 ASSERT_EQ(1u, retransmittable.size());
1546 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1547 DeleteSerializedPacket();
1548
1549 EXPECT_FALSE(creator_.HasPendingFrames());
1550}
1551
nharperebabffd2019-06-03 17:34:45 -07001552TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1553 // Regression test to check that CreateAndSerializeStreamFrame uses a
1554 // correctly formatted stream frame header when appending padding.
1555
1556 if (!GetParam().version_serialization) {
1557 creator_.StopSendingVersion();
1558 }
1559 EXPECT_FALSE(creator_.HasPendingFrames());
1560
1561 // Send one byte of stream data.
1562 MakeIOVector("a", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001563 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1564 iov_.iov_len);
nharperebabffd2019-06-03 17:34:45 -07001565 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1566 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1567 size_t num_bytes_consumed;
1568 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001569 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1570 NOT_RETRANSMISSION, &num_bytes_consumed);
nharperebabffd2019-06-03 17:34:45 -07001571 EXPECT_EQ(1u, num_bytes_consumed);
1572
1573 // Check that a packet is created.
1574 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1575 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1576 {
1577 InSequence s;
1578 EXPECT_CALL(framer_visitor_, OnPacket());
1579 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1580 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1581 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1582 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1583 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1584 if (client_framer_.version().HasHeaderProtection()) {
1585 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1586 }
1587 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1588 }
1589 ProcessPacket(serialized_packet_);
1590}
1591
QUICHE teama6ef0a62019-03-07 20:34:33 -05001592TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1593 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1594 if (!IsDefaultTestConfiguration()) {
1595 return;
1596 }
1597
QUICHE team6987b4a2019-03-15 16:23:04 -07001598 creator_.set_encryption_level(ENCRYPTION_INITIAL);
fkastenholz85f18902019-05-28 12:47:00 -07001599 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001600 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001601 /*fin=*/false, 0u, quiche::QuicheStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001602 EXPECT_QUIC_BUG(
renjietangb63005e2019-11-19 23:08:53 -08001603 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001604 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1605}
1606
1607TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1608 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1609 if (!IsDefaultTestConfiguration()) {
1610 return;
1611 }
1612
1613 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
fkastenholz85f18902019-05-28 12:47:00 -07001614 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001615 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001616 /*fin=*/false, 0u, quiche::QuicheStringPiece());
fayang49523232019-05-03 06:28:22 -07001617 EXPECT_QUIC_BUG(
renjietangb63005e2019-11-19 23:08:53 -08001618 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001619 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001620}
1621
1622TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1623 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1624 if (!IsDefaultTestConfiguration()) {
1625 return;
1626 }
1627
QUICHE teamdc41bf12019-03-20 12:58:42 -07001628 // This test only matters when the crypto handshake is sent in stream frames.
1629 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1630 // frames.
1631 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1632 return;
1633 }
1634
QUICHE teama6ef0a62019-03-07 20:34:33 -05001635 CryptoHandshakeMessage message;
1636 message.set_tag(kCHLO);
dschinazi66dea072019-04-09 11:41:06 -07001637 message.set_minimum_size(kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001638 CryptoFramer framer;
1639 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001640 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001641
1642 struct iovec iov;
dmcardlecf0bfcf2019-12-13 08:08:21 -08001643 MakeIOVector(
1644 quiche::QuicheStringPiece(message_data->data(), message_data->length()),
1645 &iov);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001646 QuicFrame frame;
fkastenholz85f18902019-05-28 12:47:00 -07001647 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
fayang62b637b2019-09-16 08:40:49 -07001648 EXPECT_QUIC_BUG(
1649 creator_.ConsumeDataToFillCurrentPacket(
1650 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1651 &iov, 1u, iov.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION,
1652 &frame),
1653 "Client hello won't fit in a single packet.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001654}
1655
1656TEST_P(QuicPacketCreatorTest, PendingPadding) {
1657 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1658 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1659 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1660
1661 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1662 .WillRepeatedly(
1663 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1664 // Flush all paddings.
1665 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001666 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001667 {
1668 InSequence s;
1669 EXPECT_CALL(framer_visitor_, OnPacket());
1670 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1671 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1672 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1673 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1674 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1675 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1676 }
1677 // Packet only contains padding.
1678 ProcessPacket(serialized_packet_);
1679 }
1680 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1681}
1682
1683TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001684 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001685 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1686 QuicFrame frame;
1687 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001688 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1689 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001690 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001691 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001692 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1693 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1694 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001695 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001696 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1697}
1698
QUICHE teama6ef0a62019-03-07 20:34:33 -05001699TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001700 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001701 const QuicByteCount kStreamFramePayloadSize = 100u;
1702 // Set the packet size be enough for one stream frame with 0 stream offset +
1703 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001704 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1705 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001706 size_t length =
1707 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1708 GetEncryptionOverhead() +
1709 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001710 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001711 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1712 kStreamFramePayloadSize + 1;
1713 creator_.SetMaxPacketLength(length);
1714 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1715 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1716 QuicFrame frame;
1717 char buf[kStreamFramePayloadSize + 1] = {};
1718 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1719 .WillRepeatedly(
1720 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1721 // Send stream frame of size kStreamFramePayloadSize.
dmcardlecf0bfcf2019-12-13 08:08:21 -08001722 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001723 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1724 0u, 0u, false, false,
1725 NOT_RETRANSMISSION, &frame);
1726 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001727 // 1 byte padding is sent.
1728 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1729 // Send stream frame of size kStreamFramePayloadSize + 1.
dmcardlecf0bfcf2019-12-13 08:08:21 -08001730 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize + 1),
1731 &iov_);
fayang62b637b2019-09-16 08:40:49 -07001732 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1733 0u, kStreamFramePayloadSize, false,
1734 false, NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001735 // No padding is sent.
fayang62b637b2019-09-16 08:40:49 -07001736 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001737 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1738 // Flush all paddings.
1739 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001740 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001741 }
1742 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1743}
1744
1745TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001746 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
dschinazi66dea072019-04-09 11:41:06 -07001747 char external_buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001748 char* expected_buffer = external_buffer;
1749 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1750
1751 QuicFrame frame;
1752 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001753 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1754 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001755 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001756 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001757 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1758
1759 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1760 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1761 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1762 ClearSerializedPacket(serialized_packet);
1763 }));
fayang62b637b2019-09-16 08:40:49 -07001764 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001765}
1766
1767// Test for error found in
1768// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1769// length that crosses an IETF VarInt length boundary would cause a
1770// failure. While this test is not applicable to versions other than version 99,
1771// it should still work. Hence, it is not made version-specific.
1772TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1773 QuicAckFrame ack_frame =
1774 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1775 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1776 frames_.push_back(QuicFrame(&ack_frame));
1777 SerializeAllFrames(frames_);
1778}
1779
1780TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
fayangd4291e42019-05-30 10:31:21 -07001781 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001782 return;
1783 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001784 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001785 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1786 .Times(3)
1787 .WillRepeatedly(
1788 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1789 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1790 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001791 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1792 creator_.GetCurrentLargestMessagePayload()));
1793 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001794 QuicMessageFrame* message_frame =
1795 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
renjietangb63005e2019-11-19 23:08:53 -08001796 EXPECT_TRUE(creator_.AddFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001797 EXPECT_TRUE(creator_.HasPendingFrames());
fayang62b637b2019-09-16 08:40:49 -07001798 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001799
wub553a9662019-03-28 20:13:23 -07001800 QuicMessageFrame* frame2 =
1801 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001802 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001803 EXPECT_TRUE(creator_.HasPendingFrames());
1804 // Verify if a new frame is added, 1 byte message length will be added.
1805 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001806 QuicMessageFrame* frame3 =
1807 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001808 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001809 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
fayang62b637b2019-09-16 08:40:49 -07001810 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001811
1812 QuicFrame frame;
1813 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001814 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1815 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001816 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1817 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1818 NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001819 QuicMessageFrame* frame4 =
1820 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001821 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001822 EXPECT_TRUE(creator_.HasPendingFrames());
1823 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001824 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1825 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001826 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001827 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
renjietangb63005e2019-11-19 23:08:53 -08001828 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001829 EXPECT_FALSE(creator_.HasPendingFrames());
1830}
1831
1832TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
fayangd4291e42019-05-30 10:31:21 -07001833 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001834 return;
1835 }
vasilvvc48c8712019-03-11 13:38:16 -07001836 std::string message_data(kDefaultMaxPacketSize, 'a');
dmcardlecf0bfcf2019-12-13 08:08:21 -08001837 quiche::QuicheStringPiece message_buffer(message_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001838 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001839 // Test all possible encryption levels of message frames.
1840 for (EncryptionLevel level :
1841 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1842 creator_.set_encryption_level(level);
1843 // Test all possible sizes of message frames.
1844 for (size_t message_size = 0;
1845 message_size <= creator_.GetCurrentLargestMessagePayload();
1846 ++message_size) {
1847 QuicMessageFrame* frame = new QuicMessageFrame(
dmcardlecf0bfcf2019-12-13 08:08:21 -08001848 0, MakeSpan(
1849 &allocator_,
1850 quiche::QuicheStringPiece(message_buffer.data(), message_size),
1851 &storage));
renjietangb63005e2019-11-19 23:08:53 -08001852 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame), NOT_RETRANSMISSION));
ianswettb239f862019-04-05 09:15:06 -07001853 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001854
ianswettb239f862019-04-05 09:15:06 -07001855 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1856 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1857 // Verify BytesFree returns bytes available for the next frame, which
1858 // should subtract the message length.
1859 size_t expected_bytes_free =
1860 creator_.GetCurrentLargestMessagePayload() - message_size <
1861 expansion_bytes
1862 ? 0
1863 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1864 message_size;
1865 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1866 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1867 creator_.GetCurrentLargestMessagePayload());
1868 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1869 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001870 creator_.FlushCurrentPacket();
ianswettb239f862019-04-05 09:15:06 -07001871 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1872 DeleteSerializedPacket();
1873 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001874 }
1875}
1876
nharperd43f1d62019-07-01 15:18:20 -07001877// Regression test for bugfix of GetPacketHeaderSize.
1878TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
renjietang4c704c82019-10-07 16:39:11 -07001879 QuicTransportVersion version = creator_.transport_version();
nharperd43f1d62019-07-01 15:18:20 -07001880 if (!VersionSupportsMessageFrames(version)) {
1881 return;
1882 }
1883 QuicPacketLength expected_largest_payload = 1319;
1884 if (QuicVersionHasLongHeaderLengths(version)) {
1885 expected_largest_payload -= 2;
1886 }
dschinazi48ac9192019-07-31 00:07:26 -07001887 if (GetParam().version.HasLengthPrefixedConnectionIds()) {
1888 expected_largest_payload -= 1;
1889 }
nharperd43f1d62019-07-01 15:18:20 -07001890 EXPECT_EQ(expected_largest_payload,
1891 creator_.GetGuaranteedLargestMessagePayload());
1892}
1893
QUICHE teama6ef0a62019-03-07 20:34:33 -05001894TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001895 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001896
1897 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1898 QuicFrame ack_frame(&temp_ack_frame);
1899 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1900
QUICHE teamdc41bf12019-03-20 12:58:42 -07001901 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1902 client_framer_.transport_version(), Perspective::IS_CLIENT);
1903 QuicFrame stream_frame(QuicStreamFrame(stream_id,
dmcardlecf0bfcf2019-12-13 08:08:21 -08001904 /*fin=*/false, 0u,
1905 quiche::QuicheStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001906 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1907
1908 QuicFrame padding_frame{QuicPaddingFrame()};
1909 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1910
1911 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1912 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1913
renjietangb63005e2019-11-19 23:08:53 -08001914 EXPECT_TRUE(creator_.AddFrame(ack_frame, LOSS_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001915 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1916
renjietangb63005e2019-11-19 23:08:53 -08001917 EXPECT_TRUE(creator_.AddFrame(stream_frame, RTO_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001918 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1919
renjietangb63005e2019-11-19 23:08:53 -08001920 EXPECT_TRUE(creator_.AddFrame(padding_frame, TLP_RETRANSMISSION));
fayang62b637b2019-09-16 08:40:49 -07001921 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001922 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1923
fayangcff885a2019-10-22 07:39:04 -07001924 // The last retransmittable frame on packet is a stream frame, the packet's
1925 // transmission type should be the same as the stream frame's.
1926 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001927 DeleteSerializedPacket();
1928}
1929
1930TEST_P(QuicPacketCreatorTest, RetryToken) {
1931 if (!GetParam().version_serialization ||
1932 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1933 return;
1934 }
1935
1936 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1937 9, 10, 11, 12, 13, 14, 15, 16};
1938
1939 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001940 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001941
QUICHE teamdc41bf12019-03-20 12:58:42 -07001942 std::string data("a");
1943 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1944 QuicStreamFrame stream_frame(
1945 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
dmcardlecf0bfcf2019-12-13 08:08:21 -08001946 /*fin=*/false, 0u, quiche::QuicheStringPiece());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001947 frames_.push_back(QuicFrame(stream_frame));
1948 } else {
1949 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1950 frames_.push_back(
1951 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1952 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001953 SerializedPacket serialized = SerializeAllFrames(frames_);
1954
1955 QuicPacketHeader header;
1956 {
1957 InSequence s;
1958 EXPECT_CALL(framer_visitor_, OnPacket());
1959 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1960 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1961 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1962 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1963 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001964 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1965 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1966 } else {
1967 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1968 }
nharper55fa6132019-05-07 19:37:21 -07001969 if (client_framer_.version().HasHeaderProtection()) {
1970 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1971 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001972 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1973 }
1974 ProcessPacket(serialized);
1975 ASSERT_TRUE(header.version_flag);
1976 ASSERT_EQ(header.long_packet_type, INITIAL);
1977 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1978 test::CompareCharArraysWithHexError(
1979 "retry token", header.retry_token.data(), header.retry_token.length(),
1980 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001981 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001982}
1983
QUICHE team2252b702019-05-14 23:55:14 -04001984TEST_P(QuicPacketCreatorTest, GetConnectionId) {
QUICHE team2252b702019-05-14 23:55:14 -04001985 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1986 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1987}
1988
dschinazi346b7ce2019-06-05 01:38:18 -07001989TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
dschinazi346b7ce2019-06-05 01:38:18 -07001990 if (!client_framer_.version().SupportsClientConnectionIds()) {
1991 return;
1992 }
1993 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1994 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1995 creator_.SetClientConnectionId(TestConnectionId(0x33));
1996 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1997 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
1998}
1999
renjietangdbe98342019-10-18 11:00:57 -07002000TEST_P(QuicPacketCreatorTest, CoalesceStreamFrames) {
2001 InSequence s;
2002 if (!GetParam().version_serialization) {
2003 creator_.StopSendingVersion();
2004 }
renjietanga66e4152019-11-11 13:23:33 -08002005 SetQuicRestartFlag(quic_coalesce_stream_frames_2, true);
renjietangdbe98342019-10-18 11:00:57 -07002006 const size_t max_plaintext_size =
2007 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
2008 EXPECT_FALSE(creator_.HasPendingFrames());
2009 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2010 QuicStreamId stream_id1 = QuicUtils::GetFirstBidirectionalStreamId(
2011 client_framer_.transport_version(), Perspective::IS_CLIENT);
2012 QuicStreamId stream_id2 = GetNthClientInitiatedStreamId(1);
2013 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2014 EXPECT_EQ(max_plaintext_size -
2015 GetPacketHeaderSize(
2016 client_framer_.transport_version(),
2017 creator_.GetDestinationConnectionIdLength(),
2018 creator_.GetSourceConnectionIdLength(),
2019 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2020 !kIncludeDiversificationNonce,
2021 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2022 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
2023 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
2024 creator_.BytesFree());
2025 StrictMock<MockDebugDelegate> debug;
2026 creator_.set_debug_delegate(&debug);
2027
2028 MakeIOVector("test", &iov_);
2029 QuicFrame frame;
2030 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2031 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2032 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2033 NOT_RETRANSMISSION, &frame));
2034 EXPECT_TRUE(creator_.HasPendingFrames());
2035 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2036
2037 MakeIOVector("coalesce", &iov_);
2038 // frame will be coalesced with the first frame.
2039 const auto previous_size = creator_.PacketSize();
renjietang2a6ba792019-10-22 10:44:58 -07002040 QuicStreamFrame target(stream_id1, true, 0, 12);
2041 EXPECT_CALL(debug, OnStreamFrameCoalesced(target));
renjietangdbe98342019-10-18 11:00:57 -07002042 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2043 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 4u, true, false,
2044 NOT_RETRANSMISSION, &frame));
2045 EXPECT_EQ(frame.stream_frame.data_length,
2046 creator_.PacketSize() - previous_size);
renjietangdbe98342019-10-18 11:00:57 -07002047
2048 // frame is for another stream, so it won't be coalesced.
2049 const auto length = creator_.BytesFree() - 10u;
renjietang7f46be32019-10-21 16:55:17 -07002050 std::string large_data(length, 'x');
renjietangdbe98342019-10-18 11:00:57 -07002051 MakeIOVector(large_data, &iov_);
2052 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2053 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2054 stream_id2, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2055 NOT_RETRANSMISSION, &frame));
2056 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id2));
2057
2058 // The packet doesn't have enough free bytes for all data, but will still be
2059 // able to consume and coalesce part of them.
2060 EXPECT_CALL(debug, OnStreamFrameCoalesced(_));
2061 MakeIOVector("somerandomdata", &iov_);
2062 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2063 stream_id2, &iov_, 1u, iov_.iov_len, 0u, length, false, false,
2064 NOT_RETRANSMISSION, &frame));
2065
2066 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2067 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2068 creator_.FlushCurrentPacket();
2069 EXPECT_CALL(framer_visitor_, OnPacket());
2070 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2071 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2072 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2073 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2074 // The packet should only have 2 stream frames.
2075 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2076 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2077 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2078 ProcessPacket(serialized_packet_);
2079}
2080
fayang51152fd2019-10-21 06:48:09 -07002081TEST_P(QuicPacketCreatorTest, SaveNonRetransmittableFrames) {
fayang51152fd2019-10-21 06:48:09 -07002082 QuicAckFrame ack_frame(InitAckFrame(1));
2083 frames_.push_back(QuicFrame(&ack_frame));
2084 frames_.push_back(QuicFrame(QuicPaddingFrame(-1)));
2085 SerializedPacket serialized = SerializeAllFrames(frames_);
2086 ASSERT_EQ(2u, serialized.nonretransmittable_frames.size());
2087 EXPECT_EQ(ACK_FRAME, serialized.nonretransmittable_frames[0].type);
2088 EXPECT_EQ(PADDING_FRAME, serialized.nonretransmittable_frames[1].type);
fayangeb268412019-10-21 14:05:38 -07002089 // Verify full padding frame is translated to a padding frame with actual
2090 // bytes of padding.
2091 EXPECT_LT(
2092 0,
2093 serialized.nonretransmittable_frames[1].padding_frame.num_padding_bytes);
fayang51152fd2019-10-21 06:48:09 -07002094 frames_.clear();
2095
2096 // Serialize another packet with the same frames.
2097 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
2098 &creator_, serialized.nonretransmittable_frames, buffer_,
2099 kMaxOutgoingPacketSize);
2100 // Verify the packet length of both packets are equal.
2101 EXPECT_EQ(serialized.encrypted_length, packet.encrypted_length);
2102}
2103
fayang08750832019-10-24 11:25:34 -07002104TEST_P(QuicPacketCreatorTest, SerializeCoalescedPacket) {
fayang08750832019-10-24 11:25:34 -07002105 QuicCoalescedPacket coalesced;
2106 SimpleBufferAllocator allocator;
2107 QuicSocketAddress self_address(QuicIpAddress::Loopback4(), 1);
2108 QuicSocketAddress peer_address(QuicIpAddress::Loopback4(), 2);
2109 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2110 EncryptionLevel level = static_cast<EncryptionLevel>(i);
2111 creator_.set_encryption_level(level);
2112 QuicAckFrame ack_frame(InitAckFrame(1));
2113 frames_.push_back(QuicFrame(&ack_frame));
2114 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
dmcardlecf0bfcf2019-12-13 08:08:21 -08002115 frames_.push_back(QuicFrame(
2116 QuicStreamFrame(1, false, 0u, quiche::QuicheStringPiece())));
fayang08750832019-10-24 11:25:34 -07002117 }
2118 SerializedPacket serialized = SerializeAllFrames(frames_);
2119 EXPECT_EQ(level, serialized.encryption_level);
2120 frames_.clear();
2121 ASSERT_TRUE(coalesced.MaybeCoalescePacket(serialized, self_address,
2122 peer_address, &allocator,
2123 creator_.max_packet_length()));
2124 }
2125 char buffer[kMaxOutgoingPacketSize];
2126 size_t coalesced_length = creator_.SerializeCoalescedPacket(
2127 coalesced, buffer, kMaxOutgoingPacketSize);
2128 // Verify packet is padded to full.
2129 ASSERT_EQ(coalesced.max_packet_length(), coalesced_length);
2130 if (!QuicVersionHasLongHeaderLengths(server_framer_.transport_version())) {
2131 return;
2132 }
2133 // Verify packet process.
2134 std::unique_ptr<QuicEncryptedPacket> packets[NUM_ENCRYPTION_LEVELS];
2135 packets[ENCRYPTION_INITIAL] =
bnc40d0fa52019-10-29 11:40:48 -07002136 std::make_unique<QuicEncryptedPacket>(buffer, coalesced_length);
fayang08750832019-10-24 11:25:34 -07002137 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2138 InSequence s;
2139 EXPECT_CALL(framer_visitor_, OnPacket());
2140 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2141 if (i < ENCRYPTION_FORWARD_SECURE) {
2142 // Save coalesced packet.
2143 EXPECT_CALL(framer_visitor_, OnCoalescedPacket(_))
2144 .WillOnce(Invoke([i, &packets](const QuicEncryptedPacket& packet) {
2145 packets[i + 1] = packet.Clone();
2146 }));
2147 }
2148 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2149 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2150 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2151 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _)).WillOnce(Return(true));
2152 EXPECT_CALL(framer_visitor_,
2153 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
2154 .WillOnce(Return(true));
2155 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(_)).WillOnce(Return(true));
2156 if (i == ENCRYPTION_INITIAL) {
2157 // Verify padding is added.
2158 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2159 } else {
2160 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(testing::AtMost(1));
2161 }
2162 if (i != ENCRYPTION_INITIAL && i != ENCRYPTION_HANDSHAKE) {
2163 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2164 }
2165 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2166
2167 server_framer_.ProcessPacket(*packets[i]);
2168 }
2169}
2170
fayang2ab1e852019-11-04 11:24:36 -08002171TEST_P(QuicPacketCreatorTest, SoftMaxPacketLength) {
2172 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2173 QuicByteCount previous_max_packet_length = creator_.max_packet_length();
2174 const size_t overhead =
2175 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2176 QuicPacketCreator::MinPlaintextPacketSize(client_framer_.version()) +
2177 GetEncryptionOverhead();
2178 // Make sure a length which cannot accommodate header (includes header
2179 // protection minimal length) gets rejected.
2180 creator_.SetSoftMaxPacketLength(overhead - 1);
2181 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2182
2183 creator_.SetSoftMaxPacketLength(overhead);
2184 EXPECT_EQ(overhead, creator_.max_packet_length());
2185
2186 // Verify creator has room for stream frame because max_packet_length_ gets
2187 // restored.
vasilvva57bbb32019-11-06 06:19:27 -08002188 ASSERT_TRUE(creator_.HasRoomForStreamFrame(
2189 GetNthClientInitiatedStreamId(1), kMaxIetfVarInt,
2190 std::numeric_limits<uint32_t>::max()));
fayang2ab1e852019-11-04 11:24:36 -08002191 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2192
2193 // Same for message frame.
2194 if (VersionSupportsMessageFrames(client_framer_.transport_version())) {
2195 creator_.SetSoftMaxPacketLength(overhead);
2196 // Verify GetCurrentLargestMessagePayload is based on the actual
2197 // max_packet_length.
2198 EXPECT_LT(1u, creator_.GetCurrentLargestMessagePayload());
2199 EXPECT_EQ(overhead, creator_.max_packet_length());
2200 ASSERT_TRUE(creator_.HasRoomForMessageFrame(
2201 creator_.GetCurrentLargestMessagePayload()));
2202 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2203 }
2204
2205 // Verify creator can consume crypto data because max_packet_length_ gets
2206 // restored.
2207 creator_.SetSoftMaxPacketLength(overhead);
2208 EXPECT_EQ(overhead, creator_.max_packet_length());
2209 std::string data = "crypto data";
2210 MakeIOVector(data, &iov_);
2211 QuicFrame frame;
2212 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
2213 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2214 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
2215 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
2216 &frame));
2217 size_t bytes_consumed = frame.stream_frame.data_length;
2218 EXPECT_LT(0u, bytes_consumed);
2219 } else {
2220 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
2221 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
2222 ENCRYPTION_INITIAL, data.length(), kOffset,
2223 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
2224 size_t bytes_consumed = frame.crypto_frame->data_length;
2225 EXPECT_LT(0u, bytes_consumed);
2226 }
2227 EXPECT_TRUE(creator_.HasPendingFrames());
2228 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2229 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2230 creator_.FlushCurrentPacket();
2231
2232 // Verify ACK frame can be consumed.
2233 creator_.SetSoftMaxPacketLength(overhead);
2234 EXPECT_EQ(overhead, creator_.max_packet_length());
2235 QuicAckFrame ack_frame(InitAckFrame(10u));
renjietangb63005e2019-11-19 23:08:53 -08002236 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
fayang2ab1e852019-11-04 11:24:36 -08002237 EXPECT_TRUE(creator_.HasPendingFrames());
2238}
2239
fayang4245c212019-11-05 13:33:46 -08002240class MockDelegate : public QuicPacketCreator::DelegateInterface {
2241 public:
2242 MockDelegate() {}
2243 MockDelegate(const MockDelegate&) = delete;
2244 MockDelegate& operator=(const MockDelegate&) = delete;
2245 ~MockDelegate() override {}
2246
2247 MOCK_METHOD2(ShouldGeneratePacket,
2248 bool(HasRetransmittableData retransmittable,
2249 IsHandshake handshake));
2250 MOCK_METHOD0(MaybeBundleAckOpportunistically, const QuicFrames());
2251 MOCK_METHOD0(GetPacketBuffer, char*());
2252 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
2253 MOCK_METHOD2(OnUnrecoverableError, void(QuicErrorCode, const std::string&));
2254
2255 void SetCanWriteAnything() {
2256 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
2257 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2258 .WillRepeatedly(Return(true));
2259 }
2260
2261 void SetCanNotWrite() {
2262 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2263 .WillRepeatedly(Return(false));
2264 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2265 .WillRepeatedly(Return(false));
2266 }
2267
2268 // Use this when only ack frames should be allowed to be written.
2269 void SetCanWriteOnlyNonRetransmittable() {
2270 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2271 .WillRepeatedly(Return(false));
2272 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2273 .WillRepeatedly(Return(true));
2274 }
2275};
2276
2277// Simple struct for describing the contents of a packet.
2278// Useful in conjunction with a SimpleQuicFrame for validating that a packet
2279// contains the expected frames.
2280struct PacketContents {
2281 PacketContents()
2282 : num_ack_frames(0),
2283 num_connection_close_frames(0),
2284 num_goaway_frames(0),
2285 num_rst_stream_frames(0),
2286 num_stop_waiting_frames(0),
2287 num_stream_frames(0),
2288 num_crypto_frames(0),
2289 num_ping_frames(0),
2290 num_mtu_discovery_frames(0),
2291 num_padding_frames(0) {}
2292
2293 size_t num_ack_frames;
2294 size_t num_connection_close_frames;
2295 size_t num_goaway_frames;
2296 size_t num_rst_stream_frames;
2297 size_t num_stop_waiting_frames;
2298 size_t num_stream_frames;
2299 size_t num_crypto_frames;
2300 size_t num_ping_frames;
2301 size_t num_mtu_discovery_frames;
2302 size_t num_padding_frames;
2303};
2304
2305class MultiplePacketsTestPacketCreator : public QuicPacketCreator {
2306 public:
2307 MultiplePacketsTestPacketCreator(
2308 QuicConnectionId connection_id,
2309 QuicFramer* framer,
2310 QuicRandom* random_generator,
2311 QuicPacketCreator::DelegateInterface* delegate,
2312 SimpleDataProducer* producer)
2313 : QuicPacketCreator(connection_id, framer, random_generator, delegate),
2314 ack_frame_(InitAckFrame(1)),
2315 delegate_(static_cast<MockDelegate*>(delegate)),
2316 producer_(producer) {}
2317
2318 bool ConsumeRetransmittableControlFrame(const QuicFrame& frame,
2319 bool bundle_ack) {
2320 if (!has_ack()) {
2321 QuicFrames frames;
2322 if (bundle_ack) {
2323 frames.push_back(QuicFrame(&ack_frame_));
2324 }
2325 if (delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2326 NOT_HANDSHAKE)) {
2327 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically())
2328 .WillOnce(Return(frames));
2329 }
2330 }
2331 return QuicPacketCreator::ConsumeRetransmittableControlFrame(frame);
2332 }
2333
2334 QuicConsumedData ConsumeDataFastPath(QuicStreamId id,
2335 const struct iovec* iov,
2336 int iov_count,
2337 size_t total_length,
2338 QuicStreamOffset offset,
2339 bool fin) {
2340 // Save data before data is consumed.
2341 if (total_length > 0) {
2342 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2343 }
2344 return QuicPacketCreator::ConsumeDataFastPath(id, total_length, offset, fin,
2345 0);
2346 }
2347
2348 QuicConsumedData ConsumeData(QuicStreamId id,
2349 const struct iovec* iov,
2350 int iov_count,
2351 size_t total_length,
2352 QuicStreamOffset offset,
2353 StreamSendingState state) {
2354 // Save data before data is consumed.
2355 if (total_length > 0) {
2356 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2357 }
2358 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2359 NOT_HANDSHAKE)) {
2360 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2361 }
2362 return QuicPacketCreator::ConsumeData(id, total_length, offset, state);
2363 }
2364
2365 MessageStatus AddMessageFrame(QuicMessageId message_id,
2366 QuicMemSliceSpan message) {
2367 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2368 NOT_HANDSHAKE)) {
2369 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2370 }
2371 return QuicPacketCreator::AddMessageFrame(message_id, message);
2372 }
2373
2374 size_t ConsumeCryptoData(EncryptionLevel level,
dmcardlecf0bfcf2019-12-13 08:08:21 -08002375 quiche::QuicheStringPiece data,
fayang4245c212019-11-05 13:33:46 -08002376 QuicStreamOffset offset) {
2377 producer_->SaveCryptoData(level, offset, data);
2378 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2379 NOT_HANDSHAKE)) {
2380 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2381 }
2382 return QuicPacketCreator::ConsumeCryptoData(level, data.length(), offset);
2383 }
2384
2385 QuicAckFrame ack_frame_;
2386 MockDelegate* delegate_;
2387 SimpleDataProducer* producer_;
2388};
2389
2390class QuicPacketCreatorMultiplePacketsTest : public QuicTest {
2391 public:
2392 QuicPacketCreatorMultiplePacketsTest()
2393 : framer_(AllSupportedVersions(),
2394 QuicTime::Zero(),
2395 Perspective::IS_CLIENT,
2396 kQuicDefaultConnectionIdLength),
2397 creator_(TestConnectionId(),
2398 &framer_,
2399 &random_creator_,
2400 &delegate_,
2401 &producer_),
2402 ack_frame_(InitAckFrame(1)) {
2403 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
2404 creator_.SetEncrypter(
2405 ENCRYPTION_FORWARD_SECURE,
2406 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
2407 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2408 framer_.set_data_producer(&producer_);
2409 if (simple_framer_.framer()->version().KnowsWhichDecrypterToUse()) {
2410 simple_framer_.framer()->InstallDecrypter(
2411 ENCRYPTION_FORWARD_SECURE,
2412 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
2413 }
2414 creator_.AttachPacketFlusher();
2415 }
2416
2417 ~QuicPacketCreatorMultiplePacketsTest() override {
2418 for (SerializedPacket& packet : packets_) {
2419 delete[] packet.encrypted_buffer;
2420 ClearSerializedPacket(&packet);
2421 }
2422 }
2423
2424 void SavePacket(SerializedPacket* packet) {
2425 packet->encrypted_buffer = CopyBuffer(*packet);
2426 packets_.push_back(*packet);
2427 packet->encrypted_buffer = nullptr;
2428 packet->retransmittable_frames.clear();
2429 }
2430
2431 protected:
2432 QuicRstStreamFrame* CreateRstStreamFrame() {
2433 return new QuicRstStreamFrame(1, 1, QUIC_STREAM_NO_ERROR, 0);
2434 }
2435
2436 QuicGoAwayFrame* CreateGoAwayFrame() {
2437 return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, std::string());
2438 }
2439
2440 void CheckPacketContains(const PacketContents& contents,
2441 size_t packet_index) {
2442 ASSERT_GT(packets_.size(), packet_index);
2443 const SerializedPacket& packet = packets_[packet_index];
2444 size_t num_retransmittable_frames =
2445 contents.num_connection_close_frames + contents.num_goaway_frames +
2446 contents.num_rst_stream_frames + contents.num_stream_frames +
2447 contents.num_crypto_frames + contents.num_ping_frames;
2448 size_t num_frames =
2449 contents.num_ack_frames + contents.num_stop_waiting_frames +
2450 contents.num_mtu_discovery_frames + contents.num_padding_frames +
2451 num_retransmittable_frames;
2452
2453 if (num_retransmittable_frames == 0) {
2454 ASSERT_TRUE(packet.retransmittable_frames.empty());
2455 } else {
2456 ASSERT_FALSE(packet.retransmittable_frames.empty());
2457 EXPECT_EQ(num_retransmittable_frames,
2458 packet.retransmittable_frames.size());
2459 }
2460
2461 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2462 ASSERT_TRUE(simple_framer_.ProcessPacket(
2463 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2464 size_t num_padding_frames = 0;
2465 if (contents.num_padding_frames == 0) {
2466 num_padding_frames = simple_framer_.padding_frames().size();
2467 }
2468 EXPECT_EQ(num_frames + num_padding_frames, simple_framer_.num_frames());
2469 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
2470 EXPECT_EQ(contents.num_connection_close_frames,
2471 simple_framer_.connection_close_frames().size());
2472 EXPECT_EQ(contents.num_goaway_frames,
2473 simple_framer_.goaway_frames().size());
2474 EXPECT_EQ(contents.num_rst_stream_frames,
2475 simple_framer_.rst_stream_frames().size());
2476 EXPECT_EQ(contents.num_stream_frames,
2477 simple_framer_.stream_frames().size());
2478 EXPECT_EQ(contents.num_crypto_frames,
2479 simple_framer_.crypto_frames().size());
2480 EXPECT_EQ(contents.num_stop_waiting_frames,
2481 simple_framer_.stop_waiting_frames().size());
2482 if (contents.num_padding_frames != 0) {
2483 EXPECT_EQ(contents.num_padding_frames,
2484 simple_framer_.padding_frames().size());
2485 }
2486
2487 // From the receiver's perspective, MTU discovery frames are ping frames.
2488 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames,
2489 simple_framer_.ping_frames().size());
2490 }
2491
2492 void CheckPacketHasSingleStreamFrame(size_t packet_index) {
2493 ASSERT_GT(packets_.size(), packet_index);
2494 const SerializedPacket& packet = packets_[packet_index];
2495 ASSERT_FALSE(packet.retransmittable_frames.empty());
2496 EXPECT_EQ(1u, packet.retransmittable_frames.size());
2497 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2498 ASSERT_TRUE(simple_framer_.ProcessPacket(
2499 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2500 EXPECT_EQ(1u, simple_framer_.num_frames());
2501 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
2502 }
2503
2504 void CheckAllPacketsHaveSingleStreamFrame() {
2505 for (size_t i = 0; i < packets_.size(); i++) {
2506 CheckPacketHasSingleStreamFrame(i);
2507 }
2508 }
2509
2510 void CreateData(size_t len) {
2511 data_array_.reset(new char[len]);
2512 memset(data_array_.get(), '?', len);
2513 iov_.iov_base = data_array_.get();
2514 iov_.iov_len = len;
2515 }
2516
2517 QuicFramer framer_;
2518 MockRandom random_creator_;
2519 StrictMock<MockDelegate> delegate_;
2520 MultiplePacketsTestPacketCreator creator_;
2521 SimpleQuicFramer simple_framer_;
2522 std::vector<SerializedPacket> packets_;
2523 QuicAckFrame ack_frame_;
2524 struct iovec iov_;
2525 SimpleBufferAllocator allocator_;
2526
2527 private:
2528 std::unique_ptr<char[]> data_array_;
2529 SimpleDataProducer producer_;
2530};
2531
2532TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_NotWritable) {
2533 delegate_.SetCanNotWrite();
2534
2535 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2536 const bool consumed =
2537 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2538 /*bundle_ack=*/false);
2539 EXPECT_FALSE(consumed);
2540 EXPECT_FALSE(creator_.HasPendingFrames());
2541 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2542 delete rst_frame;
2543}
2544
2545TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_OnlyAckWritable) {
2546 delegate_.SetCanWriteOnlyNonRetransmittable();
2547
2548 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2549 const bool consumed =
2550 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2551 /*bundle_ack=*/false);
2552 EXPECT_FALSE(consumed);
2553 EXPECT_FALSE(creator_.HasPendingFrames());
2554 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2555 delete rst_frame;
2556}
2557
2558TEST_F(QuicPacketCreatorMultiplePacketsTest,
2559 AddControlFrame_WritableAndShouldNotFlush) {
2560 delegate_.SetCanWriteAnything();
2561
2562 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2563 /*bundle_ack=*/false);
2564 EXPECT_TRUE(creator_.HasPendingFrames());
2565 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2566}
2567
2568TEST_F(QuicPacketCreatorMultiplePacketsTest,
2569 AddControlFrame_NotWritableBatchThenFlush) {
2570 delegate_.SetCanNotWrite();
2571
2572 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2573 const bool consumed =
2574 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2575 /*bundle_ack=*/false);
2576 EXPECT_FALSE(consumed);
2577 EXPECT_FALSE(creator_.HasPendingFrames());
2578 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2579 delete rst_frame;
2580}
2581
2582TEST_F(QuicPacketCreatorMultiplePacketsTest,
2583 AddControlFrame_WritableAndShouldFlush) {
2584 delegate_.SetCanWriteAnything();
2585
2586 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2587 .WillOnce(
2588 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2589
2590 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2591 /*bundle_ack=*/false);
2592 creator_.Flush();
2593 EXPECT_FALSE(creator_.HasPendingFrames());
2594 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2595
2596 PacketContents contents;
2597 contents.num_rst_stream_frames = 1;
2598 CheckPacketContains(contents, 0);
2599}
2600
2601TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeCryptoData) {
2602 delegate_.SetCanWriteAnything();
2603
2604 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2605 .WillOnce(
2606 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2607 std::string data = "crypto data";
2608 size_t consumed_bytes =
2609 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2610 creator_.Flush();
2611 EXPECT_EQ(data.length(), consumed_bytes);
2612 EXPECT_FALSE(creator_.HasPendingFrames());
2613 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2614
2615 PacketContents contents;
2616 contents.num_crypto_frames = 1;
2617 contents.num_padding_frames = 1;
2618 CheckPacketContains(contents, 0);
2619}
2620
2621TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_NotWritable) {
2622 delegate_.SetCanNotWrite();
2623
2624 MakeIOVector("foo", &iov_);
2625 QuicConsumedData consumed = creator_.ConsumeData(
2626 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2627 Perspective::IS_CLIENT),
2628 &iov_, 1u, iov_.iov_len, 0, FIN);
2629 EXPECT_EQ(0u, consumed.bytes_consumed);
2630 EXPECT_FALSE(consumed.fin_consumed);
2631 EXPECT_FALSE(creator_.HasPendingFrames());
2632 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2633}
2634
2635TEST_F(QuicPacketCreatorMultiplePacketsTest,
2636 ConsumeData_WritableAndShouldNotFlush) {
2637 delegate_.SetCanWriteAnything();
2638
2639 MakeIOVector("foo", &iov_);
2640 QuicConsumedData consumed = creator_.ConsumeData(
2641 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2642 Perspective::IS_CLIENT),
2643 &iov_, 1u, iov_.iov_len, 0, FIN);
2644 EXPECT_EQ(3u, consumed.bytes_consumed);
2645 EXPECT_TRUE(consumed.fin_consumed);
2646 EXPECT_TRUE(creator_.HasPendingFrames());
2647 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2648}
2649
2650TEST_F(QuicPacketCreatorMultiplePacketsTest,
2651 ConsumeData_WritableAndShouldFlush) {
2652 delegate_.SetCanWriteAnything();
2653
2654 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2655 .WillOnce(
2656 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2657 MakeIOVector("foo", &iov_);
2658 QuicConsumedData consumed = creator_.ConsumeData(
2659 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2660 Perspective::IS_CLIENT),
2661 &iov_, 1u, iov_.iov_len, 0, FIN);
2662 creator_.Flush();
2663 EXPECT_EQ(3u, consumed.bytes_consumed);
2664 EXPECT_TRUE(consumed.fin_consumed);
2665 EXPECT_FALSE(creator_.HasPendingFrames());
2666 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2667
2668 PacketContents contents;
2669 contents.num_stream_frames = 1;
2670 CheckPacketContains(contents, 0);
2671}
2672
2673// Test the behavior of ConsumeData when the data consumed is for the crypto
2674// handshake stream. Ensure that the packet is always sent and padded even if
2675// the creator operates in batch mode.
2676TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_Handshake) {
2677 delegate_.SetCanWriteAnything();
2678
2679 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2680 .WillOnce(
2681 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2682 std::string data = "foo bar";
2683 MakeIOVector(data, &iov_);
2684 size_t consumed_bytes = 0;
2685 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2686 consumed_bytes = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2687 } else {
2688 consumed_bytes =
2689 creator_
2690 .ConsumeData(
2691 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2692 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2693 .bytes_consumed;
2694 }
2695 EXPECT_EQ(7u, consumed_bytes);
2696 EXPECT_FALSE(creator_.HasPendingFrames());
2697 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2698
2699 PacketContents contents;
2700 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2701 contents.num_crypto_frames = 1;
2702 } else {
2703 contents.num_stream_frames = 1;
2704 }
2705 contents.num_padding_frames = 1;
2706 CheckPacketContains(contents, 0);
2707
2708 ASSERT_EQ(1u, packets_.size());
2709 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2710 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
2711}
2712
2713// Test the behavior of ConsumeData when the data is for the crypto handshake
2714// stream, but padding is disabled.
2715TEST_F(QuicPacketCreatorMultiplePacketsTest,
2716 ConsumeData_Handshake_PaddingDisabled) {
2717 creator_.set_fully_pad_crypto_handshake_packets(false);
2718
2719 delegate_.SetCanWriteAnything();
2720
2721 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2722 .WillOnce(
2723 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2724 std::string data = "foo";
2725 MakeIOVector(data, &iov_);
2726 size_t bytes_consumed = 0;
2727 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2728 bytes_consumed = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2729 } else {
2730 bytes_consumed =
2731 creator_
2732 .ConsumeData(
2733 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2734 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2735 .bytes_consumed;
2736 }
2737 EXPECT_EQ(3u, bytes_consumed);
2738 EXPECT_FALSE(creator_.HasPendingFrames());
2739 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2740
2741 PacketContents contents;
2742 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2743 contents.num_crypto_frames = 1;
2744 } else {
2745 contents.num_stream_frames = 1;
2746 }
2747 contents.num_padding_frames = 0;
2748 CheckPacketContains(contents, 0);
2749
2750 ASSERT_EQ(1u, packets_.size());
2751
2752 // Packet is not fully padded, but we want to future packets to be larger.
2753 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2754 size_t expected_packet_length = 27;
2755 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2756 // The framing of CRYPTO frames is slightly different than that of stream
2757 // frames, so the expected packet length differs slightly.
2758 expected_packet_length = 28;
2759 }
2760 if (framer_.version().HasHeaderProtection()) {
2761 expected_packet_length = 29;
2762 }
2763 EXPECT_EQ(expected_packet_length, packets_[0].encrypted_length);
2764}
2765
2766TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_EmptyData) {
2767 delegate_.SetCanWriteAnything();
2768
2769 EXPECT_QUIC_BUG(creator_.ConsumeData(
2770 QuicUtils::QuicUtils::GetFirstBidirectionalStreamId(
2771 framer_.transport_version(), Perspective::IS_CLIENT),
2772 nullptr, 0, 0, 0, NO_FIN),
2773 "Attempt to consume empty data without FIN.");
2774}
2775
2776TEST_F(QuicPacketCreatorMultiplePacketsTest,
2777 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
2778 delegate_.SetCanWriteAnything();
2779
2780 MakeIOVector("foo", &iov_);
2781 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2782 framer_.transport_version(), Perspective::IS_CLIENT),
2783 &iov_, 1u, iov_.iov_len, 0, FIN);
2784 MakeIOVector("quux", &iov_);
2785 QuicConsumedData consumed =
2786 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 3, NO_FIN);
2787 EXPECT_EQ(4u, consumed.bytes_consumed);
2788 EXPECT_FALSE(consumed.fin_consumed);
2789 EXPECT_TRUE(creator_.HasPendingFrames());
2790 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2791}
2792
2793TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_BatchOperations) {
2794 delegate_.SetCanWriteAnything();
2795
2796 MakeIOVector("foo", &iov_);
2797 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2798 framer_.transport_version(), Perspective::IS_CLIENT),
2799 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2800 MakeIOVector("quux", &iov_);
2801 QuicConsumedData consumed = creator_.ConsumeData(
2802 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2803 Perspective::IS_CLIENT),
2804 &iov_, 1u, iov_.iov_len, 3, FIN);
2805 EXPECT_EQ(4u, consumed.bytes_consumed);
2806 EXPECT_TRUE(consumed.fin_consumed);
2807 EXPECT_TRUE(creator_.HasPendingFrames());
2808 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2809
2810 // Now both frames will be flushed out.
2811 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2812 .WillOnce(
2813 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2814 creator_.Flush();
2815 EXPECT_FALSE(creator_.HasPendingFrames());
2816 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2817
2818 PacketContents contents;
2819 contents.num_stream_frames =
renjietang6beb5112019-11-11 14:43:19 -08002820 GetQuicRestartFlag(quic_coalesce_stream_frames_2) ? 1 : 2;
fayang4245c212019-11-05 13:33:46 -08002821 CheckPacketContains(contents, 0);
2822}
2823
2824TEST_F(QuicPacketCreatorMultiplePacketsTest,
2825 ConsumeData_FramesPreviouslyQueued) {
2826 // Set the packet size be enough for two stream frames with 0 stream offset,
2827 // but not enough for a stream frame of 0 offset and one with non-zero offset.
2828 size_t length =
2829 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
2830 GetPacketHeaderSize(
2831 framer_.transport_version(),
2832 creator_.GetDestinationConnectionIdLength(),
2833 creator_.GetSourceConnectionIdLength(),
2834 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2835 !kIncludeDiversificationNonce,
2836 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2837 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
2838 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
2839 // Add an extra 3 bytes for the payload and 1 byte so
2840 // BytesFree is larger than the GetMinStreamFrameSize.
2841 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0,
2842 false, 3) +
2843 3 +
2844 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0, true,
2845 1) +
2846 1;
2847 creator_.SetMaxPacketLength(length);
2848 delegate_.SetCanWriteAnything();
2849 {
2850 InSequence dummy;
2851 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2852 .WillOnce(
2853 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2854 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2855 .WillOnce(
2856 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2857 }
2858 // Queue enough data to prevent a stream frame with a non-zero offset from
2859 // fitting.
2860 MakeIOVector("foo", &iov_);
2861 QuicConsumedData consumed = creator_.ConsumeData(
2862 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2863 Perspective::IS_CLIENT),
2864 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2865 EXPECT_EQ(3u, consumed.bytes_consumed);
2866 EXPECT_FALSE(consumed.fin_consumed);
2867 EXPECT_TRUE(creator_.HasPendingFrames());
2868 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2869
2870 // This frame will not fit with the existing frame, causing the queued frame
2871 // to be serialized, and it will be added to a new open packet.
2872 MakeIOVector("bar", &iov_);
2873 consumed = creator_.ConsumeData(
2874 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2875 Perspective::IS_CLIENT),
2876 &iov_, 1u, iov_.iov_len, 3, FIN);
2877 EXPECT_EQ(3u, consumed.bytes_consumed);
2878 EXPECT_TRUE(consumed.fin_consumed);
2879 EXPECT_TRUE(creator_.HasPendingFrames());
2880 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2881
2882 creator_.FlushCurrentPacket();
2883 EXPECT_FALSE(creator_.HasPendingFrames());
2884 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2885
2886 PacketContents contents;
2887 contents.num_stream_frames = 1;
2888 CheckPacketContains(contents, 0);
2889 CheckPacketContains(contents, 1);
2890}
2891
2892TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataFastPath) {
2893 delegate_.SetCanWriteAnything();
2894 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
2895
2896 // Create a 10000 byte IOVector.
2897 CreateData(10000);
2898 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2899 .WillRepeatedly(
2900 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2901 QuicConsumedData consumed = creator_.ConsumeDataFastPath(
2902 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2903 Perspective::IS_CLIENT),
2904 &iov_, 1u, iov_.iov_len, 0, true);
2905 EXPECT_EQ(10000u, consumed.bytes_consumed);
2906 EXPECT_TRUE(consumed.fin_consumed);
2907 EXPECT_FALSE(creator_.HasPendingFrames());
2908 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2909
2910 PacketContents contents;
2911 contents.num_stream_frames = 1;
2912 CheckPacketContains(contents, 0);
2913 EXPECT_FALSE(packets_.empty());
2914 SerializedPacket packet = packets_.back();
2915 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2916 EXPECT_EQ(LOSS_RETRANSMISSION, packet.transmission_type);
2917 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2918 const QuicStreamFrame& stream_frame =
2919 packet.retransmittable_frames.front().stream_frame;
2920 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2921}
2922
2923TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLarge) {
2924 delegate_.SetCanWriteAnything();
2925
2926 // Create a 10000 byte IOVector.
2927 CreateData(10000);
2928 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2929 .WillRepeatedly(
2930 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2931 QuicConsumedData consumed = creator_.ConsumeData(
2932 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2933 Perspective::IS_CLIENT),
2934 &iov_, 1u, iov_.iov_len, 0, FIN);
2935 EXPECT_EQ(10000u, consumed.bytes_consumed);
2936 EXPECT_TRUE(consumed.fin_consumed);
2937 EXPECT_FALSE(creator_.HasPendingFrames());
2938 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2939
2940 PacketContents contents;
2941 contents.num_stream_frames = 1;
2942 CheckPacketContains(contents, 0);
2943 EXPECT_FALSE(packets_.empty());
2944 SerializedPacket packet = packets_.back();
2945 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2946 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2947 const QuicStreamFrame& stream_frame =
2948 packet.retransmittable_frames.front().stream_frame;
2949 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2950}
2951
2952TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckFalse) {
2953 delegate_.SetCanNotWrite();
2954
2955 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2956 const bool success =
2957 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2958 /*bundle_ack=*/true);
2959 EXPECT_FALSE(success);
2960 EXPECT_FALSE(creator_.HasPendingFrames());
2961 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2962
2963 delegate_.SetCanWriteAnything();
2964
2965 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2966 /*bundle_ack=*/false);
2967
2968 // Create a 10000 byte IOVector.
2969 CreateData(10000);
2970 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2971 .WillRepeatedly(
2972 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2973 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2974 /*bundle_ack=*/true);
2975 QuicConsumedData consumed = creator_.ConsumeData(
2976 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2977 Perspective::IS_CLIENT),
2978 &iov_, 1u, iov_.iov_len, 0, FIN);
2979 creator_.Flush();
2980
2981 EXPECT_EQ(10000u, consumed.bytes_consumed);
2982 EXPECT_TRUE(consumed.fin_consumed);
2983 EXPECT_FALSE(creator_.HasPendingFrames());
2984 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2985
2986 EXPECT_FALSE(packets_.empty());
2987 SerializedPacket packet = packets_.back();
2988 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2989 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2990 const QuicStreamFrame& stream_frame =
2991 packet.retransmittable_frames.front().stream_frame;
2992 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2993}
2994
2995TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckTrue) {
fayang4245c212019-11-05 13:33:46 -08002996 delegate_.SetCanNotWrite();
2997 delegate_.SetCanWriteAnything();
2998
2999 // Create a 10000 byte IOVector.
3000 CreateData(10000);
3001 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3002 .WillRepeatedly(
3003 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3004 QuicConsumedData consumed = creator_.ConsumeData(
3005 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3006 Perspective::IS_CLIENT),
3007 &iov_, 1u, iov_.iov_len, 0, FIN);
3008 creator_.Flush();
3009
3010 EXPECT_EQ(10000u, consumed.bytes_consumed);
3011 EXPECT_TRUE(consumed.fin_consumed);
3012 EXPECT_FALSE(creator_.HasPendingFrames());
3013 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3014
3015 EXPECT_FALSE(packets_.empty());
3016 SerializedPacket packet = packets_.back();
3017 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3018 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3019 const QuicStreamFrame& stream_frame =
3020 packet.retransmittable_frames.front().stream_frame;
3021 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3022}
3023
3024TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations) {
3025 delegate_.SetCanNotWrite();
3026
3027 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3028 const bool consumed =
3029 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3030 /*bundle_ack=*/true);
3031 EXPECT_FALSE(consumed);
3032 EXPECT_FALSE(creator_.HasPendingFrames());
3033 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3034 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3035
3036 delegate_.SetCanWriteAnything();
3037
3038 EXPECT_TRUE(
3039 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3040 /*bundle_ack=*/false));
3041 // Send some data and a control frame
3042 MakeIOVector("quux", &iov_);
3043 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3044 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3045 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3046 /*bundle_ack=*/false);
3047 }
3048 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(3));
3049
3050 // All five frames will be flushed out in a single packet.
3051 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3052 .WillOnce(
3053 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3054 creator_.Flush();
3055 EXPECT_FALSE(creator_.HasPendingFrames());
3056 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3057 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3058
3059 PacketContents contents;
3060 // ACK will be flushed by connection.
3061 contents.num_ack_frames = 0;
3062 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3063 contents.num_goaway_frames = 1;
3064 } else {
3065 contents.num_goaway_frames = 0;
3066 }
3067 contents.num_rst_stream_frames = 1;
3068 contents.num_stream_frames = 1;
3069 CheckPacketContains(contents, 0);
3070}
3071
3072TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations2) {
3073 delegate_.SetCanNotWrite();
3074
3075 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3076 const bool success =
3077 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3078 /*bundle_ack=*/true);
3079 EXPECT_FALSE(success);
3080 EXPECT_FALSE(creator_.HasPendingFrames());
3081 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3082
3083 delegate_.SetCanWriteAnything();
3084
3085 {
3086 InSequence dummy;
3087 // All five frames will be flushed out in a single packet
3088 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3089 .WillOnce(
3090 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3091 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3092 .WillOnce(
3093 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3094 }
3095 EXPECT_TRUE(
3096 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3097 /*bundle_ack=*/false));
3098 // Send enough data to exceed one packet
3099 size_t data_len = kDefaultMaxPacketSize + 100;
3100 CreateData(data_len);
3101 QuicConsumedData consumed =
3102 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, FIN);
3103 EXPECT_EQ(data_len, consumed.bytes_consumed);
3104 EXPECT_TRUE(consumed.fin_consumed);
3105 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3106 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3107 /*bundle_ack=*/false);
3108 }
3109
3110 creator_.Flush();
3111 EXPECT_FALSE(creator_.HasPendingFrames());
3112 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3113
3114 // The first packet should have the queued data and part of the stream data.
3115 PacketContents contents;
3116 // ACK will be sent by connection.
3117 contents.num_ack_frames = 0;
3118 contents.num_rst_stream_frames = 1;
3119 contents.num_stream_frames = 1;
3120 CheckPacketContains(contents, 0);
3121
3122 // The second should have the remainder of the stream data.
3123 PacketContents contents2;
3124 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3125 contents2.num_goaway_frames = 1;
3126 } else {
3127 contents2.num_goaway_frames = 0;
3128 }
3129 contents2.num_stream_frames = 1;
3130 CheckPacketContains(contents2, 1);
3131}
3132
3133// Regression test of b/120493795.
3134TEST_F(QuicPacketCreatorMultiplePacketsTest, PacketTransmissionType) {
3135 delegate_.SetCanWriteAnything();
3136
3137 // The first ConsumeData will fill the packet without flush.
3138 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
3139
3140 size_t data_len = 1324;
3141 CreateData(data_len);
3142 QuicStreamId stream1_id = QuicUtils::GetFirstBidirectionalStreamId(
3143 framer_.transport_version(), Perspective::IS_CLIENT);
3144 QuicConsumedData consumed =
3145 creator_.ConsumeData(stream1_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3146 EXPECT_EQ(data_len, consumed.bytes_consumed);
3147 ASSERT_EQ(0u, creator_.BytesFree())
3148 << "Test setup failed: Please increase data_len to "
3149 << data_len + creator_.BytesFree() << " bytes.";
3150
3151 // The second ConsumeData can not be added to the packet and will flush.
3152 creator_.SetTransmissionType(NOT_RETRANSMISSION);
3153
3154 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3155 .WillOnce(
3156 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3157
3158 QuicStreamId stream2_id = stream1_id + 4;
3159
3160 consumed =
3161 creator_.ConsumeData(stream2_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3162 EXPECT_EQ(data_len, consumed.bytes_consumed);
3163
3164 // Ensure the packet is successfully created.
3165 ASSERT_EQ(1u, packets_.size());
3166 ASSERT_TRUE(packets_[0].encrypted_buffer);
3167 ASSERT_EQ(1u, packets_[0].retransmittable_frames.size());
3168 EXPECT_EQ(stream1_id,
3169 packets_[0].retransmittable_frames[0].stream_frame.stream_id);
3170
3171 // Since the second frame was not added, the packet's transmission type
3172 // should be the first frame's type.
3173 EXPECT_EQ(packets_[0].transmission_type, LOSS_RETRANSMISSION);
3174}
3175
3176TEST_F(QuicPacketCreatorMultiplePacketsTest, TestConnectionIdLength) {
3177 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
3178 creator_.SetServerConnectionIdLength(0);
3179 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3180 creator_.GetDestinationConnectionIdLength());
3181
3182 for (size_t i = 1; i < 10; i++) {
3183 creator_.SetServerConnectionIdLength(i);
3184 if (VersionHasIetfInvariantHeader(framer_.transport_version())) {
3185 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3186 creator_.GetDestinationConnectionIdLength());
3187 } else {
3188 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID,
3189 creator_.GetDestinationConnectionIdLength());
3190 }
3191 }
3192}
3193
3194// Test whether SetMaxPacketLength() works in the situation when the queue is
3195// empty, and we send three packets worth of data.
3196TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Initial) {
3197 delegate_.SetCanWriteAnything();
3198
3199 // Send enough data for three packets.
3200 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
3201 size_t packet_len = kDefaultMaxPacketSize + 100;
3202 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3203 creator_.SetMaxPacketLength(packet_len);
3204 EXPECT_EQ(packet_len, creator_.max_packet_length());
3205
3206 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3207 .Times(3)
3208 .WillRepeatedly(
3209 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3210 CreateData(data_len);
3211 QuicConsumedData consumed = creator_.ConsumeData(
3212 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3213 Perspective::IS_CLIENT),
3214 &iov_, 1u, iov_.iov_len,
3215 /*offset=*/0, FIN);
3216 EXPECT_EQ(data_len, consumed.bytes_consumed);
3217 EXPECT_TRUE(consumed.fin_consumed);
3218 EXPECT_FALSE(creator_.HasPendingFrames());
3219 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3220
3221 // We expect three packets, and first two of them have to be of packet_len
3222 // size. We check multiple packets (instead of just one) because we want to
3223 // ensure that |max_packet_length_| does not get changed incorrectly by the
3224 // creator after first packet is serialized.
3225 ASSERT_EQ(3u, packets_.size());
3226 EXPECT_EQ(packet_len, packets_[0].encrypted_length);
3227 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3228 CheckAllPacketsHaveSingleStreamFrame();
3229}
3230
3231// Test whether SetMaxPacketLength() works in the situation when we first write
3232// data, then change packet size, then write data again.
3233TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Middle) {
3234 delegate_.SetCanWriteAnything();
3235
3236 // We send enough data to overflow default packet length, but not the altered
3237 // one.
3238 size_t data_len = kDefaultMaxPacketSize;
3239 size_t packet_len = kDefaultMaxPacketSize + 100;
3240 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3241
3242 // We expect to see three packets in total.
3243 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3244 .Times(3)
3245 .WillRepeatedly(
3246 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3247
3248 // Send two packets before packet size change.
3249 CreateData(data_len);
3250 QuicConsumedData consumed = creator_.ConsumeData(
3251 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3252 Perspective::IS_CLIENT),
3253 &iov_, 1u, iov_.iov_len,
3254 /*offset=*/0, NO_FIN);
3255 creator_.Flush();
3256 EXPECT_EQ(data_len, consumed.bytes_consumed);
3257 EXPECT_FALSE(consumed.fin_consumed);
3258 EXPECT_FALSE(creator_.HasPendingFrames());
3259 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3260
3261 // Make sure we already have two packets.
3262 ASSERT_EQ(2u, packets_.size());
3263
3264 // Increase packet size.
3265 creator_.SetMaxPacketLength(packet_len);
3266 EXPECT_EQ(packet_len, creator_.max_packet_length());
3267
3268 // Send a packet after packet size change.
3269 CreateData(data_len);
3270 creator_.AttachPacketFlusher();
3271 consumed = creator_.ConsumeData(
3272 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3273 Perspective::IS_CLIENT),
3274 &iov_, 1u, iov_.iov_len, data_len, FIN);
3275 creator_.Flush();
3276 EXPECT_EQ(data_len, consumed.bytes_consumed);
3277 EXPECT_TRUE(consumed.fin_consumed);
3278 EXPECT_FALSE(creator_.HasPendingFrames());
3279 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3280
3281 // We expect first data chunk to get fragmented, but the second one to fit
3282 // into a single packet.
3283 ASSERT_EQ(3u, packets_.size());
3284 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3285 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length);
3286 CheckAllPacketsHaveSingleStreamFrame();
3287}
3288
3289// Test whether SetMaxPacketLength() works correctly when we force the change of
3290// the packet size in the middle of the batched packet.
3291TEST_F(QuicPacketCreatorMultiplePacketsTest,
3292 SetMaxPacketLength_MidpacketFlush) {
3293 delegate_.SetCanWriteAnything();
3294
3295 size_t first_write_len = kDefaultMaxPacketSize / 2;
3296 size_t packet_len = kDefaultMaxPacketSize + 100;
3297 size_t second_write_len = packet_len + 1;
3298 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3299
3300 // First send half of the packet worth of data. We are in the batch mode, so
3301 // should not cause packet serialization.
3302 CreateData(first_write_len);
3303 QuicConsumedData consumed = creator_.ConsumeData(
3304 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3305 Perspective::IS_CLIENT),
3306 &iov_, 1u, iov_.iov_len,
3307 /*offset=*/0, NO_FIN);
3308 EXPECT_EQ(first_write_len, consumed.bytes_consumed);
3309 EXPECT_FALSE(consumed.fin_consumed);
3310 EXPECT_TRUE(creator_.HasPendingFrames());
3311 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3312
3313 // Make sure we have no packets so far.
3314 ASSERT_EQ(0u, packets_.size());
3315
3316 // Expect a packet to be flushed.
3317 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3318 .WillOnce(
3319 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3320
3321 // Increase packet size after flushing all frames.
3322 // Ensure it's immediately enacted.
3323 creator_.FlushCurrentPacket();
3324 creator_.SetMaxPacketLength(packet_len);
3325 EXPECT_EQ(packet_len, creator_.max_packet_length());
3326 EXPECT_FALSE(creator_.HasPendingFrames());
3327 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3328
3329 // We expect to see exactly one packet serialized after that, because we send
3330 // a value somewhat exceeding new max packet size, and the tail data does not
3331 // get serialized because we are still in the batch mode.
3332 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3333 .WillOnce(
3334 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3335
3336 // Send a more than a packet worth of data to the same stream. This should
3337 // trigger serialization of one packet, and queue another one.
3338 CreateData(second_write_len);
3339 consumed = creator_.ConsumeData(
3340 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3341 Perspective::IS_CLIENT),
3342 &iov_, 1u, iov_.iov_len,
3343 /*offset=*/first_write_len, FIN);
3344 EXPECT_EQ(second_write_len, consumed.bytes_consumed);
3345 EXPECT_TRUE(consumed.fin_consumed);
3346 EXPECT_TRUE(creator_.HasPendingFrames());
3347 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3348
3349 // We expect the first packet to be underfilled, and the second packet be up
3350 // to the new max packet size.
3351 ASSERT_EQ(2u, packets_.size());
3352 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3353 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3354
3355 CheckAllPacketsHaveSingleStreamFrame();
3356}
3357
3358// Test sending a connectivity probing packet.
3359TEST_F(QuicPacketCreatorMultiplePacketsTest,
3360 GenerateConnectivityProbingPacket) {
3361 delegate_.SetCanWriteAnything();
3362
3363 OwningSerializedPacketPointer probing_packet;
3364 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3365 QuicPathFrameBuffer payload = {
3366 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
3367 probing_packet =
3368 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
3369 } else {
3370 probing_packet = creator_.SerializeConnectivityProbingPacket();
3371 }
3372
3373 ASSERT_TRUE(simple_framer_.ProcessPacket(QuicEncryptedPacket(
3374 probing_packet->encrypted_buffer, probing_packet->encrypted_length)));
3375
3376 EXPECT_EQ(2u, simple_framer_.num_frames());
3377 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3378 EXPECT_EQ(1u, simple_framer_.path_challenge_frames().size());
3379 } else {
3380 EXPECT_EQ(1u, simple_framer_.ping_frames().size());
3381 }
3382 EXPECT_EQ(1u, simple_framer_.padding_frames().size());
3383}
3384
3385// Test sending an MTU probe, without any surrounding data.
3386TEST_F(QuicPacketCreatorMultiplePacketsTest,
3387 GenerateMtuDiscoveryPacket_Simple) {
3388 delegate_.SetCanWriteAnything();
3389
3390 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3391 static_assert(target_mtu < kMaxOutgoingPacketSize,
3392 "The MTU probe used by the test exceeds maximum packet size");
3393
3394 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3395 .WillOnce(
3396 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3397
3398 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3399
3400 EXPECT_FALSE(creator_.HasPendingFrames());
3401 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3402 ASSERT_EQ(1u, packets_.size());
3403 EXPECT_EQ(target_mtu, packets_[0].encrypted_length);
3404
3405 PacketContents contents;
3406 contents.num_mtu_discovery_frames = 1;
3407 contents.num_padding_frames = 1;
3408 CheckPacketContains(contents, 0);
3409}
3410
3411// Test sending an MTU probe. Surround it with data, to ensure that it resets
3412// the MTU to the value before the probe was sent.
3413TEST_F(QuicPacketCreatorMultiplePacketsTest,
3414 GenerateMtuDiscoveryPacket_SurroundedByData) {
3415 delegate_.SetCanWriteAnything();
3416
3417 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3418 static_assert(target_mtu < kMaxOutgoingPacketSize,
3419 "The MTU probe used by the test exceeds maximum packet size");
3420
3421 // Send enough data so it would always cause two packets to be sent.
3422 const size_t data_len = target_mtu + 1;
3423
3424 // Send a total of five packets: two packets before the probe, the probe
3425 // itself, and two packets after the probe.
3426 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3427 .Times(5)
3428 .WillRepeatedly(
3429 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3430
3431 // Send data before the MTU probe.
3432 CreateData(data_len);
3433 QuicConsumedData consumed = creator_.ConsumeData(
3434 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3435 Perspective::IS_CLIENT),
3436 &iov_, 1u, iov_.iov_len,
3437 /*offset=*/0, NO_FIN);
3438 creator_.Flush();
3439 EXPECT_EQ(data_len, consumed.bytes_consumed);
3440 EXPECT_FALSE(consumed.fin_consumed);
3441 EXPECT_FALSE(creator_.HasPendingFrames());
3442 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3443
3444 // Send the MTU probe.
3445 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3446 EXPECT_FALSE(creator_.HasPendingFrames());
3447 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3448
3449 // Send data after the MTU probe.
3450 CreateData(data_len);
3451 creator_.AttachPacketFlusher();
3452 consumed = creator_.ConsumeData(
3453 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3454 Perspective::IS_CLIENT),
3455 &iov_, 1u, iov_.iov_len,
3456 /*offset=*/data_len, FIN);
3457 creator_.Flush();
3458 EXPECT_EQ(data_len, consumed.bytes_consumed);
3459 EXPECT_TRUE(consumed.fin_consumed);
3460 EXPECT_FALSE(creator_.HasPendingFrames());
3461 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3462
3463 ASSERT_EQ(5u, packets_.size());
3464 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3465 EXPECT_EQ(target_mtu, packets_[2].encrypted_length);
3466 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length);
3467
3468 PacketContents probe_contents;
3469 probe_contents.num_mtu_discovery_frames = 1;
3470 probe_contents.num_padding_frames = 1;
3471
3472 CheckPacketHasSingleStreamFrame(0);
3473 CheckPacketHasSingleStreamFrame(1);
3474 CheckPacketContains(probe_contents, 2);
3475 CheckPacketHasSingleStreamFrame(3);
3476 CheckPacketHasSingleStreamFrame(4);
3477}
3478
3479TEST_F(QuicPacketCreatorMultiplePacketsTest, DontCrashOnInvalidStopWaiting) {
3480 if (VersionSupportsMessageFrames(framer_.transport_version())) {
3481 return;
3482 }
3483 // Test added to ensure the creator does not crash when an invalid frame is
3484 // added. Because this is an indication of internal programming errors,
3485 // DFATALs are expected.
3486 // A 1 byte packet number length can't encode a gap of 1000.
3487 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1000);
3488
3489 delegate_.SetCanNotWrite();
3490 delegate_.SetCanWriteAnything();
3491
3492 // This will not serialize any packets, because of the invalid frame.
3493 EXPECT_CALL(delegate_,
3494 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _));
3495 EXPECT_QUIC_BUG(creator_.Flush(),
3496 "packet_number_length 1 is too small "
3497 "for least_unacked_delta: 1001");
3498}
3499
3500// Regression test for b/31486443.
3501TEST_F(QuicPacketCreatorMultiplePacketsTest,
3502 ConnectionCloseFrameLargerThanPacketSize) {
3503 delegate_.SetCanWriteAnything();
3504 char buf[2000] = {};
dmcardlecf0bfcf2019-12-13 08:08:21 -08003505 quiche::QuicheStringPiece error_details(buf, 2000);
fayang4245c212019-11-05 13:33:46 -08003506 const QuicErrorCode kQuicErrorCode = QUIC_PACKET_WRITE_ERROR;
3507
3508 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
3509 framer_.transport_version(), kQuicErrorCode, std::string(error_details),
3510 /*transport_close_frame_type=*/0);
3511 creator_.ConsumeRetransmittableControlFrame(QuicFrame(frame),
3512 /*bundle_ack=*/false);
3513 EXPECT_TRUE(creator_.HasPendingFrames());
3514 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3515}
3516
3517TEST_F(QuicPacketCreatorMultiplePacketsTest,
3518 RandomPaddingAfterFinSingleStreamSinglePacket) {
3519 const QuicByteCount kStreamFramePayloadSize = 100u;
3520 char buf[kStreamFramePayloadSize] = {};
3521 const QuicStreamId kDataStreamId = 5;
3522 // Set the packet size be enough for one stream frame with 0 stream offset and
3523 // max size of random padding.
3524 size_t length =
3525 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3526 GetPacketHeaderSize(
3527 framer_.transport_version(),
3528 creator_.GetDestinationConnectionIdLength(),
3529 creator_.GetSourceConnectionIdLength(),
3530 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3531 !kIncludeDiversificationNonce,
3532 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3533 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3534 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3535 QuicFramer::GetMinStreamFrameSize(
3536 framer_.transport_version(), kDataStreamId, 0,
3537 /*last_frame_in_packet=*/false,
3538 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes) +
3539 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes;
3540 creator_.SetMaxPacketLength(length);
3541 delegate_.SetCanWriteAnything();
3542 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3543 .WillOnce(
3544 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
dmcardlecf0bfcf2019-12-13 08:08:21 -08003545 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003546 QuicConsumedData consumed = creator_.ConsumeData(
3547 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3548 creator_.Flush();
3549 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3550 EXPECT_FALSE(creator_.HasPendingFrames());
3551 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3552
3553 EXPECT_EQ(1u, packets_.size());
3554 PacketContents contents;
3555 // The packet has both stream and padding frames.
3556 contents.num_padding_frames = 1;
3557 contents.num_stream_frames = 1;
3558 CheckPacketContains(contents, 0);
3559}
3560
3561TEST_F(QuicPacketCreatorMultiplePacketsTest,
3562 RandomPaddingAfterFinSingleStreamMultiplePackets) {
3563 const QuicByteCount kStreamFramePayloadSize = 100u;
3564 char buf[kStreamFramePayloadSize] = {};
3565 const QuicStreamId kDataStreamId = 5;
3566 // Set the packet size be enough for one stream frame with 0 stream offset +
3567 // 1. One or more packets will accommodate.
3568 size_t length =
3569 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3570 GetPacketHeaderSize(
3571 framer_.transport_version(),
3572 creator_.GetDestinationConnectionIdLength(),
3573 creator_.GetSourceConnectionIdLength(),
3574 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3575 !kIncludeDiversificationNonce,
3576 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3577 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3578 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3579 QuicFramer::GetMinStreamFrameSize(
3580 framer_.transport_version(), kDataStreamId, 0,
3581 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
3582 kStreamFramePayloadSize + 1;
3583 creator_.SetMaxPacketLength(length);
3584 delegate_.SetCanWriteAnything();
3585 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3586 .WillRepeatedly(
3587 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
dmcardlecf0bfcf2019-12-13 08:08:21 -08003588 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003589 QuicConsumedData consumed = creator_.ConsumeData(
3590 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3591 creator_.Flush();
3592 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3593 EXPECT_FALSE(creator_.HasPendingFrames());
3594 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3595
3596 EXPECT_LE(1u, packets_.size());
3597 PacketContents contents;
3598 // The first packet has both stream and padding frames.
3599 contents.num_stream_frames = 1;
3600 contents.num_padding_frames = 1;
3601 CheckPacketContains(contents, 0);
3602
3603 for (size_t i = 1; i < packets_.size(); ++i) {
3604 // Following packets only have paddings.
3605 contents.num_stream_frames = 0;
3606 contents.num_padding_frames = 1;
3607 CheckPacketContains(contents, i);
3608 }
3609}
3610
3611TEST_F(QuicPacketCreatorMultiplePacketsTest,
3612 RandomPaddingAfterFinMultipleStreamsMultiplePackets) {
3613 const QuicByteCount kStreamFramePayloadSize = 100u;
3614 char buf[kStreamFramePayloadSize] = {};
3615 const QuicStreamId kDataStreamId1 = 5;
3616 const QuicStreamId kDataStreamId2 = 6;
3617 // Set the packet size be enough for first frame with 0 stream offset + second
3618 // frame + 1 byte payload. two or more packets will accommodate.
3619 size_t length =
3620 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3621 GetPacketHeaderSize(
3622 framer_.transport_version(),
3623 creator_.GetDestinationConnectionIdLength(),
3624 creator_.GetSourceConnectionIdLength(),
3625 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3626 !kIncludeDiversificationNonce,
3627 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3628 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3629 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3630 QuicFramer::GetMinStreamFrameSize(
3631 framer_.transport_version(), kDataStreamId1, 0,
3632 /*last_frame_in_packet=*/false, kStreamFramePayloadSize) +
3633 kStreamFramePayloadSize +
3634 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(),
3635 kDataStreamId1, 0,
3636 /*last_frame_in_packet=*/false, 1) +
3637 1;
3638 creator_.SetMaxPacketLength(length);
3639 delegate_.SetCanWriteAnything();
3640 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3641 .WillRepeatedly(
3642 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
dmcardlecf0bfcf2019-12-13 08:08:21 -08003643 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003644 QuicConsumedData consumed = creator_.ConsumeData(
3645 kDataStreamId1, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3646 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
dmcardlecf0bfcf2019-12-13 08:08:21 -08003647 MakeIOVector(quiche::QuicheStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003648 consumed = creator_.ConsumeData(kDataStreamId2, &iov_, 1u, iov_.iov_len, 0,
3649 FIN_AND_PADDING);
3650 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3651 creator_.Flush();
3652 EXPECT_FALSE(creator_.HasPendingFrames());
3653 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3654
3655 EXPECT_LE(2u, packets_.size());
3656 PacketContents contents;
3657 // The first packet has two stream frames.
3658 contents.num_stream_frames = 2;
3659 CheckPacketContains(contents, 0);
3660
3661 // The second packet has one stream frame and padding frames.
3662 contents.num_stream_frames = 1;
3663 contents.num_padding_frames = 1;
3664 CheckPacketContains(contents, 1);
3665
3666 for (size_t i = 2; i < packets_.size(); ++i) {
3667 // Following packets only have paddings.
3668 contents.num_stream_frames = 0;
3669 contents.num_padding_frames = 1;
3670 CheckPacketContains(contents, i);
3671 }
3672}
3673
3674TEST_F(QuicPacketCreatorMultiplePacketsTest, AddMessageFrame) {
3675 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
3676 return;
3677 }
3678 quic::QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
3679 delegate_.SetCanWriteAnything();
3680 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3681 .WillOnce(
3682 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3683
3684 MakeIOVector("foo", &iov_);
3685 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3686 framer_.transport_version(), Perspective::IS_CLIENT),
3687 &iov_, 1u, iov_.iov_len, 0, FIN);
3688 EXPECT_EQ(
3689 MESSAGE_STATUS_SUCCESS,
3690 creator_.AddMessageFrame(1, MakeSpan(&allocator_, "message", &storage)));
3691 EXPECT_TRUE(creator_.HasPendingFrames());
3692 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3693
3694 // Add a message which causes the flush of current packet.
3695 EXPECT_EQ(
3696 MESSAGE_STATUS_SUCCESS,
3697 creator_.AddMessageFrame(
3698 2,
3699 MakeSpan(&allocator_,
3700 std::string(creator_.GetCurrentLargestMessagePayload(), 'a'),
3701 &storage)));
3702 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3703
3704 // Failed to send messages which cannot fit into one packet.
3705 EXPECT_EQ(
3706 MESSAGE_STATUS_TOO_LARGE,
3707 creator_.AddMessageFrame(
3708 3, MakeSpan(&allocator_,
3709 std::string(
3710 creator_.GetCurrentLargestMessagePayload() + 10, 'a'),
3711 &storage)));
3712}
3713
3714TEST_F(QuicPacketCreatorMultiplePacketsTest, ConnectionId) {
3715 creator_.SetServerConnectionId(TestConnectionId(0x1337));
3716 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3717 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
3718 if (!framer_.version().SupportsClientConnectionIds()) {
3719 return;
3720 }
3721 creator_.SetClientConnectionId(TestConnectionId(0x33));
3722 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3723 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
3724}
3725
QUICHE teama6ef0a62019-03-07 20:34:33 -05003726} // namespace
3727} // namespace test
3728} // namespace quic