blob: 8d79cc4d667f963566482afd8767d9dd0e9808d6 [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>
8#include <memory>
9#include <ostream>
vasilvv872e7a32019-03-12 16:42:44 -070010#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050011
zhongyi546cc452019-04-12 15:27:49 -070012#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050013#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
14#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
15#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
16#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
17#include "net/third_party/quiche/src/quic/core/quic_pending_retransmission.h"
18#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
19#include "net/third_party/quiche/src/quic/core/quic_types.h"
20#include "net/third_party/quiche/src/quic/core/quic_utils.h"
21#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
22#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050023#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
24#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
25#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
26#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
27#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
28#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
29
30using testing::_;
31using testing::DoAll;
32using testing::InSequence;
33using testing::Invoke;
34using testing::Return;
35using testing::SaveArg;
36using testing::StrictMock;
37
38namespace quic {
39namespace test {
40namespace {
41
42// Run tests with combinations of {ParsedQuicVersion,
43// ToggleVersionSerialization}.
44struct TestParams {
45 TestParams(ParsedQuicVersion version, bool version_serialization)
46 : version(version), version_serialization(version_serialization) {}
47
48 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
49 os << "{ version: " << ParsedQuicVersionToString(p.version)
50 << " include version: " << p.version_serialization << " }";
51 return os;
52 }
53
54 ParsedQuicVersion version;
55 bool version_serialization;
56};
57
58// Constructs various test permutations.
59std::vector<TestParams> GetTestParams() {
60 std::vector<TestParams> params;
61 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
62 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
63 params.push_back(TestParams(all_supported_versions[i], true));
64 params.push_back(TestParams(all_supported_versions[i], false));
65 }
66 return params;
67}
68
rchc76cd742019-03-26 16:00:03 -070069class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
70 public:
71 ~MockDebugDelegate() override = default;
72
73 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame& frame));
74};
75
QUICHE teama6ef0a62019-03-07 20:34:33 -050076class TestPacketCreator : public QuicPacketCreator {
77 public:
78 TestPacketCreator(QuicConnectionId connection_id,
79 QuicFramer* framer,
80 DelegateInterface* delegate,
81 SimpleDataProducer* producer)
82 : QuicPacketCreator(connection_id, framer, delegate),
83 producer_(producer),
84 version_(framer->transport_version()) {}
85
fayang62b637b2019-09-16 08:40:49 -070086 bool ConsumeDataToFillCurrentPacket(QuicStreamId id,
87 const struct iovec* iov,
88 int iov_count,
89 size_t total_length,
90 size_t iov_offset,
91 QuicStreamOffset offset,
92 bool fin,
93 bool needs_full_padding,
94 TransmissionType transmission_type,
95 QuicFrame* frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050096 // Save data before data is consumed.
97 QuicByteCount data_length = total_length - iov_offset;
98 if (data_length > 0) {
99 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
100 }
fayang62b637b2019-09-16 08:40:49 -0700101 return QuicPacketCreator::ConsumeDataToFillCurrentPacket(
102 id, data_length - iov_offset, offset, fin, needs_full_padding,
103 transmission_type, frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500104 }
105
106 void StopSendingVersion() {
fayangd4291e42019-05-30 10:31:21 -0700107 if (VersionHasIetfInvariantHeader(version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500108 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
109 return;
110 }
111 QuicPacketCreator::StopSendingVersion();
112 }
113
114 SimpleDataProducer* producer_;
115 QuicTransportVersion version_;
116};
117
118class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
119 public:
120 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) {
121 if (serialized_packet == nullptr) {
122 return;
123 }
124 ClearSerializedPacket(serialized_packet);
125 }
126
127 void SaveSerializedPacket(SerializedPacket* serialized_packet) {
128 if (serialized_packet == nullptr) {
129 return;
130 }
131 delete[] serialized_packet_.encrypted_buffer;
132 serialized_packet_ = *serialized_packet;
133 serialized_packet_.encrypted_buffer = CopyBuffer(*serialized_packet);
134 serialized_packet->retransmittable_frames.clear();
135 }
136
137 void DeleteSerializedPacket() {
138 delete[] serialized_packet_.encrypted_buffer;
139 serialized_packet_.encrypted_buffer = nullptr;
140 ClearSerializedPacket(&serialized_packet_);
141 }
142
143 protected:
144 QuicPacketCreatorTest()
145 : connection_id_(TestConnectionId(2)),
146 server_framer_(SupportedVersions(GetParam().version),
147 QuicTime::Zero(),
148 Perspective::IS_SERVER,
149 connection_id_.length()),
150 client_framer_(SupportedVersions(GetParam().version),
151 QuicTime::Zero(),
152 Perspective::IS_CLIENT,
153 connection_id_.length()),
154 data_("foo"),
155 creator_(connection_id_, &client_framer_, &delegate_, &producer_),
156 serialized_packet_(creator_.NoPacket()) {
157 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
vasilvv0fc587f2019-09-06 13:33:08 -0700158 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, std::make_unique<NullEncrypter>(
QUICHE team88ea0082019-03-15 10:05:26 -0700159 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700160 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, std::make_unique<NullEncrypter>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500161 Perspective::IS_CLIENT));
162 creator_.SetEncrypter(
163 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700164 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500165 client_framer_.set_visitor(&framer_visitor_);
166 server_framer_.set_visitor(&framer_visitor_);
167 client_framer_.set_data_producer(&producer_);
zhongyi546cc452019-04-12 15:27:49 -0700168 if (server_framer_.version().KnowsWhichDecrypterToUse()) {
169 server_framer_.InstallDecrypter(
170 ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -0700171 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700172 server_framer_.InstallDecrypter(
173 ENCRYPTION_HANDSHAKE,
vasilvv0fc587f2019-09-06 13:33:08 -0700174 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700175 server_framer_.InstallDecrypter(
176 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700177 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700178 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500179 }
180
181 ~QuicPacketCreatorTest() override {
182 delete[] serialized_packet_.encrypted_buffer;
183 ClearSerializedPacket(&serialized_packet_);
184 }
185
186 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
187 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
dschinazi66dea072019-04-09 11:41:06 -0700188 &creator_, frames, buffer_, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500189 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
190 packet.encryption_level);
191 return packet;
192 }
193
194 void ProcessPacket(const SerializedPacket& packet) {
195 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
196 packet.encrypted_length);
197 server_framer_.ProcessPacket(encrypted_packet);
198 }
199
200 void CheckStreamFrame(const QuicFrame& frame,
201 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700202 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500203 QuicStreamOffset offset,
204 bool fin) {
205 EXPECT_EQ(STREAM_FRAME, frame.type);
206 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
dschinazi66dea072019-04-09 11:41:06 -0700207 char buf[kMaxOutgoingPacketSize];
208 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500209 if (frame.stream_frame.data_length > 0) {
210 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
211 frame.stream_frame.data_length, &writer);
212 }
213 EXPECT_EQ(data, QuicStringPiece(buf, frame.stream_frame.data_length));
214 EXPECT_EQ(offset, frame.stream_frame.offset);
215 EXPECT_EQ(fin, frame.stream_frame.fin);
216 }
217
218 // Returns the number of bytes consumed by the header of packet, including
219 // the version.
220 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
221 return GetPacketHeaderSize(
222 version, creator_.GetDestinationConnectionIdLength(),
223 creator_.GetSourceConnectionIdLength(),
224 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
225 !kIncludeDiversificationNonce,
226 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
227 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
228 QuicPacketCreatorPeer::GetLengthLength(&creator_));
229 }
230
231 // Returns the number of bytes of overhead that will be added to a packet
232 // of maximum length.
233 size_t GetEncryptionOverhead() {
234 return creator_.max_packet_length() -
235 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
236 }
237
238 // Returns the number of bytes consumed by the non-data fields of a stream
239 // frame, assuming it is the last frame in the packet
240 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
241 return QuicFramer::GetMinStreamFrameSize(
242 version, GetNthClientInitiatedStreamId(1), kOffset, true,
243 /* data_length= */ 0);
244 }
245
246 QuicPendingRetransmission CreateRetransmission(
247 const QuicFrames& retransmittable_frames,
248 bool has_crypto_handshake,
249 int num_padding_bytes,
250 EncryptionLevel encryption_level,
251 QuicPacketNumberLength packet_number_length) {
252 return QuicPendingRetransmission(QuicPacketNumber(1u), NOT_RETRANSMISSION,
253 retransmittable_frames,
254 has_crypto_handshake, num_padding_bytes,
255 encryption_level, packet_number_length);
256 }
257
258 bool IsDefaultTestConfiguration() {
259 TestParams p = GetParam();
260 return p.version == AllSupportedVersions()[0] && p.version_serialization;
261 }
262
263 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
dschinazi552accc2019-06-17 17:07:34 -0700264 return QuicUtils::GetFirstBidirectionalStreamId(
265 creator_.transport_version(), Perspective::IS_CLIENT) +
266 n * 2;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500267 }
268
269 static const QuicStreamOffset kOffset = 0u;
270
dschinazi66dea072019-04-09 11:41:06 -0700271 char buffer_[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500272 QuicConnectionId connection_id_;
273 QuicFrames frames_;
274 QuicFramer server_framer_;
275 QuicFramer client_framer_;
276 StrictMock<MockFramerVisitor> framer_visitor_;
277 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700278 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500279 struct iovec iov_;
280 TestPacketCreator creator_;
281 SerializedPacket serialized_packet_;
282 SimpleDataProducer producer_;
283 SimpleBufferAllocator allocator_;
284};
285
286// Run all packet creator tests with all supported versions of QUIC, and with
287// and without version in the packet header, as well as doing a run for each
288// length of truncated connection id.
289INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
290 QuicPacketCreatorTest,
291 ::testing::ValuesIn(GetTestParams()));
292
293TEST_P(QuicPacketCreatorTest, SerializeFrames) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700294 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500295 EncryptionLevel level = static_cast<EncryptionLevel>(i);
296 creator_.set_encryption_level(level);
297 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700298 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
299 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang49523232019-05-03 06:28:22 -0700300 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700301 frames_.push_back(
302 QuicFrame(QuicStreamFrame(stream_id, false, 0u, QuicStringPiece())));
303 frames_.push_back(
304 QuicFrame(QuicStreamFrame(stream_id, true, 0u, QuicStringPiece())));
305 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500306 SerializedPacket serialized = SerializeAllFrames(frames_);
307 EXPECT_EQ(level, serialized.encryption_level);
308 delete frames_[0].ack_frame;
309 frames_.clear();
310
311 {
312 InSequence s;
313 EXPECT_CALL(framer_visitor_, OnPacket());
314 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
315 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
316 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
317 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
318 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
319 .WillOnce(Return(true));
320 EXPECT_CALL(framer_visitor_,
321 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
322 .WillOnce(Return(true));
323 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
324 .WillOnce(Return(true));
fayang49523232019-05-03 06:28:22 -0700325 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700326 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
327 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
328 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500329 EXPECT_CALL(framer_visitor_, OnPacketComplete());
330 }
331 ProcessPacket(serialized);
332 }
333}
334
335TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
fayangd4291e42019-05-30 10:31:21 -0700336 if (VersionHasIetfInvariantHeader(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500337 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
338 }
339 // If the original packet number length, the current packet number
340 // length, and the configured send packet number length are different, the
341 // retransmit must sent with the original length and the others do not change.
342 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_,
343 PACKET_2BYTE_PACKET_NUMBER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500344 QuicFrames frames;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700345 std::string data("a");
346 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
347 QuicStreamFrame stream_frame(
348 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
349 /*fin=*/false, 0u, QuicStringPiece());
350 frames.push_back(QuicFrame(stream_frame));
351 } else {
352 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
353 frames.push_back(
354 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
355 }
dschinazi66dea072019-04-09 11:41:06 -0700356 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500357 QuicPendingRetransmission retransmission(CreateRetransmission(
358 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700359 ENCRYPTION_INITIAL, PACKET_4BYTE_PACKET_NUMBER));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500360 EXPECT_CALL(delegate_, OnSerializedPacket(_))
361 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
dschinazi66dea072019-04-09 11:41:06 -0700362 creator_.ReserializeAllFrames(retransmission, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500363 // The packet number length is updated after every packet is sent,
364 // so there is no need to restore the old length after sending.
365 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
366 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
367 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
368 serialized_packet_.packet_number_length);
369
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(_));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700377 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
378 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
379 } else {
380 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
381 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500382 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
383 EXPECT_CALL(framer_visitor_, OnPacketComplete());
384 }
385 ProcessPacket(serialized_packet_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700386 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500387}
388
389TEST_P(QuicPacketCreatorTest, ReserializeCryptoFrameWithForwardSecurity) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500390 QuicFrames frames;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700391 std::string data("a");
392 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
393 QuicStreamFrame stream_frame(
394 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
395 /*fin=*/false, 0u, QuicStringPiece());
396 frames.push_back(QuicFrame(stream_frame));
397 } else {
398 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
399 frames.push_back(
400 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
401 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
dschinazi66dea072019-04-09 11:41:06 -0700403 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500404 QuicPendingRetransmission retransmission(CreateRetransmission(
405 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700406 ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500407 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
408 EXPECT_CALL(delegate_, OnSerializedPacket(_))
409 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
dschinazi66dea072019-04-09 11:41:06 -0700410 creator_.ReserializeAllFrames(retransmission, buffer, kMaxOutgoingPacketSize);
QUICHE team6987b4a2019-03-15 16:23:04 -0700411 EXPECT_EQ(ENCRYPTION_INITIAL, serialized_packet_.encryption_level);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700412 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500413}
414
415TEST_P(QuicPacketCreatorTest, ReserializeFrameWithForwardSecurity) {
416 QuicStreamFrame stream_frame(0u, /*fin=*/false, 0u, QuicStringPiece());
417 QuicFrames frames;
418 frames.push_back(QuicFrame(stream_frame));
419 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
dschinazi66dea072019-04-09 11:41:06 -0700420 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500421 QuicPendingRetransmission retransmission(CreateRetransmission(
422 frames, false /* has_crypto_handshake */, 0 /* no padding */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700423 ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500424 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
425 EXPECT_CALL(delegate_, OnSerializedPacket(_))
426 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
dschinazi66dea072019-04-09 11:41:06 -0700427 creator_.ReserializeAllFrames(retransmission, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500428 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, serialized_packet_.encryption_level);
429}
430
431TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPadding) {
432 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700433 std::string data = "fake handshake message data";
434 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
435 MakeIOVector(data, &iov_);
436 producer_.SaveStreamData(
437 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
438 1u, 0u, iov_.iov_len);
439 QuicPacketCreatorPeer::CreateStreamFrame(
440 &creator_,
441 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
442 iov_.iov_len, 0u, false, &frame);
443 } else {
444 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
445 EXPECT_TRUE(QuicPacketCreatorPeer::CreateCryptoFrame(
446 &creator_, ENCRYPTION_INITIAL, data.length(), 0, &frame));
447 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500448 QuicFrames frames;
449 frames.push_back(frame);
dschinazi66dea072019-04-09 11:41:06 -0700450 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500451 QuicPendingRetransmission retransmission(CreateRetransmission(
452 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700453 ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500454 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
455 EXPECT_CALL(delegate_, OnSerializedPacket(_))
456 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
dschinazi66dea072019-04-09 11:41:06 -0700457 creator_.ReserializeAllFrames(retransmission, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500458 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700459 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500460}
461
462TEST_P(QuicPacketCreatorTest, DoNotRetransmitPendingPadding) {
463 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700464 std::string data = "fake message data";
465 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
466 MakeIOVector(data, &iov_);
467 producer_.SaveStreamData(
468 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
469 1u, 0u, iov_.iov_len);
470 QuicPacketCreatorPeer::CreateStreamFrame(
471 &creator_,
472 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
473 iov_.iov_len, 0u, false, &frame);
474 } else {
475 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
476 EXPECT_TRUE(QuicPacketCreatorPeer::CreateCryptoFrame(
477 &creator_, ENCRYPTION_INITIAL, data.length(), 0, &frame));
478 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500479
480 const int kNumPaddingBytes1 = 4;
481 int packet_size = 0;
482 {
483 QuicFrames frames;
484 frames.push_back(frame);
dschinazi66dea072019-04-09 11:41:06 -0700485 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500486 QuicPendingRetransmission retransmission(CreateRetransmission(
487 frames, false /* has_crypto_handshake */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700488 kNumPaddingBytes1 /* padding bytes */, ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500489 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
490 EXPECT_CALL(delegate_, OnSerializedPacket(_))
491 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
dschinazi66dea072019-04-09 11:41:06 -0700492 creator_.ReserializeAllFrames(retransmission, buffer,
493 kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500494 packet_size = serialized_packet_.encrypted_length;
495 }
496
497 {
498 InSequence s;
499 EXPECT_CALL(framer_visitor_, OnPacket());
500 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
501 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
502 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
503 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700504 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
505 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
506 } else {
507 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
508 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500509 // Pending paddings are not retransmitted.
510 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
511 EXPECT_CALL(framer_visitor_, OnPacketComplete());
512 }
513 ProcessPacket(serialized_packet_);
514
515 const int kNumPaddingBytes2 = 44;
516 QuicFrames frames;
517 frames.push_back(frame);
dschinazi66dea072019-04-09 11:41:06 -0700518 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500519 QuicPendingRetransmission retransmission(CreateRetransmission(
520 frames, false /* has_crypto_handshake */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700521 kNumPaddingBytes2 /* padding bytes */, ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500522 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
523 EXPECT_CALL(delegate_, OnSerializedPacket(_))
524 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
dschinazi66dea072019-04-09 11:41:06 -0700525 creator_.ReserializeAllFrames(retransmission, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500526
527 EXPECT_EQ(packet_size, serialized_packet_.encrypted_length);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700528 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500529}
530
531TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700532 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500533 const size_t overhead =
534 GetPacketHeaderOverhead(client_framer_.transport_version()) +
535 GetEncryptionOverhead() +
536 GetStreamFrameOverhead(client_framer_.transport_version());
537 size_t capacity = kDefaultMaxPacketSize - overhead;
538 for (int delta = -5; delta <= 0; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700539 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500540 size_t bytes_free = 0 - delta;
541
542 QuicFrame frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500543 SimpleDataProducer producer;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500544 QuicPacketCreatorPeer::framer(&creator_)->set_data_producer(&producer);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700545 MakeIOVector(data, &iov_);
546 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
547 client_framer_.transport_version(), Perspective::IS_CLIENT);
548 producer.SaveStreamData(stream_id, &iov_, 1u, 0u, iov_.iov_len);
549 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, stream_id, iov_.iov_len,
550 kOffset, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500551 QuicFrames frames;
552 frames.push_back(frame);
dschinazi66dea072019-04-09 11:41:06 -0700553 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500554 QuicPendingRetransmission retransmission(CreateRetransmission(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700555 frames, false /* has_crypto_handshake */, -1 /* needs full padding */,
556 ENCRYPTION_FORWARD_SECURE,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500557 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
558 EXPECT_CALL(delegate_, OnSerializedPacket(_))
559 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
dschinazi66dea072019-04-09 11:41:06 -0700560 creator_.ReserializeAllFrames(retransmission, buffer,
561 kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500562
563 // If there is not enough space in the packet to fit a padding frame
564 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
565 // will not be padded.
566 if (bytes_free < 3) {
567 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
568 serialized_packet_.encrypted_length);
569 } else {
570 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
571 }
572
573 frames_.clear();
574 }
575}
576
577TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
fkastenholz591814c2019-09-06 12:11:46 -0700578 QuicConnectionCloseFrame frame(GetParam().version.transport_version,
579 QUIC_NO_ERROR, "error",
580 /*transport_close_frame_type=*/0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500581
582 QuicFrames frames;
583 frames.push_back(QuicFrame(&frame));
584 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700585 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500586 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
587 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
588
589 InSequence s;
590 EXPECT_CALL(framer_visitor_, OnPacket());
591 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
592 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
593 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
594 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
595 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
596 EXPECT_CALL(framer_visitor_, OnPacketComplete());
597
598 ProcessPacket(serialized);
599}
600
fayang62b637b2019-09-16 08:40:49 -0700601TEST_P(QuicPacketCreatorTest, ConsumeCryptoDataToFillCurrentPacket) {
vasilvvc48c8712019-03-11 13:38:16 -0700602 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500603 QuicFrame frame;
fayang62b637b2019-09-16 08:40:49 -0700604 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
605 ENCRYPTION_INITIAL, data.length(), 0,
606 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500607 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
608 EXPECT_TRUE(creator_.HasPendingFrames());
609}
610
fayang62b637b2019-09-16 08:40:49 -0700611TEST_P(QuicPacketCreatorTest, ConsumeDataToFillCurrentPacket) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700612 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500613 QuicFrame frame;
614 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700615 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
616 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700617 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
618 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
619 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500620 size_t consumed = frame.stream_frame.data_length;
621 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700622 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500623 EXPECT_TRUE(creator_.HasPendingFrames());
624}
625
626TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700627 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500628 QuicFrame frame;
629 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700630 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
631 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700632 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
633 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
634 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500635 size_t consumed = frame.stream_frame.data_length;
636 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700637 CheckStreamFrame(frame, stream_id, "test", 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500638 EXPECT_TRUE(creator_.HasPendingFrames());
639}
640
641TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700642 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500643 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700644 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
645 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700646 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
647 stream_id, nullptr, 0u, 0u, 0u, 0u, true, false, NOT_RETRANSMISSION,
648 &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500649 size_t consumed = frame.stream_frame.data_length;
650 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700651 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500652 EXPECT_TRUE(creator_.HasPendingFrames());
653}
654
655TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
656 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
657 const size_t overhead =
658 GetPacketHeaderOverhead(client_framer_.transport_version()) +
659 GetEncryptionOverhead();
QUICHE team2252b702019-05-14 23:55:14 -0400660 for (size_t i = overhead + QuicPacketCreator::MinPlaintextPacketSize(
661 client_framer_.version());
nharper55fa6132019-05-07 19:37:21 -0700662 i < overhead + 100; ++i) {
663 SCOPED_TRACE(i);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500664 creator_.SetMaxPacketLength(i);
665 const bool should_have_room =
666 i >
667 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
668 ASSERT_EQ(should_have_room,
669 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
670 kOffset, /* data_size=*/0xffff));
671 if (should_have_room) {
672 QuicFrame frame;
673 MakeIOVector("testdata", &iov_);
674 EXPECT_CALL(delegate_, OnSerializedPacket(_))
675 .WillRepeatedly(Invoke(
676 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
fayang62b637b2019-09-16 08:40:49 -0700677 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
678 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u,
679 kOffset, false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500680 size_t bytes_consumed = frame.stream_frame.data_length;
681 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700682 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500683 }
684 }
685}
686
687TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
688 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
689 // Compute the total overhead for a single frame in packet.
690 const size_t overhead =
691 GetPacketHeaderOverhead(client_framer_.transport_version()) +
692 GetEncryptionOverhead() +
693 GetStreamFrameOverhead(client_framer_.transport_version());
694 size_t capacity = kDefaultMaxPacketSize - overhead;
695 // Now, test various sizes around this size.
696 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700697 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500698 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
699 QuicFrame frame;
700 MakeIOVector(data, &iov_);
fayang62b637b2019-09-16 08:40:49 -0700701 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
702 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
703 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500704
705 // BytesFree() returns bytes available for the next frame, which will
706 // be two bytes smaller since the stream frame would need to be grown.
707 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
708 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
709 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
710 EXPECT_CALL(delegate_, OnSerializedPacket(_))
711 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700712 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500713 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
714 DeleteSerializedPacket();
715 }
716}
717
718TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700719 // This test serializes crypto payloads slightly larger than a packet, which
720 // Causes the multi-packet ClientHello check to fail.
danzh88e3e052019-06-13 11:47:18 -0700721 SetQuicFlag(FLAGS_quic_enforce_single_packet_chlo, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500722 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700723 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500724 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700725 GetEncryptionOverhead();
726 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
dschinazi66dea072019-04-09 11:41:06 -0700727 overhead +=
728 QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxOutgoingPacketSize);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700729 } else {
730 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
731 }
dschinazi66dea072019-04-09 11:41:06 -0700732 ASSERT_GT(kMaxOutgoingPacketSize, overhead);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500733 size_t capacity = kDefaultMaxPacketSize - overhead;
734 // Now, test various sizes around this size.
735 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700736 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700737 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500738 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
739
740 QuicFrame frame;
741 MakeIOVector(data, &iov_);
742 EXPECT_CALL(delegate_, OnSerializedPacket(_))
743 .WillRepeatedly(
744 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700745 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
fayang62b637b2019-09-16 08:40:49 -0700746 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700747 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
748 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
749 &frame));
750 size_t bytes_consumed = frame.stream_frame.data_length;
751 EXPECT_LT(0u, bytes_consumed);
752 } else {
753 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
fayang62b637b2019-09-16 08:40:49 -0700754 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
nharper51961cf2019-05-13 13:23:24 -0700755 ENCRYPTION_INITIAL, data.length(), kOffset,
756 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700757 size_t bytes_consumed = frame.crypto_frame->data_length;
758 EXPECT_LT(0u, bytes_consumed);
759 }
fayang62b637b2019-09-16 08:40:49 -0700760 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500761 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
762 // If there is not enough space in the packet to fit a padding frame
763 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
764 // will not be padded.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700765 if (bytes_free < 3 &&
766 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500767 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
768 serialized_packet_.encrypted_length);
769 } else {
770 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
771 }
772 DeleteSerializedPacket();
773 }
774}
775
776TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
777 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
778 // Compute the total overhead for a single frame in packet.
779 const size_t overhead =
780 GetPacketHeaderOverhead(client_framer_.transport_version()) +
781 GetEncryptionOverhead() +
782 GetStreamFrameOverhead(client_framer_.transport_version());
783 ASSERT_GT(kDefaultMaxPacketSize, overhead);
784 size_t capacity = kDefaultMaxPacketSize - overhead;
785 // Now, test various sizes around this size.
786 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700787 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500788 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
789
790 QuicFrame frame;
791 MakeIOVector(data, &iov_);
792 EXPECT_CALL(delegate_, OnSerializedPacket(_))
793 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700794 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
795 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
796 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500797 size_t bytes_consumed = frame.stream_frame.data_length;
798 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700799 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500800 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
801 if (bytes_free > 0) {
802 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
803 serialized_packet_.encrypted_length);
804 } else {
805 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
806 }
807 DeleteSerializedPacket();
808 }
809}
810
811TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
812 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
813 ParsedQuicVersionVector versions;
814 versions.push_back(test::QuicVersionMax());
fayangd4291e42019-05-30 10:31:21 -0700815 const bool ietf_quic =
816 VersionHasIetfInvariantHeader(GetParam().version.transport_version);
dschinazi48ac9192019-07-31 00:07:26 -0700817 const bool has_length_prefix =
818 GetParam().version.HasLengthPrefixedConnectionIds();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500819 std::unique_ptr<QuicEncryptedPacket> encrypted(
dschinazi48ac9192019-07-31 00:07:26 -0700820 creator_.SerializeVersionNegotiationPacket(ietf_quic, has_length_prefix,
821 versions));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500822
823 {
824 InSequence s;
825 EXPECT_CALL(framer_visitor_, OnPacket());
826 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
827 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
828 }
829 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
830 client_framer_.ProcessPacket(*encrypted);
831}
832
833TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700834 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500835 EncryptionLevel level = static_cast<EncryptionLevel>(i);
836
837 creator_.set_encryption_level(level);
838
839 OwningSerializedPacketPointer encrypted;
fkastenholz305e1732019-06-18 05:01:22 -0700840 if (VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500841 QuicPathFrameBuffer payload = {
842 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
843 encrypted =
844 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
845 } else {
846 encrypted = creator_.SerializeConnectivityProbingPacket();
847 }
848 {
849 InSequence s;
850 EXPECT_CALL(framer_visitor_, OnPacket());
851 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
852 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
853 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
854 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
fkastenholz305e1732019-06-18 05:01:22 -0700855 if (VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500856 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
857 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
858 } else {
859 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
860 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
861 }
862 EXPECT_CALL(framer_visitor_, OnPacketComplete());
863 }
864 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
865 server_framer_.ProcessPacket(QuicEncryptedPacket(
866 encrypted->encrypted_buffer, encrypted->encrypted_length));
867 }
868}
869
870TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
fkastenholz305e1732019-06-18 05:01:22 -0700871 if (!VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500872 return;
873 }
874 QuicPathFrameBuffer payload = {
875 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
876
QUICHE team6987b4a2019-03-15 16:23:04 -0700877 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500878 EncryptionLevel level = static_cast<EncryptionLevel>(i);
879
880 creator_.set_encryption_level(level);
881
882 OwningSerializedPacketPointer encrypted(
883 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
884 {
885 InSequence s;
886 EXPECT_CALL(framer_visitor_, OnPacket());
887 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
888 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
889 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
890 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
891 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
892 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
893 EXPECT_CALL(framer_visitor_, OnPacketComplete());
894 }
895 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
896 server_framer_.ProcessPacket(QuicEncryptedPacket(
897 encrypted->encrypted_buffer, encrypted->encrypted_length));
898 }
899}
900
901TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
fkastenholz305e1732019-06-18 05:01:22 -0700902 if (!VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500903 return;
904 }
905 QuicPathFrameBuffer payload0 = {
906 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
907
QUICHE team6987b4a2019-03-15 16:23:04 -0700908 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500909 EncryptionLevel level = static_cast<EncryptionLevel>(i);
910 creator_.set_encryption_level(level);
911
912 QuicDeque<QuicPathFrameBuffer> payloads;
913 payloads.push_back(payload0);
914
915 OwningSerializedPacketPointer encrypted(
916 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
917 true));
918 {
919 InSequence s;
920 EXPECT_CALL(framer_visitor_, OnPacket());
921 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
922 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
923 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
924 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
925 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
926 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
927 EXPECT_CALL(framer_visitor_, OnPacketComplete());
928 }
929 server_framer_.ProcessPacket(QuicEncryptedPacket(
930 encrypted->encrypted_buffer, encrypted->encrypted_length));
931 }
932}
933
934TEST_P(QuicPacketCreatorTest,
935 SerializePathResponseProbePacket1PayloadUnPadded) {
fkastenholz305e1732019-06-18 05:01:22 -0700936 if (!VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500937 return;
938 }
939 QuicPathFrameBuffer payload0 = {
940 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
941
QUICHE team6987b4a2019-03-15 16:23:04 -0700942 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500943 EncryptionLevel level = static_cast<EncryptionLevel>(i);
944 creator_.set_encryption_level(level);
945
946 QuicDeque<QuicPathFrameBuffer> payloads;
947 payloads.push_back(payload0);
948
949 OwningSerializedPacketPointer encrypted(
950 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
951 false));
952 {
953 InSequence s;
954 EXPECT_CALL(framer_visitor_, OnPacket());
955 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
956 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
957 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
958 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
959 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
960 EXPECT_CALL(framer_visitor_, OnPacketComplete());
961 }
962 server_framer_.ProcessPacket(QuicEncryptedPacket(
963 encrypted->encrypted_buffer, encrypted->encrypted_length));
964 }
965}
966
967TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
fkastenholz305e1732019-06-18 05:01:22 -0700968 if (!VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500969 return;
970 }
971 QuicPathFrameBuffer payload0 = {
972 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
973 QuicPathFrameBuffer payload1 = {
974 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
975
QUICHE team6987b4a2019-03-15 16:23:04 -0700976 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500977 EncryptionLevel level = static_cast<EncryptionLevel>(i);
978 creator_.set_encryption_level(level);
979
980 QuicDeque<QuicPathFrameBuffer> payloads;
981 payloads.push_back(payload0);
982 payloads.push_back(payload1);
983
984 OwningSerializedPacketPointer encrypted(
985 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
986 true));
987 {
988 InSequence s;
989 EXPECT_CALL(framer_visitor_, OnPacket());
990 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
991 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
992 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
993 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
994 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
995 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
996 EXPECT_CALL(framer_visitor_, OnPacketComplete());
997 }
998 server_framer_.ProcessPacket(QuicEncryptedPacket(
999 encrypted->encrypted_buffer, encrypted->encrypted_length));
1000 }
1001}
1002
1003TEST_P(QuicPacketCreatorTest,
1004 SerializePathResponseProbePacket2PayloadsUnPadded) {
fkastenholz305e1732019-06-18 05:01:22 -07001005 if (!VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001006 return;
1007 }
1008 QuicPathFrameBuffer payload0 = {
1009 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1010 QuicPathFrameBuffer payload1 = {
1011 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1012
QUICHE team6987b4a2019-03-15 16:23:04 -07001013 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001014 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1015 creator_.set_encryption_level(level);
1016
1017 QuicDeque<QuicPathFrameBuffer> payloads;
1018 payloads.push_back(payload0);
1019 payloads.push_back(payload1);
1020
1021 OwningSerializedPacketPointer encrypted(
1022 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1023 false));
1024 {
1025 InSequence s;
1026 EXPECT_CALL(framer_visitor_, OnPacket());
1027 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1028 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1029 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1030 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1031 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1032 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1033 }
1034 server_framer_.ProcessPacket(QuicEncryptedPacket(
1035 encrypted->encrypted_buffer, encrypted->encrypted_length));
1036 }
1037}
1038
1039TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
fkastenholz305e1732019-06-18 05:01:22 -07001040 if (!VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001041 return;
1042 }
1043 QuicPathFrameBuffer payload0 = {
1044 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1045 QuicPathFrameBuffer payload1 = {
1046 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1047 QuicPathFrameBuffer payload2 = {
1048 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1049
QUICHE team6987b4a2019-03-15 16:23:04 -07001050 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001051 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1052 creator_.set_encryption_level(level);
1053
1054 QuicDeque<QuicPathFrameBuffer> payloads;
1055 payloads.push_back(payload0);
1056 payloads.push_back(payload1);
1057 payloads.push_back(payload2);
1058
1059 OwningSerializedPacketPointer encrypted(
1060 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1061 true));
1062 {
1063 InSequence s;
1064 EXPECT_CALL(framer_visitor_, OnPacket());
1065 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1066 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1067 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1068 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1069 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1070 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1071 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1072 }
1073 server_framer_.ProcessPacket(QuicEncryptedPacket(
1074 encrypted->encrypted_buffer, encrypted->encrypted_length));
1075 }
1076}
1077
1078TEST_P(QuicPacketCreatorTest,
1079 SerializePathResponseProbePacket3PayloadsUnpadded) {
fkastenholz305e1732019-06-18 05:01:22 -07001080 if (!VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001081 return;
1082 }
1083 QuicPathFrameBuffer payload0 = {
1084 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1085 QuicPathFrameBuffer payload1 = {
1086 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1087 QuicPathFrameBuffer payload2 = {
1088 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1089
QUICHE team6987b4a2019-03-15 16:23:04 -07001090 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001091 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1092 creator_.set_encryption_level(level);
1093
1094 QuicDeque<QuicPathFrameBuffer> payloads;
1095 payloads.push_back(payload0);
1096 payloads.push_back(payload1);
1097 payloads.push_back(payload2);
1098
1099 OwningSerializedPacketPointer encrypted(
1100 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1101 false));
1102 InSequence s;
1103 EXPECT_CALL(framer_visitor_, OnPacket());
1104 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1105 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1106 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1107 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1108 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1109 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1110
1111 server_framer_.ProcessPacket(QuicEncryptedPacket(
1112 encrypted->encrypted_buffer, encrypted->encrypted_length));
1113 }
1114}
1115
1116TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
fayangd4291e42019-05-30 10:31:21 -07001117 if (VersionHasIetfInvariantHeader(GetParam().version.transport_version) &&
fayang3ac15c12019-06-14 14:04:51 -07001118 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001119 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1120 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1121 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1122 } else {
1123 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1124 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1125 }
1126
1127 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1128 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1129 10000 / kDefaultMaxPacketSize);
1130 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1131 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1132
1133 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1134 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1135 10000 / kDefaultMaxPacketSize);
1136 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1137 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1138
1139 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1140 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1141 10000 / kDefaultMaxPacketSize);
1142 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1143 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1144
1145 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1146 UINT64_C(64) * 256 * 256 * 256 * 256);
1147 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1148 10000 / kDefaultMaxPacketSize);
1149 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1150 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1151}
1152
1153TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1154 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
fayangd4291e42019-05-30 10:31:21 -07001155 if (VersionHasIetfInvariantHeader(GetParam().version.transport_version) &&
fayang3ac15c12019-06-14 14:04:51 -07001156 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001157 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1158 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1159 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1160 } else {
1161 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1162 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1163 }
1164
1165 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1166 10000 / kDefaultMaxPacketSize);
1167 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1168 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1169
1170 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1171 10000 * 256 / kDefaultMaxPacketSize);
1172 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1173 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1174
1175 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1176 10000 * 256 * 256 / kDefaultMaxPacketSize);
1177 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1178 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1179
1180 creator_.UpdatePacketNumberLength(
1181 QuicPacketNumber(1),
1182 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1183 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1184 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1185}
1186
fayang4c1c2362019-09-13 07:20:01 -07001187TEST_P(QuicPacketCreatorTest, SkipNPacketNumbers) {
1188 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
1189 if (VersionHasIetfInvariantHeader(GetParam().version.transport_version) &&
1190 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1191 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1192 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1193 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1194 } else {
1195 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1196 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1197 }
1198 creator_.SkipNPacketNumbers(63, QuicPacketNumber(2),
1199 10000 / kDefaultMaxPacketSize);
1200 EXPECT_EQ(QuicPacketNumber(64), creator_.packet_number());
1201 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1202 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1203
1204 creator_.SkipNPacketNumbers(64 * 255, QuicPacketNumber(2),
1205 10000 / kDefaultMaxPacketSize);
1206 EXPECT_EQ(QuicPacketNumber(64 * 256), creator_.packet_number());
1207 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1208 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1209
1210 creator_.SkipNPacketNumbers(64 * 256 * 255, QuicPacketNumber(2),
1211 10000 / kDefaultMaxPacketSize);
1212 EXPECT_EQ(QuicPacketNumber(64 * 256 * 256), creator_.packet_number());
1213 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1214 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1215}
1216
QUICHE teama6ef0a62019-03-07 20:34:33 -05001217TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1218 if (!GetParam().version_serialization) {
1219 creator_.StopSendingVersion();
1220 }
nharper55fa6132019-05-07 19:37:21 -07001221 std::string data("test data");
1222 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1223 QuicStreamFrame stream_frame(
1224 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1225 /*fin=*/false, 0u, QuicStringPiece());
1226 frames_.push_back(QuicFrame(stream_frame));
1227 } else {
1228 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1229 frames_.push_back(
1230 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1231 }
1232 SerializedPacket serialized = SerializeAllFrames(frames_);
1233
1234 QuicPacketHeader header;
1235 {
1236 InSequence s;
1237 EXPECT_CALL(framer_visitor_, OnPacket());
1238 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1239 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1240 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1241 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1242 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1243 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1244 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1245 } else {
1246 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1247 }
1248 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1249 }
1250 ProcessPacket(serialized);
1251 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1252 DeleteFrames(&frames_);
1253}
1254
1255TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
1256 if (!GetParam().version_serialization) {
1257 creator_.StopSendingVersion();
1258 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001259 std::string data("a");
1260 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1261 QuicStreamFrame stream_frame(
1262 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1263 /*fin=*/false, 0u, QuicStringPiece());
1264 frames_.push_back(QuicFrame(stream_frame));
1265 } else {
1266 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1267 frames_.push_back(
1268 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1269 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001270 SerializedPacket serialized = SerializeAllFrames(frames_);
1271
1272 QuicPacketHeader header;
1273 {
1274 InSequence s;
1275 EXPECT_CALL(framer_visitor_, OnPacket());
1276 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1277 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1278 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1279 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1280 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001281 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1282 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1283 } else {
1284 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1285 }
nharper55fa6132019-05-07 19:37:21 -07001286 if (client_framer_.version().HasHeaderProtection()) {
1287 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1288 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001289 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1290 }
1291 ProcessPacket(serialized);
1292 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001293 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001294}
1295
1296TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1297 if (!GetParam().version_serialization) {
1298 creator_.StopSendingVersion();
1299 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001300 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001301 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001302 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001303 size_t payload_length = creator_.max_packet_length();
1304 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001305 MakeIOVector(too_long_payload, &iov_);
1306 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1307 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001308 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1309 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001310 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1311 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
1312 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001313 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001314 // The entire payload could not be consumed.
1315 EXPECT_GT(payload_length, consumed);
fayang62b637b2019-09-16 08:40:49 -07001316 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001317 DeleteSerializedPacket();
1318}
1319
1320TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1321 if (!GetParam().version_serialization) {
1322 creator_.StopSendingVersion();
1323 }
1324 const size_t max_plaintext_size =
1325 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1326 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001327 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1328 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1329 client_framer_.transport_version(), Perspective::IS_CLIENT);
1330 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1331 stream_id =
1332 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1333 }
1334 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001335 EXPECT_EQ(max_plaintext_size -
1336 GetPacketHeaderSize(
1337 client_framer_.transport_version(),
1338 creator_.GetDestinationConnectionIdLength(),
1339 creator_.GetSourceConnectionIdLength(),
1340 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1341 !kIncludeDiversificationNonce,
1342 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1343 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1344 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1345 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001346 StrictMock<MockDebugDelegate> debug;
1347 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001348
1349 // Add a variety of frame types and then a padding frame.
1350 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001351 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001352 EXPECT_TRUE(
1353 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1354 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001355 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001356
1357 QuicFrame frame;
1358 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001359 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
fayang62b637b2019-09-16 08:40:49 -07001360 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1361 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1362 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001363 size_t consumed = frame.stream_frame.data_length;
1364 EXPECT_EQ(4u, consumed);
1365 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001366 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001367
1368 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001369 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001370 EXPECT_TRUE(
1371 creator_.AddSavedFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
1372 EXPECT_TRUE(creator_.HasPendingFrames());
1373 EXPECT_EQ(0u, creator_.BytesFree());
1374
1375 // Packet is full. Creator will flush.
1376 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1377 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1378 EXPECT_FALSE(
1379 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1380
1381 // Ensure the packet is successfully created.
1382 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1383 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1384 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1385 ASSERT_EQ(1u, retransmittable.size());
1386 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1387 EXPECT_TRUE(serialized_packet_.has_ack);
1388 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1389 DeleteSerializedPacket();
1390
1391 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001392 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001393 EXPECT_EQ(max_plaintext_size -
1394 GetPacketHeaderSize(
1395 client_framer_.transport_version(),
1396 creator_.GetDestinationConnectionIdLength(),
1397 creator_.GetSourceConnectionIdLength(),
1398 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1399 !kIncludeDiversificationNonce,
1400 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1401 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1402 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1403 creator_.BytesFree());
1404}
1405
1406TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1407 if (!GetParam().version_serialization) {
1408 creator_.StopSendingVersion();
1409 }
1410 EXPECT_FALSE(creator_.HasPendingFrames());
1411
1412 MakeIOVector("test", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001413 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1414 iov_.iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001415 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1416 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1417 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001418 StrictMock<MockDebugDelegate> debug;
1419 creator_.set_debug_delegate(&debug);
1420 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001421 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001422 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1423 NOT_RETRANSMISSION, &num_bytes_consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001424 EXPECT_EQ(4u, num_bytes_consumed);
1425
1426 // Ensure the packet is successfully created.
1427 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1428 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1429 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1430 ASSERT_EQ(1u, retransmittable.size());
1431 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1432 DeleteSerializedPacket();
1433
1434 EXPECT_FALSE(creator_.HasPendingFrames());
1435}
1436
nharperebabffd2019-06-03 17:34:45 -07001437TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1438 // Regression test to check that CreateAndSerializeStreamFrame uses a
1439 // correctly formatted stream frame header when appending padding.
1440
1441 if (!GetParam().version_serialization) {
1442 creator_.StopSendingVersion();
1443 }
1444 EXPECT_FALSE(creator_.HasPendingFrames());
1445
1446 // Send one byte of stream data.
1447 MakeIOVector("a", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001448 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1449 iov_.iov_len);
nharperebabffd2019-06-03 17:34:45 -07001450 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1451 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1452 size_t num_bytes_consumed;
1453 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001454 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1455 NOT_RETRANSMISSION, &num_bytes_consumed);
nharperebabffd2019-06-03 17:34:45 -07001456 EXPECT_EQ(1u, num_bytes_consumed);
1457
1458 // Check that a packet is created.
1459 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1460 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1461 {
1462 InSequence s;
1463 EXPECT_CALL(framer_visitor_, OnPacket());
1464 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1465 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1466 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1467 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1468 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1469 if (client_framer_.version().HasHeaderProtection()) {
1470 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1471 }
1472 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1473 }
1474 ProcessPacket(serialized_packet_);
1475}
1476
QUICHE teama6ef0a62019-03-07 20:34:33 -05001477TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1478 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1479 if (!IsDefaultTestConfiguration()) {
1480 return;
1481 }
1482
QUICHE team6987b4a2019-03-15 16:23:04 -07001483 creator_.set_encryption_level(ENCRYPTION_INITIAL);
fkastenholz85f18902019-05-28 12:47:00 -07001484 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001485 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1486 /*fin=*/false, 0u, QuicStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001487 EXPECT_QUIC_BUG(
1488 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001489 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1490}
1491
1492TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1493 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1494 if (!IsDefaultTestConfiguration()) {
1495 return;
1496 }
1497
1498 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
fkastenholz85f18902019-05-28 12:47:00 -07001499 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001500 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1501 /*fin=*/false, 0u, QuicStringPiece());
fayang49523232019-05-03 06:28:22 -07001502 EXPECT_QUIC_BUG(
1503 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
1504 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001505}
1506
1507TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1508 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1509 if (!IsDefaultTestConfiguration()) {
1510 return;
1511 }
1512
QUICHE teamdc41bf12019-03-20 12:58:42 -07001513 // This test only matters when the crypto handshake is sent in stream frames.
1514 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1515 // frames.
1516 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1517 return;
1518 }
1519
QUICHE teama6ef0a62019-03-07 20:34:33 -05001520 CryptoHandshakeMessage message;
1521 message.set_tag(kCHLO);
dschinazi66dea072019-04-09 11:41:06 -07001522 message.set_minimum_size(kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001523 CryptoFramer framer;
1524 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001525 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001526
1527 struct iovec iov;
1528 MakeIOVector(QuicStringPiece(message_data->data(), message_data->length()),
1529 &iov);
1530 QuicFrame frame;
fkastenholz85f18902019-05-28 12:47:00 -07001531 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
fayang62b637b2019-09-16 08:40:49 -07001532 EXPECT_QUIC_BUG(
1533 creator_.ConsumeDataToFillCurrentPacket(
1534 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1535 &iov, 1u, iov.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION,
1536 &frame),
1537 "Client hello won't fit in a single packet.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001538}
1539
1540TEST_P(QuicPacketCreatorTest, PendingPadding) {
1541 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1542 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1543 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1544
1545 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1546 .WillRepeatedly(
1547 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1548 // Flush all paddings.
1549 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001550 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001551 {
1552 InSequence s;
1553 EXPECT_CALL(framer_visitor_, OnPacket());
1554 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1555 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1556 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1557 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1558 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1559 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1560 }
1561 // Packet only contains padding.
1562 ProcessPacket(serialized_packet_);
1563 }
1564 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1565}
1566
1567TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001568 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001569 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1570 QuicFrame frame;
1571 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001572 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1573 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001574 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001575 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001576 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1577 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1578 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001579 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001580 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1581}
1582
1583TEST_P(QuicPacketCreatorTest, SendPendingPaddingInRetransmission) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001584 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1585 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1586 client_framer_.transport_version(), Perspective::IS_CLIENT);
1587 QuicStreamFrame stream_frame(stream_id,
1588 /*fin=*/false, 0u, QuicStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001589 QuicFrames frames;
1590 frames.push_back(QuicFrame(stream_frame));
dschinazi66dea072019-04-09 11:41:06 -07001591 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001592 QuicPendingRetransmission retransmission(CreateRetransmission(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001593 frames, true, /*num_padding_bytes=*/0, ENCRYPTION_FORWARD_SECURE,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001594 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
1595 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1596 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1597 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
dschinazi66dea072019-04-09 11:41:06 -07001598 creator_.ReserializeAllFrames(retransmission, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001599 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1600 {
1601 InSequence s;
1602 EXPECT_CALL(framer_visitor_, OnPacket());
1603 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1604 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1605 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1606 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1607 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1608 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1609 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1610 }
1611 ProcessPacket(serialized_packet_);
1612}
1613
1614TEST_P(QuicPacketCreatorTest, SendPacketAfterFullPaddingRetransmission) {
1615 // Making sure needs_full_padding gets reset after a full padding
1616 // retransmission.
1617 EXPECT_EQ(0u, creator_.pending_padding_bytes());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001618 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001619 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -07001620 std::string data = "fake handshake message data";
1621 MakeIOVector(data, &iov_);
1622 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1623 client_framer_.transport_version(), Perspective::IS_CLIENT);
1624 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1625 stream_id =
1626 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1627 }
1628 producer_.SaveStreamData(stream_id, &iov_, 1u, 0u, iov_.iov_len);
1629 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, stream_id, iov_.iov_len,
1630 0u, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001631 QuicFrames frames;
1632 frames.push_back(frame);
dschinazi66dea072019-04-09 11:41:06 -07001633 char buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001634 QuicPendingRetransmission retransmission(CreateRetransmission(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001635 frames, true, /*num_padding_bytes=*/-1, ENCRYPTION_FORWARD_SECURE,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001636 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
1637 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1638 .WillRepeatedly(
1639 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
dschinazi66dea072019-04-09 11:41:06 -07001640 creator_.ReserializeAllFrames(retransmission, buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001641 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
1642 {
1643 InSequence s;
1644 EXPECT_CALL(framer_visitor_, OnPacket());
1645 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1646 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1647 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1648 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1649 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1650 // Full padding.
1651 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1652 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1653 }
1654 ProcessPacket(serialized_packet_);
1655
fayang62b637b2019-09-16 08:40:49 -07001656 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1657 0u, 0u, false, false,
1658 NOT_RETRANSMISSION, &frame);
1659 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001660 {
1661 InSequence s;
1662 EXPECT_CALL(framer_visitor_, OnPacket());
1663 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1664 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1665 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1666 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1667 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1668 // needs_full_padding gets reset.
1669 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
1670 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1671 }
1672 ProcessPacket(serialized_packet_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001673 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001674}
1675
1676TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001677 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001678 const QuicByteCount kStreamFramePayloadSize = 100u;
1679 // Set the packet size be enough for one stream frame with 0 stream offset +
1680 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001681 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1682 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001683 size_t length =
1684 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1685 GetEncryptionOverhead() +
1686 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001687 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001688 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1689 kStreamFramePayloadSize + 1;
1690 creator_.SetMaxPacketLength(length);
1691 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1692 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1693 QuicFrame frame;
1694 char buf[kStreamFramePayloadSize + 1] = {};
1695 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1696 .WillRepeatedly(
1697 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1698 // Send stream frame of size kStreamFramePayloadSize.
1699 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001700 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1701 0u, 0u, false, false,
1702 NOT_RETRANSMISSION, &frame);
1703 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001704 // 1 byte padding is sent.
1705 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1706 // Send stream frame of size kStreamFramePayloadSize + 1.
1707 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize + 1), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001708 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1709 0u, kStreamFramePayloadSize, false,
1710 false, NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001711 // No padding is sent.
fayang62b637b2019-09-16 08:40:49 -07001712 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001713 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1714 // Flush all paddings.
1715 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001716 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001717 }
1718 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1719}
1720
1721TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001722 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
dschinazi66dea072019-04-09 11:41:06 -07001723 char external_buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001724 char* expected_buffer = external_buffer;
1725 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1726
1727 QuicFrame frame;
1728 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001729 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1730 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001731 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001732 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001733 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1734
1735 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1736 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1737 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1738 ClearSerializedPacket(serialized_packet);
1739 }));
fayang62b637b2019-09-16 08:40:49 -07001740 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001741}
1742
1743// Test for error found in
1744// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1745// length that crosses an IETF VarInt length boundary would cause a
1746// failure. While this test is not applicable to versions other than version 99,
1747// it should still work. Hence, it is not made version-specific.
1748TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1749 QuicAckFrame ack_frame =
1750 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1751 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1752 frames_.push_back(QuicFrame(&ack_frame));
1753 SerializeAllFrames(frames_);
1754}
1755
1756TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
fayangd4291e42019-05-30 10:31:21 -07001757 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001758 return;
1759 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001760 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001761 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1762 .Times(3)
1763 .WillRepeatedly(
1764 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1765 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1766 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001767 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1768 creator_.GetCurrentLargestMessagePayload()));
1769 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001770 QuicMessageFrame* message_frame =
1771 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001772 EXPECT_TRUE(
1773 creator_.AddSavedFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
1774 EXPECT_TRUE(creator_.HasPendingFrames());
fayang62b637b2019-09-16 08:40:49 -07001775 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001776
wub553a9662019-03-28 20:13:23 -07001777 QuicMessageFrame* frame2 =
1778 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001779 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
1780 EXPECT_TRUE(creator_.HasPendingFrames());
1781 // Verify if a new frame is added, 1 byte message length will be added.
1782 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001783 QuicMessageFrame* frame3 =
1784 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001785 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
1786 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
fayang62b637b2019-09-16 08:40:49 -07001787 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001788
1789 QuicFrame frame;
1790 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001791 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1792 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001793 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1794 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1795 NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001796 QuicMessageFrame* frame4 =
1797 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001798 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
1799 EXPECT_TRUE(creator_.HasPendingFrames());
1800 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001801 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1802 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001803 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001804 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001805 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
1806 EXPECT_FALSE(creator_.HasPendingFrames());
1807}
1808
1809TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
fayangd4291e42019-05-30 10:31:21 -07001810 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001811 return;
1812 }
vasilvvc48c8712019-03-11 13:38:16 -07001813 std::string message_data(kDefaultMaxPacketSize, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001814 QuicStringPiece message_buffer(message_data);
1815 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001816 // Test all possible encryption levels of message frames.
1817 for (EncryptionLevel level :
1818 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1819 creator_.set_encryption_level(level);
1820 // Test all possible sizes of message frames.
1821 for (size_t message_size = 0;
1822 message_size <= creator_.GetCurrentLargestMessagePayload();
1823 ++message_size) {
1824 QuicMessageFrame* frame = new QuicMessageFrame(
1825 0, MakeSpan(&allocator_,
1826 QuicStringPiece(message_buffer.data(), message_size),
1827 &storage));
1828 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame), NOT_RETRANSMISSION));
1829 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001830
ianswettb239f862019-04-05 09:15:06 -07001831 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1832 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1833 // Verify BytesFree returns bytes available for the next frame, which
1834 // should subtract the message length.
1835 size_t expected_bytes_free =
1836 creator_.GetCurrentLargestMessagePayload() - message_size <
1837 expansion_bytes
1838 ? 0
1839 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1840 message_size;
1841 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1842 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1843 creator_.GetCurrentLargestMessagePayload());
1844 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1845 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001846 creator_.FlushCurrentPacket();
ianswettb239f862019-04-05 09:15:06 -07001847 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1848 DeleteSerializedPacket();
1849 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001850 }
1851}
1852
nharperd43f1d62019-07-01 15:18:20 -07001853// Regression test for bugfix of GetPacketHeaderSize.
1854TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
1855 QuicTransportVersion version = GetParam().version.transport_version;
1856 if (!VersionSupportsMessageFrames(version)) {
1857 return;
1858 }
1859 QuicPacketLength expected_largest_payload = 1319;
1860 if (QuicVersionHasLongHeaderLengths(version)) {
1861 expected_largest_payload -= 2;
1862 }
dschinazi48ac9192019-07-31 00:07:26 -07001863 if (GetParam().version.HasLengthPrefixedConnectionIds()) {
1864 expected_largest_payload -= 1;
1865 }
nharperd43f1d62019-07-01 15:18:20 -07001866 EXPECT_EQ(expected_largest_payload,
1867 creator_.GetGuaranteedLargestMessagePayload());
1868}
1869
QUICHE teama6ef0a62019-03-07 20:34:33 -05001870TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001871 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001872 creator_.set_can_set_transmission_type(true);
fayang62b637b2019-09-16 08:40:49 -07001873 creator_.SetTransmissionTypeOfNextPackets(NOT_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001874
1875 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1876 QuicFrame ack_frame(&temp_ack_frame);
1877 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1878
QUICHE teamdc41bf12019-03-20 12:58:42 -07001879 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1880 client_framer_.transport_version(), Perspective::IS_CLIENT);
1881 QuicFrame stream_frame(QuicStreamFrame(stream_id,
1882 /*fin=*/false, 0u, QuicStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001883 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1884
1885 QuicFrame padding_frame{QuicPaddingFrame()};
1886 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1887
1888 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1889 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1890
1891 EXPECT_TRUE(creator_.AddSavedFrame(ack_frame, LOSS_RETRANSMISSION));
1892 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1893
1894 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame, RTO_RETRANSMISSION));
1895 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1896
1897 EXPECT_TRUE(creator_.AddSavedFrame(padding_frame, TLP_RETRANSMISSION));
fayang62b637b2019-09-16 08:40:49 -07001898 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001899 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1900
wub98669f52019-04-18 10:49:18 -07001901 if (creator_.can_set_transmission_type()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001902 // The last retransmittable frame on packet is a stream frame, the packet's
1903 // transmission type should be the same as the stream frame's.
1904 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
1905 } else {
1906 EXPECT_EQ(serialized_packet_.transmission_type, NOT_RETRANSMISSION);
1907 }
1908 DeleteSerializedPacket();
1909}
1910
1911TEST_P(QuicPacketCreatorTest, RetryToken) {
1912 if (!GetParam().version_serialization ||
1913 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1914 return;
1915 }
1916
1917 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1918 9, 10, 11, 12, 13, 14, 15, 16};
1919
1920 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001921 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001922
QUICHE teamdc41bf12019-03-20 12:58:42 -07001923 std::string data("a");
1924 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1925 QuicStreamFrame stream_frame(
1926 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1927 /*fin=*/false, 0u, QuicStringPiece());
1928 frames_.push_back(QuicFrame(stream_frame));
1929 } else {
1930 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1931 frames_.push_back(
1932 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1933 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001934 SerializedPacket serialized = SerializeAllFrames(frames_);
1935
1936 QuicPacketHeader header;
1937 {
1938 InSequence s;
1939 EXPECT_CALL(framer_visitor_, OnPacket());
1940 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1941 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1942 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1943 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1944 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001945 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1946 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1947 } else {
1948 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1949 }
nharper55fa6132019-05-07 19:37:21 -07001950 if (client_framer_.version().HasHeaderProtection()) {
1951 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1952 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001953 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1954 }
1955 ProcessPacket(serialized);
1956 ASSERT_TRUE(header.version_flag);
1957 ASSERT_EQ(header.long_packet_type, INITIAL);
1958 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1959 test::CompareCharArraysWithHexError(
1960 "retry token", header.retry_token.data(), header.retry_token.length(),
1961 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001962 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001963}
1964
QUICHE team2252b702019-05-14 23:55:14 -04001965TEST_P(QuicPacketCreatorTest, GetConnectionId) {
QUICHE team2252b702019-05-14 23:55:14 -04001966 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1967 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1968}
1969
dschinazi346b7ce2019-06-05 01:38:18 -07001970TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
dschinazi346b7ce2019-06-05 01:38:18 -07001971 if (!client_framer_.version().SupportsClientConnectionIds()) {
1972 return;
1973 }
1974 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1975 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1976 creator_.SetClientConnectionId(TestConnectionId(0x33));
1977 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1978 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
1979}
1980
QUICHE teama6ef0a62019-03-07 20:34:33 -05001981} // namespace
1982} // namespace test
1983} // namespace quic