blob: a781c511b97cdf6d7b28ed6415d46fb6e074d80f [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
68class TestPacketCreator : public QuicPacketCreator {
69 public:
70 TestPacketCreator(QuicConnectionId connection_id,
71 QuicFramer* framer,
72 DelegateInterface* delegate,
73 SimpleDataProducer* producer)
74 : QuicPacketCreator(connection_id, framer, delegate),
75 producer_(producer),
76 version_(framer->transport_version()) {}
77
78 bool ConsumeData(QuicStreamId id,
79 const struct iovec* iov,
80 int iov_count,
81 size_t total_length,
82 size_t iov_offset,
83 QuicStreamOffset offset,
84 bool fin,
85 bool needs_full_padding,
86 TransmissionType transmission_type,
87 QuicFrame* frame) {
88 // Save data before data is consumed.
89 QuicByteCount data_length = total_length - iov_offset;
90 if (data_length > 0) {
91 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
92 }
93 return QuicPacketCreator::ConsumeData(id, data_length, iov_offset, offset,
94 fin, needs_full_padding,
95 transmission_type, frame);
96 }
97
98 void StopSendingVersion() {
99 if (version_ > QUIC_VERSION_43) {
100 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
101 return;
102 }
103 QuicPacketCreator::StopSendingVersion();
104 }
105
106 SimpleDataProducer* producer_;
107 QuicTransportVersion version_;
108};
109
110class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
111 public:
112 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) {
113 if (serialized_packet == nullptr) {
114 return;
115 }
116 ClearSerializedPacket(serialized_packet);
117 }
118
119 void SaveSerializedPacket(SerializedPacket* serialized_packet) {
120 if (serialized_packet == nullptr) {
121 return;
122 }
123 delete[] serialized_packet_.encrypted_buffer;
124 serialized_packet_ = *serialized_packet;
125 serialized_packet_.encrypted_buffer = CopyBuffer(*serialized_packet);
126 serialized_packet->retransmittable_frames.clear();
127 }
128
129 void DeleteSerializedPacket() {
130 delete[] serialized_packet_.encrypted_buffer;
131 serialized_packet_.encrypted_buffer = nullptr;
132 ClearSerializedPacket(&serialized_packet_);
133 }
134
135 protected:
136 QuicPacketCreatorTest()
137 : connection_id_(TestConnectionId(2)),
138 server_framer_(SupportedVersions(GetParam().version),
139 QuicTime::Zero(),
140 Perspective::IS_SERVER,
141 connection_id_.length()),
142 client_framer_(SupportedVersions(GetParam().version),
143 QuicTime::Zero(),
144 Perspective::IS_CLIENT,
145 connection_id_.length()),
146 data_("foo"),
147 creator_(connection_id_, &client_framer_, &delegate_, &producer_),
148 serialized_packet_(creator_.NoPacket()) {
149 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
QUICHE team88ea0082019-03-15 10:05:26 -0700150 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, QuicMakeUnique<NullEncrypter>(
151 Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500152 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, QuicMakeUnique<NullEncrypter>(
153 Perspective::IS_CLIENT));
154 creator_.SetEncrypter(
155 ENCRYPTION_FORWARD_SECURE,
156 QuicMakeUnique<NullEncrypter>(Perspective::IS_CLIENT));
157 client_framer_.set_visitor(&framer_visitor_);
158 server_framer_.set_visitor(&framer_visitor_);
159 client_framer_.set_data_producer(&producer_);
160 }
161
162 ~QuicPacketCreatorTest() override {
163 delete[] serialized_packet_.encrypted_buffer;
164 ClearSerializedPacket(&serialized_packet_);
165 }
166
167 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
168 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
169 &creator_, frames, buffer_, kMaxPacketSize);
170 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
171 packet.encryption_level);
172 return packet;
173 }
174
175 void ProcessPacket(const SerializedPacket& packet) {
176 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
177 packet.encrypted_length);
178 server_framer_.ProcessPacket(encrypted_packet);
179 }
180
181 void CheckStreamFrame(const QuicFrame& frame,
182 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700183 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500184 QuicStreamOffset offset,
185 bool fin) {
186 EXPECT_EQ(STREAM_FRAME, frame.type);
187 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
188 char buf[kMaxPacketSize];
189 QuicDataWriter writer(kMaxPacketSize, buf, HOST_BYTE_ORDER);
190 if (frame.stream_frame.data_length > 0) {
191 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
192 frame.stream_frame.data_length, &writer);
193 }
194 EXPECT_EQ(data, QuicStringPiece(buf, frame.stream_frame.data_length));
195 EXPECT_EQ(offset, frame.stream_frame.offset);
196 EXPECT_EQ(fin, frame.stream_frame.fin);
197 }
198
199 // Returns the number of bytes consumed by the header of packet, including
200 // the version.
201 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
202 return GetPacketHeaderSize(
203 version, creator_.GetDestinationConnectionIdLength(),
204 creator_.GetSourceConnectionIdLength(),
205 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
206 !kIncludeDiversificationNonce,
207 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
208 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
209 QuicPacketCreatorPeer::GetLengthLength(&creator_));
210 }
211
212 // Returns the number of bytes of overhead that will be added to a packet
213 // of maximum length.
214 size_t GetEncryptionOverhead() {
215 return creator_.max_packet_length() -
216 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
217 }
218
219 // Returns the number of bytes consumed by the non-data fields of a stream
220 // frame, assuming it is the last frame in the packet
221 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
222 return QuicFramer::GetMinStreamFrameSize(
223 version, GetNthClientInitiatedStreamId(1), kOffset, true,
224 /* data_length= */ 0);
225 }
226
227 QuicPendingRetransmission CreateRetransmission(
228 const QuicFrames& retransmittable_frames,
229 bool has_crypto_handshake,
230 int num_padding_bytes,
231 EncryptionLevel encryption_level,
232 QuicPacketNumberLength packet_number_length) {
233 return QuicPendingRetransmission(QuicPacketNumber(1u), NOT_RETRANSMISSION,
234 retransmittable_frames,
235 has_crypto_handshake, num_padding_bytes,
236 encryption_level, packet_number_length);
237 }
238
239 bool IsDefaultTestConfiguration() {
240 TestParams p = GetParam();
241 return p.version == AllSupportedVersions()[0] && p.version_serialization;
242 }
243
244 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
245 return QuicUtils::GetHeadersStreamId(creator_.transport_version()) + n * 2;
246 }
247
248 static const QuicStreamOffset kOffset = 0u;
249
250 char buffer_[kMaxPacketSize];
251 QuicConnectionId connection_id_;
252 QuicFrames frames_;
253 QuicFramer server_framer_;
254 QuicFramer client_framer_;
255 StrictMock<MockFramerVisitor> framer_visitor_;
256 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700257 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500258 struct iovec iov_;
259 TestPacketCreator creator_;
260 SerializedPacket serialized_packet_;
261 SimpleDataProducer producer_;
262 SimpleBufferAllocator allocator_;
263};
264
265// Run all packet creator tests with all supported versions of QUIC, and with
266// and without version in the packet header, as well as doing a run for each
267// length of truncated connection id.
268INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
269 QuicPacketCreatorTest,
270 ::testing::ValuesIn(GetTestParams()));
271
272TEST_P(QuicPacketCreatorTest, SerializeFrames) {
273 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
274 EncryptionLevel level = static_cast<EncryptionLevel>(i);
275 creator_.set_encryption_level(level);
276 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
277 frames_.push_back(QuicFrame(QuicStreamFrame(
278 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), false,
279 0u, QuicStringPiece())));
280 frames_.push_back(QuicFrame(QuicStreamFrame(
281 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), true,
282 0u, QuicStringPiece())));
283 SerializedPacket serialized = SerializeAllFrames(frames_);
284 EXPECT_EQ(level, serialized.encryption_level);
285 delete frames_[0].ack_frame;
286 frames_.clear();
287
288 {
289 InSequence s;
290 EXPECT_CALL(framer_visitor_, OnPacket());
291 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
292 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
293 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
294 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
295 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
296 .WillOnce(Return(true));
297 EXPECT_CALL(framer_visitor_,
298 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
299 .WillOnce(Return(true));
300 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
301 .WillOnce(Return(true));
302 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
303 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
304 EXPECT_CALL(framer_visitor_, OnPacketComplete());
305 }
306 ProcessPacket(serialized);
307 }
308}
309
310TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
311 if (client_framer_.transport_version() > QUIC_VERSION_43) {
312 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
313 }
314 // If the original packet number length, the current packet number
315 // length, and the configured send packet number length are different, the
316 // retransmit must sent with the original length and the others do not change.
317 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_,
318 PACKET_2BYTE_PACKET_NUMBER);
319 QuicStreamFrame stream_frame(
320 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
321 /*fin=*/false, 0u, QuicStringPiece());
322 QuicFrames frames;
323 frames.push_back(QuicFrame(stream_frame));
324 char buffer[kMaxPacketSize];
325 QuicPendingRetransmission retransmission(CreateRetransmission(
326 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
327 ENCRYPTION_NONE, PACKET_4BYTE_PACKET_NUMBER));
328 EXPECT_CALL(delegate_, OnSerializedPacket(_))
329 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
330 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
331 // The packet number length is updated after every packet is sent,
332 // so there is no need to restore the old length after sending.
333 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
334 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
335 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
336 serialized_packet_.packet_number_length);
337
338 {
339 InSequence s;
340 EXPECT_CALL(framer_visitor_, OnPacket());
341 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
342 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
343 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
344 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
345 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
346 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
347 EXPECT_CALL(framer_visitor_, OnPacketComplete());
348 }
349 ProcessPacket(serialized_packet_);
350}
351
352TEST_P(QuicPacketCreatorTest, ReserializeCryptoFrameWithForwardSecurity) {
353 QuicStreamFrame stream_frame(
354 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
355 /*fin=*/false, 0u, QuicStringPiece());
356 QuicFrames frames;
357 frames.push_back(QuicFrame(stream_frame));
358 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
359 char buffer[kMaxPacketSize];
360 QuicPendingRetransmission retransmission(CreateRetransmission(
361 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
362 ENCRYPTION_NONE,
363 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
364 EXPECT_CALL(delegate_, OnSerializedPacket(_))
365 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
366 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
367 EXPECT_EQ(ENCRYPTION_NONE, serialized_packet_.encryption_level);
368}
369
370TEST_P(QuicPacketCreatorTest, ReserializeFrameWithForwardSecurity) {
371 QuicStreamFrame stream_frame(0u, /*fin=*/false, 0u, QuicStringPiece());
372 QuicFrames frames;
373 frames.push_back(QuicFrame(stream_frame));
374 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
375 char buffer[kMaxPacketSize];
376 QuicPendingRetransmission retransmission(CreateRetransmission(
377 frames, false /* has_crypto_handshake */, 0 /* no padding */,
378 ENCRYPTION_NONE,
379 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
380 EXPECT_CALL(delegate_, OnSerializedPacket(_))
381 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
382 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
383 EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, serialized_packet_.encryption_level);
384}
385
386TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPadding) {
387 QuicFrame frame;
388 MakeIOVector("fake handshake message data", &iov_);
389 producer_.SaveStreamData(
390 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
391 1u, 0u, iov_.iov_len);
392 QuicPacketCreatorPeer::CreateStreamFrame(
393 &creator_,
394 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
QUICHE teamf08778a2019-03-14 08:10:26 -0700395 iov_.iov_len, 0u, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500396 QuicFrames frames;
397 frames.push_back(frame);
398 char buffer[kMaxPacketSize];
399 QuicPendingRetransmission retransmission(CreateRetransmission(
400 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
401 ENCRYPTION_NONE,
402 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
403 EXPECT_CALL(delegate_, OnSerializedPacket(_))
404 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
405 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
406 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
407}
408
409TEST_P(QuicPacketCreatorTest, DoNotRetransmitPendingPadding) {
410 QuicFrame frame;
411 MakeIOVector("fake message data", &iov_);
412 producer_.SaveStreamData(
413 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
414 1u, 0u, iov_.iov_len);
415 QuicPacketCreatorPeer::CreateStreamFrame(
416 &creator_,
417 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
QUICHE teamf08778a2019-03-14 08:10:26 -0700418 iov_.iov_len, 0u, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500419
420 const int kNumPaddingBytes1 = 4;
421 int packet_size = 0;
422 {
423 QuicFrames frames;
424 frames.push_back(frame);
425 char buffer[kMaxPacketSize];
426 QuicPendingRetransmission retransmission(CreateRetransmission(
427 frames, false /* has_crypto_handshake */,
428 kNumPaddingBytes1 /* padding bytes */, ENCRYPTION_NONE,
429 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
430 EXPECT_CALL(delegate_, OnSerializedPacket(_))
431 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
432 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
433 packet_size = serialized_packet_.encrypted_length;
434 }
435
436 {
437 InSequence s;
438 EXPECT_CALL(framer_visitor_, OnPacket());
439 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
440 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
441 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
442 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
443 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
444 // Pending paddings are not retransmitted.
445 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
446 EXPECT_CALL(framer_visitor_, OnPacketComplete());
447 }
448 ProcessPacket(serialized_packet_);
449
450 const int kNumPaddingBytes2 = 44;
451 QuicFrames frames;
452 frames.push_back(frame);
453 char buffer[kMaxPacketSize];
454 QuicPendingRetransmission retransmission(CreateRetransmission(
455 frames, false /* has_crypto_handshake */,
456 kNumPaddingBytes2 /* padding bytes */, ENCRYPTION_NONE,
457 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
458 EXPECT_CALL(delegate_, OnSerializedPacket(_))
459 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
460 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
461
462 EXPECT_EQ(packet_size, serialized_packet_.encrypted_length);
463}
464
465TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) {
466 const size_t overhead =
467 GetPacketHeaderOverhead(client_framer_.transport_version()) +
468 GetEncryptionOverhead() +
469 GetStreamFrameOverhead(client_framer_.transport_version());
470 size_t capacity = kDefaultMaxPacketSize - overhead;
471 for (int delta = -5; delta <= 0; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700472 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500473 size_t bytes_free = 0 - delta;
474
475 QuicFrame frame;
476 MakeIOVector(data, &iov_);
477 SimpleDataProducer producer;
478 producer.SaveStreamData(
479 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
480 1u, 0u, iov_.iov_len);
481 QuicPacketCreatorPeer::framer(&creator_)->set_data_producer(&producer);
482 QuicPacketCreatorPeer::CreateStreamFrame(
483 &creator_,
484 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
QUICHE teamf08778a2019-03-14 08:10:26 -0700485 iov_.iov_len, kOffset, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500486 QuicFrames frames;
487 frames.push_back(frame);
488 char buffer[kMaxPacketSize];
489 QuicPendingRetransmission retransmission(CreateRetransmission(
490 frames, true /* has_crypto_handshake */, -1 /* needs full padding */,
491 ENCRYPTION_NONE,
492 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
493 EXPECT_CALL(delegate_, OnSerializedPacket(_))
494 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
495 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
496
497 // If there is not enough space in the packet to fit a padding frame
498 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
499 // will not be padded.
500 if (bytes_free < 3) {
501 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
502 serialized_packet_.encrypted_length);
503 } else {
504 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
505 }
506
507 frames_.clear();
508 }
509}
510
511TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
512 QuicConnectionCloseFrame frame;
513 frame.error_code = QUIC_NO_ERROR;
514 frame.error_details = "error";
515
516 QuicFrames frames;
517 frames.push_back(QuicFrame(&frame));
518 SerializedPacket serialized = SerializeAllFrames(frames);
519 EXPECT_EQ(ENCRYPTION_NONE, serialized.encryption_level);
520 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
521 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
522
523 InSequence s;
524 EXPECT_CALL(framer_visitor_, OnPacket());
525 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
526 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
527 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
528 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
529 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
530 EXPECT_CALL(framer_visitor_, OnPacketComplete());
531
532 ProcessPacket(serialized);
533}
534
535TEST_P(QuicPacketCreatorTest, ConsumeCryptoData) {
vasilvvc48c8712019-03-11 13:38:16 -0700536 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500537 QuicFrame frame;
538 ASSERT_TRUE(creator_.ConsumeCryptoData(ENCRYPTION_NONE, data.length(), 0,
539 NOT_RETRANSMISSION, &frame));
540 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
541 EXPECT_TRUE(creator_.HasPendingFrames());
542}
543
544TEST_P(QuicPacketCreatorTest, ConsumeData) {
545 QuicFrame frame;
546 MakeIOVector("test", &iov_);
547 ASSERT_TRUE(creator_.ConsumeData(
548 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
549 1u, iov_.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION, &frame));
550 size_t consumed = frame.stream_frame.data_length;
551 EXPECT_EQ(4u, consumed);
552 CheckStreamFrame(
553 frame, QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
554 "test", 0u, false);
555 EXPECT_TRUE(creator_.HasPendingFrames());
556}
557
558TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
559 QuicFrame frame;
560 MakeIOVector("test", &iov_);
561 ASSERT_TRUE(creator_.ConsumeData(
562 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
563 1u, iov_.iov_len, 0u, 0u, true, false, NOT_RETRANSMISSION, &frame));
564 size_t consumed = frame.stream_frame.data_length;
565 EXPECT_EQ(4u, consumed);
566 CheckStreamFrame(
567 frame, QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
568 "test", 0u, true);
569 EXPECT_TRUE(creator_.HasPendingFrames());
570}
571
572TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
573 QuicFrame frame;
574 ASSERT_TRUE(creator_.ConsumeData(
575 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), nullptr,
576 0u, 0u, 0u, 0u, true, false, NOT_RETRANSMISSION, &frame));
577 size_t consumed = frame.stream_frame.data_length;
578 EXPECT_EQ(0u, consumed);
579 CheckStreamFrame(
580 frame, QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
vasilvvc48c8712019-03-11 13:38:16 -0700581 std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500582 EXPECT_TRUE(creator_.HasPendingFrames());
583}
584
585TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
586 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
587 const size_t overhead =
588 GetPacketHeaderOverhead(client_framer_.transport_version()) +
589 GetEncryptionOverhead();
590 for (size_t i = overhead; i < overhead + 100; ++i) {
591 creator_.SetMaxPacketLength(i);
592 const bool should_have_room =
593 i >
594 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
595 ASSERT_EQ(should_have_room,
596 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
597 kOffset, /* data_size=*/0xffff));
598 if (should_have_room) {
599 QuicFrame frame;
600 MakeIOVector("testdata", &iov_);
601 EXPECT_CALL(delegate_, OnSerializedPacket(_))
602 .WillRepeatedly(Invoke(
603 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
604 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
605 1u, iov_.iov_len, 0u, kOffset, false,
606 false, NOT_RETRANSMISSION, &frame));
607 size_t bytes_consumed = frame.stream_frame.data_length;
608 EXPECT_LT(0u, bytes_consumed);
609 creator_.Flush();
610 }
611 }
612}
613
614TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
615 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
616 // Compute the total overhead for a single frame in packet.
617 const size_t overhead =
618 GetPacketHeaderOverhead(client_framer_.transport_version()) +
619 GetEncryptionOverhead() +
620 GetStreamFrameOverhead(client_framer_.transport_version());
621 size_t capacity = kDefaultMaxPacketSize - overhead;
622 // Now, test various sizes around this size.
623 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700624 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500625 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
626 QuicFrame frame;
627 MakeIOVector(data, &iov_);
628 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
629 1u, iov_.iov_len, 0u, kOffset, false,
630 false, NOT_RETRANSMISSION, &frame));
631
632 // BytesFree() returns bytes available for the next frame, which will
633 // be two bytes smaller since the stream frame would need to be grown.
634 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
635 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
636 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
637 EXPECT_CALL(delegate_, OnSerializedPacket(_))
638 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
639 creator_.Flush();
640 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
641 DeleteSerializedPacket();
642 }
643}
644
645TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
646 // Compute the total overhead for a single frame in packet.
647 const size_t overhead =
648 GetPacketHeaderOverhead(client_framer_.transport_version()) +
649 GetEncryptionOverhead() +
650 GetStreamFrameOverhead(client_framer_.transport_version());
651 ASSERT_GT(kMaxPacketSize, overhead);
652 size_t capacity = kDefaultMaxPacketSize - overhead;
653 // Now, test various sizes around this size.
654 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700655 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500656 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
657
658 QuicFrame frame;
659 MakeIOVector(data, &iov_);
660 EXPECT_CALL(delegate_, OnSerializedPacket(_))
661 .WillRepeatedly(
662 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
663 ASSERT_TRUE(creator_.ConsumeData(
664 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
665 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
666 &frame));
667 size_t bytes_consumed = frame.stream_frame.data_length;
668 EXPECT_LT(0u, bytes_consumed);
669 creator_.Flush();
670 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
671 // If there is not enough space in the packet to fit a padding frame
672 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
673 // will not be padded.
674 if (bytes_free < 3) {
675 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
676 serialized_packet_.encrypted_length);
677 } else {
678 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
679 }
680 DeleteSerializedPacket();
681 }
682}
683
684TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
685 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
686 // Compute the total overhead for a single frame in packet.
687 const size_t overhead =
688 GetPacketHeaderOverhead(client_framer_.transport_version()) +
689 GetEncryptionOverhead() +
690 GetStreamFrameOverhead(client_framer_.transport_version());
691 ASSERT_GT(kDefaultMaxPacketSize, overhead);
692 size_t capacity = kDefaultMaxPacketSize - overhead;
693 // Now, test various sizes around this size.
694 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700695 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500696 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
697
698 QuicFrame frame;
699 MakeIOVector(data, &iov_);
700 EXPECT_CALL(delegate_, OnSerializedPacket(_))
701 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
702 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
703 1u, iov_.iov_len, 0u, kOffset, false,
704 false, NOT_RETRANSMISSION, &frame));
705 size_t bytes_consumed = frame.stream_frame.data_length;
706 EXPECT_LT(0u, bytes_consumed);
707 creator_.Flush();
708 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
709 if (bytes_free > 0) {
710 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
711 serialized_packet_.encrypted_length);
712 } else {
713 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
714 }
715 DeleteSerializedPacket();
716 }
717}
718
719TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
720 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
721 ParsedQuicVersionVector versions;
722 versions.push_back(test::QuicVersionMax());
723 const bool ietf_quic = GetParam().version.transport_version > QUIC_VERSION_43;
724 std::unique_ptr<QuicEncryptedPacket> encrypted(
725 creator_.SerializeVersionNegotiationPacket(ietf_quic, versions));
726
727 {
728 InSequence s;
729 EXPECT_CALL(framer_visitor_, OnPacket());
730 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
731 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
732 }
733 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
734 client_framer_.ProcessPacket(*encrypted);
735}
736
737TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
738 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
739 EncryptionLevel level = static_cast<EncryptionLevel>(i);
740
741 creator_.set_encryption_level(level);
742
743 OwningSerializedPacketPointer encrypted;
744 if (GetParam().version.transport_version == QUIC_VERSION_99) {
745 QuicPathFrameBuffer payload = {
746 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
747 encrypted =
748 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
749 } else {
750 encrypted = creator_.SerializeConnectivityProbingPacket();
751 }
752 {
753 InSequence s;
754 EXPECT_CALL(framer_visitor_, OnPacket());
755 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
756 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
757 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
758 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
759 if (GetParam().version.transport_version == QUIC_VERSION_99) {
760 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
761 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
762 } else {
763 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
764 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
765 }
766 EXPECT_CALL(framer_visitor_, OnPacketComplete());
767 }
768 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
769 server_framer_.ProcessPacket(QuicEncryptedPacket(
770 encrypted->encrypted_buffer, encrypted->encrypted_length));
771 }
772}
773
774TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
775 if (GetParam().version.transport_version != QUIC_VERSION_99) {
776 return;
777 }
778 QuicPathFrameBuffer payload = {
779 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
780
781 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
782 EncryptionLevel level = static_cast<EncryptionLevel>(i);
783
784 creator_.set_encryption_level(level);
785
786 OwningSerializedPacketPointer encrypted(
787 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
788 {
789 InSequence s;
790 EXPECT_CALL(framer_visitor_, OnPacket());
791 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
792 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
793 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
794 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
795 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
796 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
797 EXPECT_CALL(framer_visitor_, OnPacketComplete());
798 }
799 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
800 server_framer_.ProcessPacket(QuicEncryptedPacket(
801 encrypted->encrypted_buffer, encrypted->encrypted_length));
802 }
803}
804
805TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
806 if (GetParam().version.transport_version != QUIC_VERSION_99) {
807 return;
808 }
809 QuicPathFrameBuffer payload0 = {
810 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
811
812 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
813 EncryptionLevel level = static_cast<EncryptionLevel>(i);
814 creator_.set_encryption_level(level);
815
816 QuicDeque<QuicPathFrameBuffer> payloads;
817 payloads.push_back(payload0);
818
819 OwningSerializedPacketPointer encrypted(
820 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
821 true));
822 {
823 InSequence s;
824 EXPECT_CALL(framer_visitor_, OnPacket());
825 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
826 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
827 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
828 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
829 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
830 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
831 EXPECT_CALL(framer_visitor_, OnPacketComplete());
832 }
833 server_framer_.ProcessPacket(QuicEncryptedPacket(
834 encrypted->encrypted_buffer, encrypted->encrypted_length));
835 }
836}
837
838TEST_P(QuicPacketCreatorTest,
839 SerializePathResponseProbePacket1PayloadUnPadded) {
840 if (GetParam().version.transport_version != QUIC_VERSION_99) {
841 return;
842 }
843 QuicPathFrameBuffer payload0 = {
844 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
845
846 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
847 EncryptionLevel level = static_cast<EncryptionLevel>(i);
848 creator_.set_encryption_level(level);
849
850 QuicDeque<QuicPathFrameBuffer> payloads;
851 payloads.push_back(payload0);
852
853 OwningSerializedPacketPointer encrypted(
854 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
855 false));
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_, OnPathResponseFrame(_));
864 EXPECT_CALL(framer_visitor_, OnPacketComplete());
865 }
866 server_framer_.ProcessPacket(QuicEncryptedPacket(
867 encrypted->encrypted_buffer, encrypted->encrypted_length));
868 }
869}
870
871TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
872 if (GetParam().version.transport_version != QUIC_VERSION_99) {
873 return;
874 }
875 QuicPathFrameBuffer payload0 = {
876 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
877 QuicPathFrameBuffer payload1 = {
878 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
879
880 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
881 EncryptionLevel level = static_cast<EncryptionLevel>(i);
882 creator_.set_encryption_level(level);
883
884 QuicDeque<QuicPathFrameBuffer> payloads;
885 payloads.push_back(payload0);
886 payloads.push_back(payload1);
887
888 OwningSerializedPacketPointer encrypted(
889 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
890 true));
891 {
892 InSequence s;
893 EXPECT_CALL(framer_visitor_, OnPacket());
894 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
895 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
896 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
897 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
898 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
899 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
900 EXPECT_CALL(framer_visitor_, OnPacketComplete());
901 }
902 server_framer_.ProcessPacket(QuicEncryptedPacket(
903 encrypted->encrypted_buffer, encrypted->encrypted_length));
904 }
905}
906
907TEST_P(QuicPacketCreatorTest,
908 SerializePathResponseProbePacket2PayloadsUnPadded) {
909 if (GetParam().version.transport_version != QUIC_VERSION_99) {
910 return;
911 }
912 QuicPathFrameBuffer payload0 = {
913 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
914 QuicPathFrameBuffer payload1 = {
915 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
916
917 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
918 EncryptionLevel level = static_cast<EncryptionLevel>(i);
919 creator_.set_encryption_level(level);
920
921 QuicDeque<QuicPathFrameBuffer> payloads;
922 payloads.push_back(payload0);
923 payloads.push_back(payload1);
924
925 OwningSerializedPacketPointer encrypted(
926 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
927 false));
928 {
929 InSequence s;
930 EXPECT_CALL(framer_visitor_, OnPacket());
931 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
932 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
933 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
934 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
935 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
936 EXPECT_CALL(framer_visitor_, OnPacketComplete());
937 }
938 server_framer_.ProcessPacket(QuicEncryptedPacket(
939 encrypted->encrypted_buffer, encrypted->encrypted_length));
940 }
941}
942
943TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
944 if (GetParam().version.transport_version != QUIC_VERSION_99) {
945 return;
946 }
947 QuicPathFrameBuffer payload0 = {
948 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
949 QuicPathFrameBuffer payload1 = {
950 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
951 QuicPathFrameBuffer payload2 = {
952 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
953
954 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
955 EncryptionLevel level = static_cast<EncryptionLevel>(i);
956 creator_.set_encryption_level(level);
957
958 QuicDeque<QuicPathFrameBuffer> payloads;
959 payloads.push_back(payload0);
960 payloads.push_back(payload1);
961 payloads.push_back(payload2);
962
963 OwningSerializedPacketPointer encrypted(
964 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
965 true));
966 {
967 InSequence s;
968 EXPECT_CALL(framer_visitor_, OnPacket());
969 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
970 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
971 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
972 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
973 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
974 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
975 EXPECT_CALL(framer_visitor_, OnPacketComplete());
976 }
977 server_framer_.ProcessPacket(QuicEncryptedPacket(
978 encrypted->encrypted_buffer, encrypted->encrypted_length));
979 }
980}
981
982TEST_P(QuicPacketCreatorTest,
983 SerializePathResponseProbePacket3PayloadsUnpadded) {
984 if (GetParam().version.transport_version != QUIC_VERSION_99) {
985 return;
986 }
987 QuicPathFrameBuffer payload0 = {
988 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
989 QuicPathFrameBuffer payload1 = {
990 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
991 QuicPathFrameBuffer payload2 = {
992 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
993
994 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) {
995 EncryptionLevel level = static_cast<EncryptionLevel>(i);
996 creator_.set_encryption_level(level);
997
998 QuicDeque<QuicPathFrameBuffer> payloads;
999 payloads.push_back(payload0);
1000 payloads.push_back(payload1);
1001 payloads.push_back(payload2);
1002
1003 OwningSerializedPacketPointer encrypted(
1004 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1005 false));
1006 InSequence s;
1007 EXPECT_CALL(framer_visitor_, OnPacket());
1008 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1009 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1010 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1011 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1012 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1013 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1014
1015 server_framer_.ProcessPacket(QuicEncryptedPacket(
1016 encrypted->encrypted_buffer, encrypted->encrypted_length));
1017 }
1018}
1019
1020TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
1021 if (GetParam().version.transport_version > QUIC_VERSION_43 &&
1022 GetParam().version.transport_version != QUIC_VERSION_99) {
1023 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1024 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1025 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1026 } else {
1027 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1028 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1029 }
1030
1031 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1032 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1033 10000 / kDefaultMaxPacketSize);
1034 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1035 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1036
1037 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1038 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1039 10000 / kDefaultMaxPacketSize);
1040 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1041 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1042
1043 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1044 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1045 10000 / kDefaultMaxPacketSize);
1046 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1047 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1048
1049 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1050 UINT64_C(64) * 256 * 256 * 256 * 256);
1051 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1052 10000 / kDefaultMaxPacketSize);
1053 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1054 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1055}
1056
1057TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1058 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
1059 if (GetParam().version.transport_version > QUIC_VERSION_43 &&
1060 GetParam().version.transport_version != QUIC_VERSION_99) {
1061 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1062 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1063 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1064 } else {
1065 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1066 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1067 }
1068
1069 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1070 10000 / kDefaultMaxPacketSize);
1071 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1072 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1073
1074 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1075 10000 * 256 / kDefaultMaxPacketSize);
1076 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1077 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1078
1079 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1080 10000 * 256 * 256 / kDefaultMaxPacketSize);
1081 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1082 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1083
1084 creator_.UpdatePacketNumberLength(
1085 QuicPacketNumber(1),
1086 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1087 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1088 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1089}
1090
1091TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1092 if (!GetParam().version_serialization) {
1093 creator_.StopSendingVersion();
1094 }
1095 frames_.push_back(QuicFrame(QuicStreamFrame(
1096 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), false,
1097 0u, QuicStringPiece())));
1098 SerializedPacket serialized = SerializeAllFrames(frames_);
1099
1100 QuicPacketHeader header;
1101 {
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 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1109 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1110 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1111 }
1112 ProcessPacket(serialized);
1113 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1114}
1115
1116TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1117 if (!GetParam().version_serialization) {
1118 creator_.StopSendingVersion();
1119 }
1120 // A string larger than fits into a frame.
1121 size_t payload_length;
1122 creator_.SetMaxPacketLength(GetPacketLengthForOneStream(
1123 client_framer_.transport_version(),
1124 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1125 !kIncludeDiversificationNonce,
1126 creator_.GetDestinationConnectionIdLength(),
1127 creator_.GetSourceConnectionIdLength(),
1128 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1129 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1130 QuicPacketCreatorPeer::GetLengthLength(&creator_), &payload_length));
1131 QuicFrame frame;
vasilvvc48c8712019-03-11 13:38:16 -07001132 const std::string too_long_payload(payload_length * 2, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001133 MakeIOVector(too_long_payload, &iov_);
1134 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1135 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1136 ASSERT_TRUE(creator_.ConsumeData(
1137 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1138 1u, iov_.iov_len, 0u, 0u, true, false, NOT_RETRANSMISSION, &frame));
1139 size_t consumed = frame.stream_frame.data_length;
1140 EXPECT_EQ(payload_length, consumed);
vasilvvc48c8712019-03-11 13:38:16 -07001141 const std::string payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001142 CheckStreamFrame(
1143 frame, QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1144 payload, 0u, false);
1145 creator_.Flush();
1146 DeleteSerializedPacket();
1147}
1148
1149TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1150 if (!GetParam().version_serialization) {
1151 creator_.StopSendingVersion();
1152 }
1153 const size_t max_plaintext_size =
1154 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1155 EXPECT_FALSE(creator_.HasPendingFrames());
1156 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1157 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1158 EXPECT_EQ(max_plaintext_size -
1159 GetPacketHeaderSize(
1160 client_framer_.transport_version(),
1161 creator_.GetDestinationConnectionIdLength(),
1162 creator_.GetSourceConnectionIdLength(),
1163 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1164 !kIncludeDiversificationNonce,
1165 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1166 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1167 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1168 creator_.BytesFree());
1169
1170 // Add a variety of frame types and then a padding frame.
1171 QuicAckFrame ack_frame(InitAckFrame(10u));
1172 EXPECT_TRUE(
1173 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1174 EXPECT_TRUE(creator_.HasPendingFrames());
1175 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1176 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1177
1178 QuicFrame frame;
1179 MakeIOVector("test", &iov_);
1180 ASSERT_TRUE(creator_.ConsumeData(
1181 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1182 1u, iov_.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION, &frame));
1183 size_t consumed = frame.stream_frame.data_length;
1184 EXPECT_EQ(4u, consumed);
1185 EXPECT_TRUE(creator_.HasPendingFrames());
1186 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(
1187 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1188
1189 QuicPaddingFrame padding_frame;
1190 EXPECT_TRUE(
1191 creator_.AddSavedFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
1192 EXPECT_TRUE(creator_.HasPendingFrames());
1193 EXPECT_EQ(0u, creator_.BytesFree());
1194
1195 // Packet is full. Creator will flush.
1196 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1197 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1198 EXPECT_FALSE(
1199 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1200
1201 // Ensure the packet is successfully created.
1202 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1203 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1204 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1205 ASSERT_EQ(1u, retransmittable.size());
1206 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1207 EXPECT_TRUE(serialized_packet_.has_ack);
1208 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1209 DeleteSerializedPacket();
1210
1211 EXPECT_FALSE(creator_.HasPendingFrames());
1212 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1213 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1214 EXPECT_EQ(max_plaintext_size -
1215 GetPacketHeaderSize(
1216 client_framer_.transport_version(),
1217 creator_.GetDestinationConnectionIdLength(),
1218 creator_.GetSourceConnectionIdLength(),
1219 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1220 !kIncludeDiversificationNonce,
1221 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1222 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1223 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1224 creator_.BytesFree());
1225}
1226
1227TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1228 if (!GetParam().version_serialization) {
1229 creator_.StopSendingVersion();
1230 }
1231 EXPECT_FALSE(creator_.HasPendingFrames());
1232
1233 MakeIOVector("test", &iov_);
1234 producer_.SaveStreamData(
1235 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()), &iov_,
1236 1u, 0u, iov_.iov_len);
1237 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1238 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1239 size_t num_bytes_consumed;
1240 creator_.CreateAndSerializeStreamFrame(
1241 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()),
1242 iov_.iov_len, 0, 0, true, NOT_RETRANSMISSION, &num_bytes_consumed);
1243 EXPECT_EQ(4u, num_bytes_consumed);
1244
1245 // Ensure the packet is successfully created.
1246 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1247 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1248 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1249 ASSERT_EQ(1u, retransmittable.size());
1250 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1251 DeleteSerializedPacket();
1252
1253 EXPECT_FALSE(creator_.HasPendingFrames());
1254}
1255
1256TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1257 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1258 if (!IsDefaultTestConfiguration()) {
1259 return;
1260 }
1261
1262 creator_.set_encryption_level(ENCRYPTION_NONE);
1263 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _, _));
1264 QuicStreamFrame stream_frame(
1265 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()),
1266 /*fin=*/false, 0u, QuicStringPiece());
1267 EXPECT_QUIC_BUG(
1268 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
1269 "Cannot send stream data without encryption.");
1270}
1271
1272TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1273 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1274 if (!IsDefaultTestConfiguration()) {
1275 return;
1276 }
1277
1278 CryptoHandshakeMessage message;
1279 message.set_tag(kCHLO);
1280 message.set_minimum_size(kMaxPacketSize);
1281 CryptoFramer framer;
1282 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001283 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001284
1285 struct iovec iov;
1286 MakeIOVector(QuicStringPiece(message_data->data(), message_data->length()),
1287 &iov);
1288 QuicFrame frame;
1289 EXPECT_CALL(delegate_,
1290 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _));
1291 EXPECT_QUIC_BUG(creator_.ConsumeData(QuicUtils::GetCryptoStreamId(
1292 client_framer_.transport_version()),
1293 &iov, 1u, iov.iov_len, 0u, 0u, false,
1294 false, NOT_RETRANSMISSION, &frame),
1295 "Client hello won't fit in a single packet.");
1296}
1297
1298TEST_P(QuicPacketCreatorTest, PendingPadding) {
1299 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1300 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1301 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1302
1303 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1304 .WillRepeatedly(
1305 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1306 // Flush all paddings.
1307 while (creator_.pending_padding_bytes() > 0) {
1308 creator_.Flush();
1309 {
1310 InSequence s;
1311 EXPECT_CALL(framer_visitor_, OnPacket());
1312 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1313 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1314 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1315 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1316 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1317 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1318 }
1319 // Packet only contains padding.
1320 ProcessPacket(serialized_packet_);
1321 }
1322 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1323}
1324
1325TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
1326 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1327 QuicFrame frame;
1328 MakeIOVector("test", &iov_);
1329 ASSERT_TRUE(creator_.ConsumeData(
1330 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1331 1u, iov_.iov_len, 0u, 0u, false,
1332 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1333 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1334 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1335 creator_.Flush();
1336 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1337}
1338
1339TEST_P(QuicPacketCreatorTest, SendPendingPaddingInRetransmission) {
1340 QuicStreamFrame stream_frame(
1341 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1342 /*fin=*/false, 0u, QuicStringPiece());
1343 QuicFrames frames;
1344 frames.push_back(QuicFrame(stream_frame));
1345 char buffer[kMaxPacketSize];
1346 QuicPendingRetransmission retransmission(CreateRetransmission(
1347 frames, true, /*num_padding_bytes=*/0, ENCRYPTION_NONE,
1348 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
1349 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1350 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1351 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1352 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
1353 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1354 {
1355 InSequence s;
1356 EXPECT_CALL(framer_visitor_, OnPacket());
1357 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1358 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1359 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1360 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1361 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1362 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1363 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1364 }
1365 ProcessPacket(serialized_packet_);
1366}
1367
1368TEST_P(QuicPacketCreatorTest, SendPacketAfterFullPaddingRetransmission) {
1369 // Making sure needs_full_padding gets reset after a full padding
1370 // retransmission.
1371 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1372 QuicFrame frame;
1373 MakeIOVector("fake handshake message data", &iov_);
1374 producer_.SaveStreamData(
1375 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1376 1u, 0u, iov_.iov_len);
1377 QuicPacketCreatorPeer::CreateStreamFrame(
1378 &creator_,
1379 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
QUICHE teamf08778a2019-03-14 08:10:26 -07001380 iov_.iov_len, 0u, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001381 QuicFrames frames;
1382 frames.push_back(frame);
1383 char buffer[kMaxPacketSize];
1384 QuicPendingRetransmission retransmission(CreateRetransmission(
1385 frames, true, /*num_padding_bytes=*/-1, ENCRYPTION_NONE,
1386 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
1387 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1388 .WillRepeatedly(
1389 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1390 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
1391 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
1392 {
1393 InSequence s;
1394 EXPECT_CALL(framer_visitor_, OnPacket());
1395 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1396 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1397 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1398 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1399 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1400 // Full padding.
1401 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1402 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1403 }
1404 ProcessPacket(serialized_packet_);
1405
1406 creator_.ConsumeData(
1407 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1408 1u, iov_.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION, &frame);
1409 creator_.Flush();
1410 {
1411 InSequence s;
1412 EXPECT_CALL(framer_visitor_, OnPacket());
1413 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1414 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1415 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1416 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1417 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1418 // needs_full_padding gets reset.
1419 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
1420 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1421 }
1422 ProcessPacket(serialized_packet_);
1423}
1424
1425TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
1426 const QuicByteCount kStreamFramePayloadSize = 100u;
1427 // Set the packet size be enough for one stream frame with 0 stream offset +
1428 // 1.
1429 size_t length =
1430 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1431 GetEncryptionOverhead() +
1432 QuicFramer::GetMinStreamFrameSize(
1433 client_framer_.transport_version(),
1434 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), 0,
1435 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1436 kStreamFramePayloadSize + 1;
1437 creator_.SetMaxPacketLength(length);
1438 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1439 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1440 QuicFrame frame;
1441 char buf[kStreamFramePayloadSize + 1] = {};
1442 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1443 .WillRepeatedly(
1444 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1445 // Send stream frame of size kStreamFramePayloadSize.
1446 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
1447 creator_.ConsumeData(
1448 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1449 1u, iov_.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION, &frame);
1450 creator_.Flush();
1451 // 1 byte padding is sent.
1452 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1453 // Send stream frame of size kStreamFramePayloadSize + 1.
1454 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize + 1), &iov_);
1455 creator_.ConsumeData(
1456 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1457 1u, iov_.iov_len, 0u, kStreamFramePayloadSize, false, false,
1458 NOT_RETRANSMISSION, &frame);
1459 // No padding is sent.
1460 creator_.Flush();
1461 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1462 // Flush all paddings.
1463 while (creator_.pending_padding_bytes() > 0) {
1464 creator_.Flush();
1465 }
1466 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1467}
1468
1469TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
1470 char external_buffer[kMaxPacketSize];
1471 char* expected_buffer = external_buffer;
1472 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1473
1474 QuicFrame frame;
1475 MakeIOVector("test", &iov_);
1476 ASSERT_TRUE(creator_.ConsumeData(
1477 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1478 1u, iov_.iov_len, 0u, 0u, false,
1479 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1480
1481 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1482 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1483 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1484 ClearSerializedPacket(serialized_packet);
1485 }));
1486 creator_.Flush();
1487}
1488
1489// Test for error found in
1490// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1491// length that crosses an IETF VarInt length boundary would cause a
1492// failure. While this test is not applicable to versions other than version 99,
1493// it should still work. Hence, it is not made version-specific.
1494TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1495 QuicAckFrame ack_frame =
1496 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1497 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1498 frames_.push_back(QuicFrame(&ack_frame));
1499 SerializeAllFrames(frames_);
1500}
1501
1502TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
1503 if (client_framer_.transport_version() <= QUIC_VERSION_44) {
1504 return;
1505 }
1506 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1507 .Times(3)
1508 .WillRepeatedly(
1509 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1510 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1511 // Verify that there is enough room for the largest message payload.
1512 EXPECT_TRUE(
1513 creator_.HasRoomForMessageFrame(creator_.GetLargestMessagePayload()));
vasilvvc48c8712019-03-11 13:38:16 -07001514 std::string message(creator_.GetLargestMessagePayload(), 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001515 QuicMessageFrame* message_frame = new QuicMessageFrame(1);
1516 MakeSpan(&allocator_, message, &storage)
1517 .SaveMemSlicesAsMessageData(message_frame);
1518 EXPECT_TRUE(
1519 creator_.AddSavedFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
1520 EXPECT_TRUE(creator_.HasPendingFrames());
1521 creator_.Flush();
1522
1523 QuicMessageFrame* frame2 = new QuicMessageFrame(2);
1524 MakeSpan(&allocator_, "message", &storage).SaveMemSlicesAsMessageData(frame2);
1525 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
1526 EXPECT_TRUE(creator_.HasPendingFrames());
1527 // Verify if a new frame is added, 1 byte message length will be added.
1528 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
1529 QuicMessageFrame* frame3 = new QuicMessageFrame(3);
1530 MakeSpan(&allocator_, "message2", &storage)
1531 .SaveMemSlicesAsMessageData(frame3);
1532 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
1533 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
1534 creator_.Flush();
1535
1536 QuicFrame frame;
1537 MakeIOVector("test", &iov_);
1538 EXPECT_TRUE(creator_.ConsumeData(
1539 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1540 1u, iov_.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION, &frame));
1541 QuicMessageFrame* frame4 = new QuicMessageFrame(4);
1542 MakeSpan(&allocator_, "message", &storage).SaveMemSlicesAsMessageData(frame4);
1543 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
1544 EXPECT_TRUE(creator_.HasPendingFrames());
1545 // Verify there is not enough room for largest payload.
1546 EXPECT_FALSE(
1547 creator_.HasRoomForMessageFrame(creator_.GetLargestMessagePayload()));
1548 // Add largest message will causes the flush of the stream frame.
1549 QuicMessageFrame frame5(5);
1550 MakeSpan(&allocator_, message, &storage).SaveMemSlicesAsMessageData(&frame5);
1551 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
1552 EXPECT_FALSE(creator_.HasPendingFrames());
1553}
1554
1555TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
1556 if (client_framer_.transport_version() <= QUIC_VERSION_44) {
1557 return;
1558 }
vasilvvc48c8712019-03-11 13:38:16 -07001559 std::string message_data(kDefaultMaxPacketSize, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001560 QuicStringPiece message_buffer(message_data);
1561 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1562 // Test all possible size of message frames.
1563 for (size_t message_size = 0;
1564 message_size <= creator_.GetLargestMessagePayload(); ++message_size) {
1565 QuicMessageFrame* frame = new QuicMessageFrame(0);
1566 MakeSpan(&allocator_, QuicStringPiece(message_buffer.data(), message_size),
1567 &storage)
1568 .SaveMemSlicesAsMessageData(frame);
1569 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame), NOT_RETRANSMISSION));
1570 EXPECT_TRUE(creator_.HasPendingFrames());
1571
1572 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1573 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1574 // Verify BytesFree returns bytes available for the next frame, which should
1575 // subtract the message length.
1576 size_t expected_bytes_free =
1577 creator_.GetLargestMessagePayload() - message_size < expansion_bytes
1578 ? 0
1579 : creator_.GetLargestMessagePayload() - expansion_bytes -
1580 message_size;
1581 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1582 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1583 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1584 creator_.Flush();
1585 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1586 DeleteSerializedPacket();
1587 }
1588}
1589
1590TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
1591 creator_.set_can_set_transmission_type(true);
1592 creator_.SetTransmissionType(NOT_RETRANSMISSION);
1593
1594 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1595 QuicFrame ack_frame(&temp_ack_frame);
1596 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1597
1598 QuicFrame stream_frame(QuicStreamFrame(
1599 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1600 /*fin=*/false, 0u, QuicStringPiece()));
1601 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1602
1603 QuicFrame padding_frame{QuicPaddingFrame()};
1604 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1605
1606 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1607 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1608
1609 EXPECT_TRUE(creator_.AddSavedFrame(ack_frame, LOSS_RETRANSMISSION));
1610 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1611
1612 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame, RTO_RETRANSMISSION));
1613 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1614
1615 EXPECT_TRUE(creator_.AddSavedFrame(padding_frame, TLP_RETRANSMISSION));
1616 creator_.Flush();
1617 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1618
1619 if (creator_.ShouldSetTransmissionTypeForNextFrame()) {
1620 // The last retransmittable frame on packet is a stream frame, the packet's
1621 // transmission type should be the same as the stream frame's.
1622 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
1623 } else {
1624 EXPECT_EQ(serialized_packet_.transmission_type, NOT_RETRANSMISSION);
1625 }
1626 DeleteSerializedPacket();
1627}
1628
1629TEST_P(QuicPacketCreatorTest, RetryToken) {
1630 if (!GetParam().version_serialization ||
1631 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1632 return;
1633 }
1634
1635 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1636 9, 10, 11, 12, 13, 14, 15, 16};
1637
1638 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001639 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001640
1641 frames_.push_back(QuicFrame(QuicStreamFrame(
1642 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), false,
1643 0u, QuicStringPiece())));
1644 SerializedPacket serialized = SerializeAllFrames(frames_);
1645
1646 QuicPacketHeader header;
1647 {
1648 InSequence s;
1649 EXPECT_CALL(framer_visitor_, OnPacket());
1650 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1651 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1652 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1653 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1654 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1655 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1656 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1657 }
1658 ProcessPacket(serialized);
1659 ASSERT_TRUE(header.version_flag);
1660 ASSERT_EQ(header.long_packet_type, INITIAL);
1661 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1662 test::CompareCharArraysWithHexError(
1663 "retry token", header.retry_token.data(), header.retry_token.length(),
1664 retry_token_bytes, sizeof(retry_token_bytes));
1665}
1666
1667} // namespace
1668} // namespace test
1669} // namespace quic