blob: aa2f6f7a57c53c157c9639efe6173b814471ec44 [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
QUICHE teama6ef0a62019-03-07 20:34:33 -050012#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
13#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
14#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
15#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
16#include "net/third_party/quiche/src/quic/core/quic_pending_retransmission.h"
17#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
18#include "net/third_party/quiche/src/quic/core/quic_types.h"
19#include "net/third_party/quiche/src/quic/core/quic_utils.h"
20#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
21#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050022#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
23#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
24#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
25#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
26#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
27#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
28
29using testing::_;
30using testing::DoAll;
31using testing::InSequence;
32using testing::Invoke;
33using testing::Return;
34using testing::SaveArg;
35using testing::StrictMock;
36
37namespace quic {
38namespace test {
39namespace {
40
41// Run tests with combinations of {ParsedQuicVersion,
42// ToggleVersionSerialization}.
43struct TestParams {
44 TestParams(ParsedQuicVersion version, bool version_serialization)
45 : version(version), version_serialization(version_serialization) {}
46
47 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
48 os << "{ version: " << ParsedQuicVersionToString(p.version)
49 << " include version: " << p.version_serialization << " }";
50 return os;
51 }
52
53 ParsedQuicVersion version;
54 bool version_serialization;
55};
56
57// Constructs various test permutations.
58std::vector<TestParams> GetTestParams() {
59 std::vector<TestParams> params;
60 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
61 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
62 params.push_back(TestParams(all_supported_versions[i], true));
63 params.push_back(TestParams(all_supported_versions[i], false));
64 }
65 return params;
66}
67
rchc76cd742019-03-26 16:00:03 -070068class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
69 public:
70 ~MockDebugDelegate() override = default;
71
72 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame& frame));
73};
74
QUICHE teama6ef0a62019-03-07 20:34:33 -050075class TestPacketCreator : public QuicPacketCreator {
76 public:
77 TestPacketCreator(QuicConnectionId connection_id,
78 QuicFramer* framer,
79 DelegateInterface* delegate,
80 SimpleDataProducer* producer)
81 : QuicPacketCreator(connection_id, framer, delegate),
82 producer_(producer),
83 version_(framer->transport_version()) {}
84
85 bool ConsumeData(QuicStreamId id,
86 const struct iovec* iov,
87 int iov_count,
88 size_t total_length,
89 size_t iov_offset,
90 QuicStreamOffset offset,
91 bool fin,
92 bool needs_full_padding,
93 TransmissionType transmission_type,
94 QuicFrame* frame) {
95 // Save data before data is consumed.
96 QuicByteCount data_length = total_length - iov_offset;
97 if (data_length > 0) {
98 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
99 }
ianswette28f0222019-04-04 13:31:22 -0700100 return QuicPacketCreator::ConsumeData(id, data_length - iov_offset, offset,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500101 fin, needs_full_padding,
102 transmission_type, frame);
103 }
104
105 void StopSendingVersion() {
106 if (version_ > QUIC_VERSION_43) {
107 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
108 return;
109 }
110 QuicPacketCreator::StopSendingVersion();
111 }
112
113 SimpleDataProducer* producer_;
114 QuicTransportVersion version_;
115};
116
117class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
118 public:
119 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) {
120 if (serialized_packet == nullptr) {
121 return;
122 }
123 ClearSerializedPacket(serialized_packet);
124 }
125
126 void SaveSerializedPacket(SerializedPacket* serialized_packet) {
127 if (serialized_packet == nullptr) {
128 return;
129 }
130 delete[] serialized_packet_.encrypted_buffer;
131 serialized_packet_ = *serialized_packet;
132 serialized_packet_.encrypted_buffer = CopyBuffer(*serialized_packet);
133 serialized_packet->retransmittable_frames.clear();
134 }
135
136 void DeleteSerializedPacket() {
137 delete[] serialized_packet_.encrypted_buffer;
138 serialized_packet_.encrypted_buffer = nullptr;
139 ClearSerializedPacket(&serialized_packet_);
140 }
141
142 protected:
143 QuicPacketCreatorTest()
144 : connection_id_(TestConnectionId(2)),
145 server_framer_(SupportedVersions(GetParam().version),
146 QuicTime::Zero(),
147 Perspective::IS_SERVER,
148 connection_id_.length()),
149 client_framer_(SupportedVersions(GetParam().version),
150 QuicTime::Zero(),
151 Perspective::IS_CLIENT,
152 connection_id_.length()),
153 data_("foo"),
154 creator_(connection_id_, &client_framer_, &delegate_, &producer_),
155 serialized_packet_(creator_.NoPacket()) {
156 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
QUICHE team88ea0082019-03-15 10:05:26 -0700157 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, QuicMakeUnique<NullEncrypter>(
158 Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500159 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, QuicMakeUnique<NullEncrypter>(
160 Perspective::IS_CLIENT));
161 creator_.SetEncrypter(
162 ENCRYPTION_FORWARD_SECURE,
163 QuicMakeUnique<NullEncrypter>(Perspective::IS_CLIENT));
164 client_framer_.set_visitor(&framer_visitor_);
165 server_framer_.set_visitor(&framer_visitor_);
166 client_framer_.set_data_producer(&producer_);
167 }
168
169 ~QuicPacketCreatorTest() override {
170 delete[] serialized_packet_.encrypted_buffer;
171 ClearSerializedPacket(&serialized_packet_);
172 }
173
174 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
175 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
176 &creator_, frames, buffer_, kMaxPacketSize);
177 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
178 packet.encryption_level);
179 return packet;
180 }
181
182 void ProcessPacket(const SerializedPacket& packet) {
183 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
184 packet.encrypted_length);
185 server_framer_.ProcessPacket(encrypted_packet);
186 }
187
188 void CheckStreamFrame(const QuicFrame& frame,
189 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700190 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500191 QuicStreamOffset offset,
192 bool fin) {
193 EXPECT_EQ(STREAM_FRAME, frame.type);
194 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
195 char buf[kMaxPacketSize];
196 QuicDataWriter writer(kMaxPacketSize, buf, HOST_BYTE_ORDER);
197 if (frame.stream_frame.data_length > 0) {
198 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
199 frame.stream_frame.data_length, &writer);
200 }
201 EXPECT_EQ(data, QuicStringPiece(buf, frame.stream_frame.data_length));
202 EXPECT_EQ(offset, frame.stream_frame.offset);
203 EXPECT_EQ(fin, frame.stream_frame.fin);
204 }
205
206 // Returns the number of bytes consumed by the header of packet, including
207 // the version.
208 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
209 return GetPacketHeaderSize(
210 version, creator_.GetDestinationConnectionIdLength(),
211 creator_.GetSourceConnectionIdLength(),
212 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
213 !kIncludeDiversificationNonce,
214 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
215 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
216 QuicPacketCreatorPeer::GetLengthLength(&creator_));
217 }
218
219 // Returns the number of bytes of overhead that will be added to a packet
220 // of maximum length.
221 size_t GetEncryptionOverhead() {
222 return creator_.max_packet_length() -
223 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
224 }
225
226 // Returns the number of bytes consumed by the non-data fields of a stream
227 // frame, assuming it is the last frame in the packet
228 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
229 return QuicFramer::GetMinStreamFrameSize(
230 version, GetNthClientInitiatedStreamId(1), kOffset, true,
231 /* data_length= */ 0);
232 }
233
234 QuicPendingRetransmission CreateRetransmission(
235 const QuicFrames& retransmittable_frames,
236 bool has_crypto_handshake,
237 int num_padding_bytes,
238 EncryptionLevel encryption_level,
239 QuicPacketNumberLength packet_number_length) {
240 return QuicPendingRetransmission(QuicPacketNumber(1u), NOT_RETRANSMISSION,
241 retransmittable_frames,
242 has_crypto_handshake, num_padding_bytes,
243 encryption_level, packet_number_length);
244 }
245
246 bool IsDefaultTestConfiguration() {
247 TestParams p = GetParam();
248 return p.version == AllSupportedVersions()[0] && p.version_serialization;
249 }
250
251 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
252 return QuicUtils::GetHeadersStreamId(creator_.transport_version()) + n * 2;
253 }
254
255 static const QuicStreamOffset kOffset = 0u;
256
257 char buffer_[kMaxPacketSize];
258 QuicConnectionId connection_id_;
259 QuicFrames frames_;
260 QuicFramer server_framer_;
261 QuicFramer client_framer_;
262 StrictMock<MockFramerVisitor> framer_visitor_;
263 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700264 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500265 struct iovec iov_;
266 TestPacketCreator creator_;
267 SerializedPacket serialized_packet_;
268 SimpleDataProducer producer_;
269 SimpleBufferAllocator allocator_;
270};
271
272// Run all packet creator tests with all supported versions of QUIC, and with
273// and without version in the packet header, as well as doing a run for each
274// length of truncated connection id.
275INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
276 QuicPacketCreatorTest,
277 ::testing::ValuesIn(GetTestParams()));
278
279TEST_P(QuicPacketCreatorTest, SerializeFrames) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700280 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500281 EncryptionLevel level = static_cast<EncryptionLevel>(i);
282 creator_.set_encryption_level(level);
283 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700284 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
285 client_framer_.transport_version(), Perspective::IS_CLIENT);
286 if (level != ENCRYPTION_INITIAL) {
287 frames_.push_back(
288 QuicFrame(QuicStreamFrame(stream_id, false, 0u, QuicStringPiece())));
289 frames_.push_back(
290 QuicFrame(QuicStreamFrame(stream_id, true, 0u, QuicStringPiece())));
291 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500292 SerializedPacket serialized = SerializeAllFrames(frames_);
293 EXPECT_EQ(level, serialized.encryption_level);
294 delete frames_[0].ack_frame;
295 frames_.clear();
296
297 {
298 InSequence s;
299 EXPECT_CALL(framer_visitor_, OnPacket());
300 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
301 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
302 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
303 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
304 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
305 .WillOnce(Return(true));
306 EXPECT_CALL(framer_visitor_,
307 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
308 .WillOnce(Return(true));
309 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
310 .WillOnce(Return(true));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700311 if (level != ENCRYPTION_INITIAL) {
312 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
313 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
314 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500315 EXPECT_CALL(framer_visitor_, OnPacketComplete());
316 }
317 ProcessPacket(serialized);
318 }
319}
320
321TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
322 if (client_framer_.transport_version() > QUIC_VERSION_43) {
323 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
324 }
325 // If the original packet number length, the current packet number
326 // length, and the configured send packet number length are different, the
327 // retransmit must sent with the original length and the others do not change.
328 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_,
329 PACKET_2BYTE_PACKET_NUMBER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500330 QuicFrames frames;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700331 std::string data("a");
332 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
333 QuicStreamFrame stream_frame(
334 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
335 /*fin=*/false, 0u, QuicStringPiece());
336 frames.push_back(QuicFrame(stream_frame));
337 } else {
338 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
339 frames.push_back(
340 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
341 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500342 char buffer[kMaxPacketSize];
343 QuicPendingRetransmission retransmission(CreateRetransmission(
344 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700345 ENCRYPTION_INITIAL, PACKET_4BYTE_PACKET_NUMBER));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500346 EXPECT_CALL(delegate_, OnSerializedPacket(_))
347 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
348 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
349 // The packet number length is updated after every packet is sent,
350 // so there is no need to restore the old length after sending.
351 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
352 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
353 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
354 serialized_packet_.packet_number_length);
355
356 {
357 InSequence s;
358 EXPECT_CALL(framer_visitor_, OnPacket());
359 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
360 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
361 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
362 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700363 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
364 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
365 } else {
366 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
367 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500368 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
369 EXPECT_CALL(framer_visitor_, OnPacketComplete());
370 }
371 ProcessPacket(serialized_packet_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700372 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500373}
374
375TEST_P(QuicPacketCreatorTest, ReserializeCryptoFrameWithForwardSecurity) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500376 QuicFrames frames;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700377 std::string data("a");
378 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
379 QuicStreamFrame stream_frame(
380 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
381 /*fin=*/false, 0u, QuicStringPiece());
382 frames.push_back(QuicFrame(stream_frame));
383 } else {
384 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
385 frames.push_back(
386 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
387 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500388 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
389 char buffer[kMaxPacketSize];
390 QuicPendingRetransmission retransmission(CreateRetransmission(
391 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700392 ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500393 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
394 EXPECT_CALL(delegate_, OnSerializedPacket(_))
395 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
396 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
QUICHE team6987b4a2019-03-15 16:23:04 -0700397 EXPECT_EQ(ENCRYPTION_INITIAL, serialized_packet_.encryption_level);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700398 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500399}
400
401TEST_P(QuicPacketCreatorTest, ReserializeFrameWithForwardSecurity) {
402 QuicStreamFrame stream_frame(0u, /*fin=*/false, 0u, QuicStringPiece());
403 QuicFrames frames;
404 frames.push_back(QuicFrame(stream_frame));
405 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
406 char buffer[kMaxPacketSize];
407 QuicPendingRetransmission retransmission(CreateRetransmission(
408 frames, false /* has_crypto_handshake */, 0 /* no padding */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700409 ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500410 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
411 EXPECT_CALL(delegate_, OnSerializedPacket(_))
412 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
413 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
414 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, serialized_packet_.encryption_level);
415}
416
417TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPadding) {
418 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700419 std::string data = "fake handshake message data";
420 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
421 MakeIOVector(data, &iov_);
422 producer_.SaveStreamData(
423 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
424 1u, 0u, iov_.iov_len);
425 QuicPacketCreatorPeer::CreateStreamFrame(
426 &creator_,
427 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
428 iov_.iov_len, 0u, false, &frame);
429 } else {
430 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
431 EXPECT_TRUE(QuicPacketCreatorPeer::CreateCryptoFrame(
432 &creator_, ENCRYPTION_INITIAL, data.length(), 0, &frame));
433 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500434 QuicFrames frames;
435 frames.push_back(frame);
436 char buffer[kMaxPacketSize];
437 QuicPendingRetransmission retransmission(CreateRetransmission(
438 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700439 ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500440 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
441 EXPECT_CALL(delegate_, OnSerializedPacket(_))
442 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
443 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
444 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700445 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500446}
447
448TEST_P(QuicPacketCreatorTest, DoNotRetransmitPendingPadding) {
449 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700450 std::string data = "fake message data";
451 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
452 MakeIOVector(data, &iov_);
453 producer_.SaveStreamData(
454 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
455 1u, 0u, iov_.iov_len);
456 QuicPacketCreatorPeer::CreateStreamFrame(
457 &creator_,
458 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
459 iov_.iov_len, 0u, false, &frame);
460 } else {
461 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
462 EXPECT_TRUE(QuicPacketCreatorPeer::CreateCryptoFrame(
463 &creator_, ENCRYPTION_INITIAL, data.length(), 0, &frame));
464 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500465
466 const int kNumPaddingBytes1 = 4;
467 int packet_size = 0;
468 {
469 QuicFrames frames;
470 frames.push_back(frame);
471 char buffer[kMaxPacketSize];
472 QuicPendingRetransmission retransmission(CreateRetransmission(
473 frames, false /* has_crypto_handshake */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700474 kNumPaddingBytes1 /* padding bytes */, ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500475 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
476 EXPECT_CALL(delegate_, OnSerializedPacket(_))
477 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
478 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
479 packet_size = serialized_packet_.encrypted_length;
480 }
481
482 {
483 InSequence s;
484 EXPECT_CALL(framer_visitor_, OnPacket());
485 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
486 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
487 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
488 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700489 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
490 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
491 } else {
492 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
493 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500494 // Pending paddings are not retransmitted.
495 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
496 EXPECT_CALL(framer_visitor_, OnPacketComplete());
497 }
498 ProcessPacket(serialized_packet_);
499
500 const int kNumPaddingBytes2 = 44;
501 QuicFrames frames;
502 frames.push_back(frame);
503 char buffer[kMaxPacketSize];
504 QuicPendingRetransmission retransmission(CreateRetransmission(
505 frames, false /* has_crypto_handshake */,
QUICHE team6987b4a2019-03-15 16:23:04 -0700506 kNumPaddingBytes2 /* padding bytes */, ENCRYPTION_INITIAL,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500507 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
508 EXPECT_CALL(delegate_, OnSerializedPacket(_))
509 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
510 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
511
512 EXPECT_EQ(packet_size, serialized_packet_.encrypted_length);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700513 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500514}
515
516TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700517 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500518 const size_t overhead =
519 GetPacketHeaderOverhead(client_framer_.transport_version()) +
520 GetEncryptionOverhead() +
521 GetStreamFrameOverhead(client_framer_.transport_version());
522 size_t capacity = kDefaultMaxPacketSize - overhead;
523 for (int delta = -5; delta <= 0; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700524 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500525 size_t bytes_free = 0 - delta;
526
527 QuicFrame frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500528 SimpleDataProducer producer;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500529 QuicPacketCreatorPeer::framer(&creator_)->set_data_producer(&producer);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700530 MakeIOVector(data, &iov_);
531 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
532 client_framer_.transport_version(), Perspective::IS_CLIENT);
533 producer.SaveStreamData(stream_id, &iov_, 1u, 0u, iov_.iov_len);
534 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, stream_id, iov_.iov_len,
535 kOffset, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500536 QuicFrames frames;
537 frames.push_back(frame);
538 char buffer[kMaxPacketSize];
539 QuicPendingRetransmission retransmission(CreateRetransmission(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700540 frames, false /* has_crypto_handshake */, -1 /* needs full padding */,
541 ENCRYPTION_FORWARD_SECURE,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500542 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
543 EXPECT_CALL(delegate_, OnSerializedPacket(_))
544 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
545 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
546
547 // If there is not enough space in the packet to fit a padding frame
548 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
549 // will not be padded.
550 if (bytes_free < 3) {
551 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
552 serialized_packet_.encrypted_length);
553 } else {
554 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
555 }
556
557 frames_.clear();
558 }
559}
560
561TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
562 QuicConnectionCloseFrame frame;
563 frame.error_code = QUIC_NO_ERROR;
564 frame.error_details = "error";
565
566 QuicFrames frames;
567 frames.push_back(QuicFrame(&frame));
568 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700569 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500570 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
571 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
572
573 InSequence s;
574 EXPECT_CALL(framer_visitor_, OnPacket());
575 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
576 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
577 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
578 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
579 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
580 EXPECT_CALL(framer_visitor_, OnPacketComplete());
581
582 ProcessPacket(serialized);
583}
584
585TEST_P(QuicPacketCreatorTest, ConsumeCryptoData) {
vasilvvc48c8712019-03-11 13:38:16 -0700586 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500587 QuicFrame frame;
QUICHE team6987b4a2019-03-15 16:23:04 -0700588 ASSERT_TRUE(creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data.length(), 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500589 NOT_RETRANSMISSION, &frame));
590 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
591 EXPECT_TRUE(creator_.HasPendingFrames());
592}
593
594TEST_P(QuicPacketCreatorTest, ConsumeData) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700595 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500596 QuicFrame frame;
597 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700598 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
599 client_framer_.transport_version(), Perspective::IS_CLIENT);
600 ASSERT_TRUE(creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u,
601 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500602 size_t consumed = frame.stream_frame.data_length;
603 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700604 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500605 EXPECT_TRUE(creator_.HasPendingFrames());
606}
607
608TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700609 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500610 QuicFrame frame;
611 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700612 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
613 client_framer_.transport_version(), Perspective::IS_CLIENT);
614 ASSERT_TRUE(creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u,
615 true, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500616 size_t consumed = frame.stream_frame.data_length;
617 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700618 CheckStreamFrame(frame, stream_id, "test", 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500619 EXPECT_TRUE(creator_.HasPendingFrames());
620}
621
622TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700623 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500624 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700625 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
626 client_framer_.transport_version(), Perspective::IS_CLIENT);
627 ASSERT_TRUE(creator_.ConsumeData(stream_id, nullptr, 0u, 0u, 0u, 0u, true,
628 false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500629 size_t consumed = frame.stream_frame.data_length;
630 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700631 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500632 EXPECT_TRUE(creator_.HasPendingFrames());
633}
634
635TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
636 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
637 const size_t overhead =
638 GetPacketHeaderOverhead(client_framer_.transport_version()) +
639 GetEncryptionOverhead();
640 for (size_t i = overhead; i < overhead + 100; ++i) {
641 creator_.SetMaxPacketLength(i);
642 const bool should_have_room =
643 i >
644 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
645 ASSERT_EQ(should_have_room,
646 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
647 kOffset, /* data_size=*/0xffff));
648 if (should_have_room) {
649 QuicFrame frame;
650 MakeIOVector("testdata", &iov_);
651 EXPECT_CALL(delegate_, OnSerializedPacket(_))
652 .WillRepeatedly(Invoke(
653 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
654 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
655 1u, iov_.iov_len, 0u, kOffset, false,
656 false, NOT_RETRANSMISSION, &frame));
657 size_t bytes_consumed = frame.stream_frame.data_length;
658 EXPECT_LT(0u, bytes_consumed);
659 creator_.Flush();
660 }
661 }
662}
663
664TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
665 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
666 // Compute the total overhead for a single frame in packet.
667 const size_t overhead =
668 GetPacketHeaderOverhead(client_framer_.transport_version()) +
669 GetEncryptionOverhead() +
670 GetStreamFrameOverhead(client_framer_.transport_version());
671 size_t capacity = kDefaultMaxPacketSize - overhead;
672 // Now, test various sizes around this size.
673 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700674 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500675 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
676 QuicFrame frame;
677 MakeIOVector(data, &iov_);
678 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
679 1u, iov_.iov_len, 0u, kOffset, false,
680 false, NOT_RETRANSMISSION, &frame));
681
682 // BytesFree() returns bytes available for the next frame, which will
683 // be two bytes smaller since the stream frame would need to be grown.
684 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
685 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
686 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
687 EXPECT_CALL(delegate_, OnSerializedPacket(_))
688 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
689 creator_.Flush();
690 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
691 DeleteSerializedPacket();
692 }
693}
694
695TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700696 // This test serializes crypto payloads slightly larger than a packet, which
697 // Causes the multi-packet ClientHello check to fail.
698 FLAGS_quic_enforce_single_packet_chlo = false;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500699 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700700 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500701 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700702 GetEncryptionOverhead();
703 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
704 overhead += QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxPacketSize);
705 } else {
706 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
707 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500708 ASSERT_GT(kMaxPacketSize, overhead);
709 size_t capacity = kDefaultMaxPacketSize - overhead;
710 // Now, test various sizes around this size.
711 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700712 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700713 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500714 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
715
716 QuicFrame frame;
717 MakeIOVector(data, &iov_);
718 EXPECT_CALL(delegate_, OnSerializedPacket(_))
719 .WillRepeatedly(
720 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700721 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
722 ASSERT_TRUE(creator_.ConsumeData(
723 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
724 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
725 &frame));
726 size_t bytes_consumed = frame.stream_frame.data_length;
727 EXPECT_LT(0u, bytes_consumed);
728 } else {
729 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
730 ASSERT_TRUE(creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data.length(),
731 kOffset, NOT_RETRANSMISSION,
732 &frame));
733 size_t bytes_consumed = frame.crypto_frame->data_length;
734 EXPECT_LT(0u, bytes_consumed);
735 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500736 creator_.Flush();
737 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
738 // If there is not enough space in the packet to fit a padding frame
739 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
740 // will not be padded.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700741 if (bytes_free < 3 &&
742 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500743 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
744 serialized_packet_.encrypted_length);
745 } else {
746 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
747 }
748 DeleteSerializedPacket();
749 }
750}
751
752TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
753 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
754 // Compute the total overhead for a single frame in packet.
755 const size_t overhead =
756 GetPacketHeaderOverhead(client_framer_.transport_version()) +
757 GetEncryptionOverhead() +
758 GetStreamFrameOverhead(client_framer_.transport_version());
759 ASSERT_GT(kDefaultMaxPacketSize, overhead);
760 size_t capacity = kDefaultMaxPacketSize - overhead;
761 // Now, test various sizes around this size.
762 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700763 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500764 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
765
766 QuicFrame frame;
767 MakeIOVector(data, &iov_);
768 EXPECT_CALL(delegate_, OnSerializedPacket(_))
769 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
770 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
771 1u, iov_.iov_len, 0u, kOffset, false,
772 false, NOT_RETRANSMISSION, &frame));
773 size_t bytes_consumed = frame.stream_frame.data_length;
774 EXPECT_LT(0u, bytes_consumed);
775 creator_.Flush();
776 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
777 if (bytes_free > 0) {
778 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
779 serialized_packet_.encrypted_length);
780 } else {
781 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
782 }
783 DeleteSerializedPacket();
784 }
785}
786
787TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
788 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
789 ParsedQuicVersionVector versions;
790 versions.push_back(test::QuicVersionMax());
791 const bool ietf_quic = GetParam().version.transport_version > QUIC_VERSION_43;
792 std::unique_ptr<QuicEncryptedPacket> encrypted(
793 creator_.SerializeVersionNegotiationPacket(ietf_quic, versions));
794
795 {
796 InSequence s;
797 EXPECT_CALL(framer_visitor_, OnPacket());
798 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
799 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
800 }
801 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
802 client_framer_.ProcessPacket(*encrypted);
803}
804
805TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700806 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500807 EncryptionLevel level = static_cast<EncryptionLevel>(i);
808
809 creator_.set_encryption_level(level);
810
811 OwningSerializedPacketPointer encrypted;
812 if (GetParam().version.transport_version == QUIC_VERSION_99) {
813 QuicPathFrameBuffer payload = {
814 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
815 encrypted =
816 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
817 } else {
818 encrypted = creator_.SerializeConnectivityProbingPacket();
819 }
820 {
821 InSequence s;
822 EXPECT_CALL(framer_visitor_, OnPacket());
823 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
824 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
825 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
826 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
827 if (GetParam().version.transport_version == QUIC_VERSION_99) {
828 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
829 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
830 } else {
831 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
832 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
833 }
834 EXPECT_CALL(framer_visitor_, OnPacketComplete());
835 }
836 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
837 server_framer_.ProcessPacket(QuicEncryptedPacket(
838 encrypted->encrypted_buffer, encrypted->encrypted_length));
839 }
840}
841
842TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
843 if (GetParam().version.transport_version != QUIC_VERSION_99) {
844 return;
845 }
846 QuicPathFrameBuffer payload = {
847 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
848
QUICHE team6987b4a2019-03-15 16:23:04 -0700849 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500850 EncryptionLevel level = static_cast<EncryptionLevel>(i);
851
852 creator_.set_encryption_level(level);
853
854 OwningSerializedPacketPointer encrypted(
855 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
856 {
857 InSequence s;
858 EXPECT_CALL(framer_visitor_, OnPacket());
859 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
860 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
861 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
862 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
863 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
864 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
865 EXPECT_CALL(framer_visitor_, OnPacketComplete());
866 }
867 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
868 server_framer_.ProcessPacket(QuicEncryptedPacket(
869 encrypted->encrypted_buffer, encrypted->encrypted_length));
870 }
871}
872
873TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
874 if (GetParam().version.transport_version != QUIC_VERSION_99) {
875 return;
876 }
877 QuicPathFrameBuffer payload0 = {
878 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
879
QUICHE team6987b4a2019-03-15 16:23:04 -0700880 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500881 EncryptionLevel level = static_cast<EncryptionLevel>(i);
882 creator_.set_encryption_level(level);
883
884 QuicDeque<QuicPathFrameBuffer> payloads;
885 payloads.push_back(payload0);
886
887 OwningSerializedPacketPointer encrypted(
888 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
889 true));
890 {
891 InSequence s;
892 EXPECT_CALL(framer_visitor_, OnPacket());
893 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
894 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
895 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
896 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
897 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
898 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
899 EXPECT_CALL(framer_visitor_, OnPacketComplete());
900 }
901 server_framer_.ProcessPacket(QuicEncryptedPacket(
902 encrypted->encrypted_buffer, encrypted->encrypted_length));
903 }
904}
905
906TEST_P(QuicPacketCreatorTest,
907 SerializePathResponseProbePacket1PayloadUnPadded) {
908 if (GetParam().version.transport_version != QUIC_VERSION_99) {
909 return;
910 }
911 QuicPathFrameBuffer payload0 = {
912 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
913
QUICHE team6987b4a2019-03-15 16:23:04 -0700914 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500915 EncryptionLevel level = static_cast<EncryptionLevel>(i);
916 creator_.set_encryption_level(level);
917
918 QuicDeque<QuicPathFrameBuffer> payloads;
919 payloads.push_back(payload0);
920
921 OwningSerializedPacketPointer encrypted(
922 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
923 false));
924 {
925 InSequence s;
926 EXPECT_CALL(framer_visitor_, OnPacket());
927 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
928 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
929 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
930 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
931 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
932 EXPECT_CALL(framer_visitor_, OnPacketComplete());
933 }
934 server_framer_.ProcessPacket(QuicEncryptedPacket(
935 encrypted->encrypted_buffer, encrypted->encrypted_length));
936 }
937}
938
939TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
940 if (GetParam().version.transport_version != QUIC_VERSION_99) {
941 return;
942 }
943 QuicPathFrameBuffer payload0 = {
944 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
945 QuicPathFrameBuffer payload1 = {
946 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
947
QUICHE team6987b4a2019-03-15 16:23:04 -0700948 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500949 EncryptionLevel level = static_cast<EncryptionLevel>(i);
950 creator_.set_encryption_level(level);
951
952 QuicDeque<QuicPathFrameBuffer> payloads;
953 payloads.push_back(payload0);
954 payloads.push_back(payload1);
955
956 OwningSerializedPacketPointer encrypted(
957 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
958 true));
959 {
960 InSequence s;
961 EXPECT_CALL(framer_visitor_, OnPacket());
962 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
963 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
964 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
965 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
966 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
967 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
968 EXPECT_CALL(framer_visitor_, OnPacketComplete());
969 }
970 server_framer_.ProcessPacket(QuicEncryptedPacket(
971 encrypted->encrypted_buffer, encrypted->encrypted_length));
972 }
973}
974
975TEST_P(QuicPacketCreatorTest,
976 SerializePathResponseProbePacket2PayloadsUnPadded) {
977 if (GetParam().version.transport_version != QUIC_VERSION_99) {
978 return;
979 }
980 QuicPathFrameBuffer payload0 = {
981 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
982 QuicPathFrameBuffer payload1 = {
983 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
984
QUICHE team6987b4a2019-03-15 16:23:04 -0700985 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500986 EncryptionLevel level = static_cast<EncryptionLevel>(i);
987 creator_.set_encryption_level(level);
988
989 QuicDeque<QuicPathFrameBuffer> payloads;
990 payloads.push_back(payload0);
991 payloads.push_back(payload1);
992
993 OwningSerializedPacketPointer encrypted(
994 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
995 false));
996 {
997 InSequence s;
998 EXPECT_CALL(framer_visitor_, OnPacket());
999 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1000 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1001 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1002 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1003 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1004 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1005 }
1006 server_framer_.ProcessPacket(QuicEncryptedPacket(
1007 encrypted->encrypted_buffer, encrypted->encrypted_length));
1008 }
1009}
1010
1011TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
1012 if (GetParam().version.transport_version != QUIC_VERSION_99) {
1013 return;
1014 }
1015 QuicPathFrameBuffer payload0 = {
1016 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1017 QuicPathFrameBuffer payload1 = {
1018 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1019 QuicPathFrameBuffer payload2 = {
1020 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1021
QUICHE team6987b4a2019-03-15 16:23:04 -07001022 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001023 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1024 creator_.set_encryption_level(level);
1025
1026 QuicDeque<QuicPathFrameBuffer> payloads;
1027 payloads.push_back(payload0);
1028 payloads.push_back(payload1);
1029 payloads.push_back(payload2);
1030
1031 OwningSerializedPacketPointer encrypted(
1032 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1033 true));
1034 {
1035 InSequence s;
1036 EXPECT_CALL(framer_visitor_, OnPacket());
1037 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1038 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1039 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1040 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1041 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1042 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1043 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1044 }
1045 server_framer_.ProcessPacket(QuicEncryptedPacket(
1046 encrypted->encrypted_buffer, encrypted->encrypted_length));
1047 }
1048}
1049
1050TEST_P(QuicPacketCreatorTest,
1051 SerializePathResponseProbePacket3PayloadsUnpadded) {
1052 if (GetParam().version.transport_version != QUIC_VERSION_99) {
1053 return;
1054 }
1055 QuicPathFrameBuffer payload0 = {
1056 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1057 QuicPathFrameBuffer payload1 = {
1058 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1059 QuicPathFrameBuffer payload2 = {
1060 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1061
QUICHE team6987b4a2019-03-15 16:23:04 -07001062 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001063 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1064 creator_.set_encryption_level(level);
1065
1066 QuicDeque<QuicPathFrameBuffer> payloads;
1067 payloads.push_back(payload0);
1068 payloads.push_back(payload1);
1069 payloads.push_back(payload2);
1070
1071 OwningSerializedPacketPointer encrypted(
1072 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1073 false));
1074 InSequence s;
1075 EXPECT_CALL(framer_visitor_, OnPacket());
1076 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1077 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1078 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1079 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1080 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1081 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1082
1083 server_framer_.ProcessPacket(QuicEncryptedPacket(
1084 encrypted->encrypted_buffer, encrypted->encrypted_length));
1085 }
1086}
1087
1088TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
1089 if (GetParam().version.transport_version > QUIC_VERSION_43 &&
1090 GetParam().version.transport_version != QUIC_VERSION_99) {
1091 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1092 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1093 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1094 } else {
1095 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1096 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1097 }
1098
1099 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1100 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1101 10000 / kDefaultMaxPacketSize);
1102 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1103 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1104
1105 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1106 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1107 10000 / kDefaultMaxPacketSize);
1108 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1109 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1110
1111 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1112 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1113 10000 / kDefaultMaxPacketSize);
1114 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1115 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1116
1117 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1118 UINT64_C(64) * 256 * 256 * 256 * 256);
1119 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1120 10000 / kDefaultMaxPacketSize);
1121 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1122 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1123}
1124
1125TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1126 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
1127 if (GetParam().version.transport_version > QUIC_VERSION_43 &&
1128 GetParam().version.transport_version != QUIC_VERSION_99) {
1129 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1130 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1131 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1132 } else {
1133 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1134 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1135 }
1136
1137 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1138 10000 / kDefaultMaxPacketSize);
1139 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1140 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1141
1142 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1143 10000 * 256 / kDefaultMaxPacketSize);
1144 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1145 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1146
1147 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1148 10000 * 256 * 256 / kDefaultMaxPacketSize);
1149 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1150 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1151
1152 creator_.UpdatePacketNumberLength(
1153 QuicPacketNumber(1),
1154 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1155 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1156 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1157}
1158
1159TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1160 if (!GetParam().version_serialization) {
1161 creator_.StopSendingVersion();
1162 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001163 std::string data("a");
1164 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1165 QuicStreamFrame stream_frame(
1166 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1167 /*fin=*/false, 0u, QuicStringPiece());
1168 frames_.push_back(QuicFrame(stream_frame));
1169 } else {
1170 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1171 frames_.push_back(
1172 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1173 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001174 SerializedPacket serialized = SerializeAllFrames(frames_);
1175
1176 QuicPacketHeader header;
1177 {
1178 InSequence s;
1179 EXPECT_CALL(framer_visitor_, OnPacket());
1180 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1181 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1182 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1183 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1184 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001185 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1186 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1187 } else {
1188 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1189 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001190 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1191 }
1192 ProcessPacket(serialized);
1193 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001194 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001195}
1196
1197TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1198 if (!GetParam().version_serialization) {
1199 creator_.StopSendingVersion();
1200 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001201 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001202 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001203 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001204 size_t payload_length = creator_.max_packet_length();
1205 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001206 MakeIOVector(too_long_payload, &iov_);
1207 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1208 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001209 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1210 client_framer_.transport_version(), Perspective::IS_CLIENT);
1211 ASSERT_TRUE(creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u,
1212 true, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001213 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001214 // The entire payload could not be consumed.
1215 EXPECT_GT(payload_length, consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001216 creator_.Flush();
1217 DeleteSerializedPacket();
1218}
1219
1220TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1221 if (!GetParam().version_serialization) {
1222 creator_.StopSendingVersion();
1223 }
1224 const size_t max_plaintext_size =
1225 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1226 EXPECT_FALSE(creator_.HasPendingFrames());
1227 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1228 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1229 EXPECT_EQ(max_plaintext_size -
1230 GetPacketHeaderSize(
1231 client_framer_.transport_version(),
1232 creator_.GetDestinationConnectionIdLength(),
1233 creator_.GetSourceConnectionIdLength(),
1234 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1235 !kIncludeDiversificationNonce,
1236 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1237 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1238 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1239 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001240 StrictMock<MockDebugDelegate> debug;
1241 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001242
1243 // Add a variety of frame types and then a padding frame.
1244 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001245 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001246 EXPECT_TRUE(
1247 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1248 EXPECT_TRUE(creator_.HasPendingFrames());
1249 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1250 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1251
1252 QuicFrame frame;
1253 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001254 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001255 ASSERT_TRUE(creator_.ConsumeData(
1256 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1257 1u, iov_.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION, &frame));
1258 size_t consumed = frame.stream_frame.data_length;
1259 EXPECT_EQ(4u, consumed);
1260 EXPECT_TRUE(creator_.HasPendingFrames());
1261 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(
1262 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1263
1264 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001265 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001266 EXPECT_TRUE(
1267 creator_.AddSavedFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
1268 EXPECT_TRUE(creator_.HasPendingFrames());
1269 EXPECT_EQ(0u, creator_.BytesFree());
1270
1271 // Packet is full. Creator will flush.
1272 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1273 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1274 EXPECT_FALSE(
1275 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1276
1277 // Ensure the packet is successfully created.
1278 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1279 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1280 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1281 ASSERT_EQ(1u, retransmittable.size());
1282 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1283 EXPECT_TRUE(serialized_packet_.has_ack);
1284 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1285 DeleteSerializedPacket();
1286
1287 EXPECT_FALSE(creator_.HasPendingFrames());
1288 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1289 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1290 EXPECT_EQ(max_plaintext_size -
1291 GetPacketHeaderSize(
1292 client_framer_.transport_version(),
1293 creator_.GetDestinationConnectionIdLength(),
1294 creator_.GetSourceConnectionIdLength(),
1295 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1296 !kIncludeDiversificationNonce,
1297 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1298 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1299 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1300 creator_.BytesFree());
1301}
1302
1303TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1304 if (!GetParam().version_serialization) {
1305 creator_.StopSendingVersion();
1306 }
1307 EXPECT_FALSE(creator_.HasPendingFrames());
1308
1309 MakeIOVector("test", &iov_);
1310 producer_.SaveStreamData(
1311 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()), &iov_,
1312 1u, 0u, iov_.iov_len);
1313 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1314 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1315 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001316 StrictMock<MockDebugDelegate> debug;
1317 creator_.set_debug_delegate(&debug);
1318 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001319 creator_.CreateAndSerializeStreamFrame(
1320 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()),
1321 iov_.iov_len, 0, 0, true, NOT_RETRANSMISSION, &num_bytes_consumed);
1322 EXPECT_EQ(4u, num_bytes_consumed);
1323
1324 // Ensure the packet is successfully created.
1325 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1326 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1327 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1328 ASSERT_EQ(1u, retransmittable.size());
1329 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1330 DeleteSerializedPacket();
1331
1332 EXPECT_FALSE(creator_.HasPendingFrames());
1333}
1334
1335TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1336 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1337 if (!IsDefaultTestConfiguration()) {
1338 return;
1339 }
1340
QUICHE team6987b4a2019-03-15 16:23:04 -07001341 creator_.set_encryption_level(ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001342 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _, _));
1343 QuicStreamFrame stream_frame(
1344 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()),
1345 /*fin=*/false, 0u, QuicStringPiece());
1346 EXPECT_QUIC_BUG(
1347 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
1348 "Cannot send stream data without encryption.");
1349}
1350
1351TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1352 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1353 if (!IsDefaultTestConfiguration()) {
1354 return;
1355 }
1356
QUICHE teamdc41bf12019-03-20 12:58:42 -07001357 // This test only matters when the crypto handshake is sent in stream frames.
1358 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1359 // frames.
1360 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1361 return;
1362 }
1363
QUICHE teama6ef0a62019-03-07 20:34:33 -05001364 CryptoHandshakeMessage message;
1365 message.set_tag(kCHLO);
1366 message.set_minimum_size(kMaxPacketSize);
1367 CryptoFramer framer;
1368 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001369 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001370
1371 struct iovec iov;
1372 MakeIOVector(QuicStringPiece(message_data->data(), message_data->length()),
1373 &iov);
1374 QuicFrame frame;
1375 EXPECT_CALL(delegate_,
1376 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _));
1377 EXPECT_QUIC_BUG(creator_.ConsumeData(QuicUtils::GetCryptoStreamId(
1378 client_framer_.transport_version()),
1379 &iov, 1u, iov.iov_len, 0u, 0u, false,
1380 false, NOT_RETRANSMISSION, &frame),
1381 "Client hello won't fit in a single packet.");
1382}
1383
1384TEST_P(QuicPacketCreatorTest, PendingPadding) {
1385 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1386 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1387 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1388
1389 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1390 .WillRepeatedly(
1391 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1392 // Flush all paddings.
1393 while (creator_.pending_padding_bytes() > 0) {
1394 creator_.Flush();
1395 {
1396 InSequence s;
1397 EXPECT_CALL(framer_visitor_, OnPacket());
1398 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1399 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1400 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1401 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1402 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1403 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1404 }
1405 // Packet only contains padding.
1406 ProcessPacket(serialized_packet_);
1407 }
1408 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1409}
1410
1411TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001412 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001413 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1414 QuicFrame frame;
1415 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001416 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1417 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001418 ASSERT_TRUE(creator_.ConsumeData(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001419 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001420 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1421 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1422 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1423 creator_.Flush();
1424 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1425}
1426
1427TEST_P(QuicPacketCreatorTest, SendPendingPaddingInRetransmission) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001428 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1429 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1430 client_framer_.transport_version(), Perspective::IS_CLIENT);
1431 QuicStreamFrame stream_frame(stream_id,
1432 /*fin=*/false, 0u, QuicStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001433 QuicFrames frames;
1434 frames.push_back(QuicFrame(stream_frame));
1435 char buffer[kMaxPacketSize];
1436 QuicPendingRetransmission retransmission(CreateRetransmission(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001437 frames, true, /*num_padding_bytes=*/0, ENCRYPTION_FORWARD_SECURE,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001438 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
1439 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1440 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1441 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1442 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
1443 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1444 {
1445 InSequence s;
1446 EXPECT_CALL(framer_visitor_, OnPacket());
1447 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1448 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1449 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1450 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1451 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1452 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1453 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1454 }
1455 ProcessPacket(serialized_packet_);
1456}
1457
1458TEST_P(QuicPacketCreatorTest, SendPacketAfterFullPaddingRetransmission) {
1459 // Making sure needs_full_padding gets reset after a full padding
1460 // retransmission.
1461 EXPECT_EQ(0u, creator_.pending_padding_bytes());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001462 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001463 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -07001464 std::string data = "fake handshake message data";
1465 MakeIOVector(data, &iov_);
1466 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1467 client_framer_.transport_version(), Perspective::IS_CLIENT);
1468 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1469 stream_id =
1470 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1471 }
1472 producer_.SaveStreamData(stream_id, &iov_, 1u, 0u, iov_.iov_len);
1473 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, stream_id, iov_.iov_len,
1474 0u, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001475 QuicFrames frames;
1476 frames.push_back(frame);
1477 char buffer[kMaxPacketSize];
1478 QuicPendingRetransmission retransmission(CreateRetransmission(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001479 frames, true, /*num_padding_bytes=*/-1, ENCRYPTION_FORWARD_SECURE,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001480 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
1481 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1482 .WillRepeatedly(
1483 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1484 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
1485 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
1486 {
1487 InSequence s;
1488 EXPECT_CALL(framer_visitor_, OnPacket());
1489 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1490 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1491 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1492 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1493 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1494 // Full padding.
1495 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1496 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1497 }
1498 ProcessPacket(serialized_packet_);
1499
QUICHE teamdc41bf12019-03-20 12:58:42 -07001500 creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1501 NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001502 creator_.Flush();
1503 {
1504 InSequence s;
1505 EXPECT_CALL(framer_visitor_, OnPacket());
1506 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1507 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1508 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1509 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1510 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1511 // needs_full_padding gets reset.
1512 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
1513 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1514 }
1515 ProcessPacket(serialized_packet_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001516 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001517}
1518
1519TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001520 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001521 const QuicByteCount kStreamFramePayloadSize = 100u;
1522 // Set the packet size be enough for one stream frame with 0 stream offset +
1523 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001524 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1525 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001526 size_t length =
1527 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1528 GetEncryptionOverhead() +
1529 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001530 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001531 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1532 kStreamFramePayloadSize + 1;
1533 creator_.SetMaxPacketLength(length);
1534 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1535 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1536 QuicFrame frame;
1537 char buf[kStreamFramePayloadSize + 1] = {};
1538 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1539 .WillRepeatedly(
1540 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1541 // Send stream frame of size kStreamFramePayloadSize.
1542 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001543 creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1544 NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001545 creator_.Flush();
1546 // 1 byte padding is sent.
1547 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1548 // Send stream frame of size kStreamFramePayloadSize + 1.
1549 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize + 1), &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001550 creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u,
1551 kStreamFramePayloadSize, false, false,
1552 NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001553 // No padding is sent.
1554 creator_.Flush();
1555 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1556 // Flush all paddings.
1557 while (creator_.pending_padding_bytes() > 0) {
1558 creator_.Flush();
1559 }
1560 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1561}
1562
1563TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001564 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001565 char external_buffer[kMaxPacketSize];
1566 char* expected_buffer = external_buffer;
1567 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1568
1569 QuicFrame frame;
1570 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001571 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1572 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001573 ASSERT_TRUE(creator_.ConsumeData(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001574 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001575 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1576
1577 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1578 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1579 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1580 ClearSerializedPacket(serialized_packet);
1581 }));
1582 creator_.Flush();
1583}
1584
1585// Test for error found in
1586// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1587// length that crosses an IETF VarInt length boundary would cause a
1588// failure. While this test is not applicable to versions other than version 99,
1589// it should still work. Hence, it is not made version-specific.
1590TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1591 QuicAckFrame ack_frame =
1592 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1593 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1594 frames_.push_back(QuicFrame(&ack_frame));
1595 SerializeAllFrames(frames_);
1596}
1597
1598TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
1599 if (client_framer_.transport_version() <= QUIC_VERSION_44) {
1600 return;
1601 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001602 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001603 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1604 .Times(3)
1605 .WillRepeatedly(
1606 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1607 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1608 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001609 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1610 creator_.GetCurrentLargestMessagePayload()));
1611 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001612 QuicMessageFrame* message_frame =
1613 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001614 EXPECT_TRUE(
1615 creator_.AddSavedFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
1616 EXPECT_TRUE(creator_.HasPendingFrames());
1617 creator_.Flush();
1618
wub553a9662019-03-28 20:13:23 -07001619 QuicMessageFrame* frame2 =
1620 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001621 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
1622 EXPECT_TRUE(creator_.HasPendingFrames());
1623 // Verify if a new frame is added, 1 byte message length will be added.
1624 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001625 QuicMessageFrame* frame3 =
1626 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001627 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
1628 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
1629 creator_.Flush();
1630
1631 QuicFrame frame;
1632 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001633 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1634 client_framer_.transport_version(), Perspective::IS_CLIENT);
1635 EXPECT_TRUE(creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u,
1636 false, false, NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001637 QuicMessageFrame* frame4 =
1638 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001639 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
1640 EXPECT_TRUE(creator_.HasPendingFrames());
1641 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001642 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1643 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001644 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001645 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001646 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
1647 EXPECT_FALSE(creator_.HasPendingFrames());
1648}
1649
1650TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
1651 if (client_framer_.transport_version() <= QUIC_VERSION_44) {
1652 return;
1653 }
vasilvvc48c8712019-03-11 13:38:16 -07001654 std::string message_data(kDefaultMaxPacketSize, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001655 QuicStringPiece message_buffer(message_data);
1656 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001657 // Test all possible encryption levels of message frames.
1658 for (EncryptionLevel level :
1659 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1660 creator_.set_encryption_level(level);
1661 // Test all possible sizes of message frames.
1662 for (size_t message_size = 0;
1663 message_size <= creator_.GetCurrentLargestMessagePayload();
1664 ++message_size) {
1665 QuicMessageFrame* frame = new QuicMessageFrame(
1666 0, MakeSpan(&allocator_,
1667 QuicStringPiece(message_buffer.data(), message_size),
1668 &storage));
1669 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame), NOT_RETRANSMISSION));
1670 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001671
ianswettb239f862019-04-05 09:15:06 -07001672 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1673 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1674 // Verify BytesFree returns bytes available for the next frame, which
1675 // should subtract the message length.
1676 size_t expected_bytes_free =
1677 creator_.GetCurrentLargestMessagePayload() - message_size <
1678 expansion_bytes
1679 ? 0
1680 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1681 message_size;
1682 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1683 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1684 creator_.GetCurrentLargestMessagePayload());
1685 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1686 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1687 creator_.Flush();
1688 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1689 DeleteSerializedPacket();
1690 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001691 }
1692}
1693
1694TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001695 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001696 creator_.set_can_set_transmission_type(true);
1697 creator_.SetTransmissionType(NOT_RETRANSMISSION);
1698
1699 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1700 QuicFrame ack_frame(&temp_ack_frame);
1701 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1702
QUICHE teamdc41bf12019-03-20 12:58:42 -07001703 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1704 client_framer_.transport_version(), Perspective::IS_CLIENT);
1705 QuicFrame stream_frame(QuicStreamFrame(stream_id,
1706 /*fin=*/false, 0u, QuicStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001707 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1708
1709 QuicFrame padding_frame{QuicPaddingFrame()};
1710 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1711
1712 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1713 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1714
1715 EXPECT_TRUE(creator_.AddSavedFrame(ack_frame, LOSS_RETRANSMISSION));
1716 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1717
1718 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame, RTO_RETRANSMISSION));
1719 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1720
1721 EXPECT_TRUE(creator_.AddSavedFrame(padding_frame, TLP_RETRANSMISSION));
1722 creator_.Flush();
1723 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1724
1725 if (creator_.ShouldSetTransmissionTypeForNextFrame()) {
1726 // The last retransmittable frame on packet is a stream frame, the packet's
1727 // transmission type should be the same as the stream frame's.
1728 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
1729 } else {
1730 EXPECT_EQ(serialized_packet_.transmission_type, NOT_RETRANSMISSION);
1731 }
1732 DeleteSerializedPacket();
1733}
1734
1735TEST_P(QuicPacketCreatorTest, RetryToken) {
1736 if (!GetParam().version_serialization ||
1737 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1738 return;
1739 }
1740
1741 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1742 9, 10, 11, 12, 13, 14, 15, 16};
1743
1744 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001745 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001746
QUICHE teamdc41bf12019-03-20 12:58:42 -07001747 std::string data("a");
1748 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1749 QuicStreamFrame stream_frame(
1750 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1751 /*fin=*/false, 0u, QuicStringPiece());
1752 frames_.push_back(QuicFrame(stream_frame));
1753 } else {
1754 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1755 frames_.push_back(
1756 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1757 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001758 SerializedPacket serialized = SerializeAllFrames(frames_);
1759
1760 QuicPacketHeader header;
1761 {
1762 InSequence s;
1763 EXPECT_CALL(framer_visitor_, OnPacket());
1764 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1765 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1766 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1767 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1768 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001769 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1770 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1771 } else {
1772 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1773 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001774 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1775 }
1776 ProcessPacket(serialized);
1777 ASSERT_TRUE(header.version_flag);
1778 ASSERT_EQ(header.long_packet_type, INITIAL);
1779 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1780 test::CompareCharArraysWithHexError(
1781 "retry token", header.retry_token.data(), header.retry_token.length(),
1782 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001783 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001784}
1785
1786} // namespace
1787} // namespace test
1788} // namespace quic