blob: f6d4f5f872eb871b0b7d4e1cd56c96bde1af084e [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) {
fkastenholze9d71a82019-04-09 05:12:13 -0700562 QuicConnectionCloseFrame frame(QUIC_NO_ERROR, "error");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500563
564 QuicFrames frames;
565 frames.push_back(QuicFrame(&frame));
566 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700567 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500568 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
569 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
570
571 InSequence s;
572 EXPECT_CALL(framer_visitor_, OnPacket());
573 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
574 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
575 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
576 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
577 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
578 EXPECT_CALL(framer_visitor_, OnPacketComplete());
579
580 ProcessPacket(serialized);
581}
582
583TEST_P(QuicPacketCreatorTest, ConsumeCryptoData) {
vasilvvc48c8712019-03-11 13:38:16 -0700584 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500585 QuicFrame frame;
QUICHE team6987b4a2019-03-15 16:23:04 -0700586 ASSERT_TRUE(creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data.length(), 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500587 NOT_RETRANSMISSION, &frame));
588 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
589 EXPECT_TRUE(creator_.HasPendingFrames());
590}
591
592TEST_P(QuicPacketCreatorTest, ConsumeData) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700593 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500594 QuicFrame frame;
595 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700596 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
597 client_framer_.transport_version(), Perspective::IS_CLIENT);
598 ASSERT_TRUE(creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u,
599 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500600 size_t consumed = frame.stream_frame.data_length;
601 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700602 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500603 EXPECT_TRUE(creator_.HasPendingFrames());
604}
605
606TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700607 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500608 QuicFrame frame;
609 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700610 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
611 client_framer_.transport_version(), Perspective::IS_CLIENT);
612 ASSERT_TRUE(creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u,
613 true, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500614 size_t consumed = frame.stream_frame.data_length;
615 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700616 CheckStreamFrame(frame, stream_id, "test", 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500617 EXPECT_TRUE(creator_.HasPendingFrames());
618}
619
620TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700621 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500622 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700623 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
624 client_framer_.transport_version(), Perspective::IS_CLIENT);
625 ASSERT_TRUE(creator_.ConsumeData(stream_id, nullptr, 0u, 0u, 0u, 0u, true,
626 false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500627 size_t consumed = frame.stream_frame.data_length;
628 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700629 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500630 EXPECT_TRUE(creator_.HasPendingFrames());
631}
632
633TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
634 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
635 const size_t overhead =
636 GetPacketHeaderOverhead(client_framer_.transport_version()) +
637 GetEncryptionOverhead();
638 for (size_t i = overhead; i < overhead + 100; ++i) {
639 creator_.SetMaxPacketLength(i);
640 const bool should_have_room =
641 i >
642 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
643 ASSERT_EQ(should_have_room,
644 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
645 kOffset, /* data_size=*/0xffff));
646 if (should_have_room) {
647 QuicFrame frame;
648 MakeIOVector("testdata", &iov_);
649 EXPECT_CALL(delegate_, OnSerializedPacket(_))
650 .WillRepeatedly(Invoke(
651 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
652 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
653 1u, iov_.iov_len, 0u, kOffset, false,
654 false, NOT_RETRANSMISSION, &frame));
655 size_t bytes_consumed = frame.stream_frame.data_length;
656 EXPECT_LT(0u, bytes_consumed);
657 creator_.Flush();
658 }
659 }
660}
661
662TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
663 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
664 // Compute the total overhead for a single frame in packet.
665 const size_t overhead =
666 GetPacketHeaderOverhead(client_framer_.transport_version()) +
667 GetEncryptionOverhead() +
668 GetStreamFrameOverhead(client_framer_.transport_version());
669 size_t capacity = kDefaultMaxPacketSize - overhead;
670 // Now, test various sizes around this size.
671 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700672 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500673 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
674 QuicFrame frame;
675 MakeIOVector(data, &iov_);
676 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
677 1u, iov_.iov_len, 0u, kOffset, false,
678 false, NOT_RETRANSMISSION, &frame));
679
680 // BytesFree() returns bytes available for the next frame, which will
681 // be two bytes smaller since the stream frame would need to be grown.
682 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
683 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
684 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
685 EXPECT_CALL(delegate_, OnSerializedPacket(_))
686 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
687 creator_.Flush();
688 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
689 DeleteSerializedPacket();
690 }
691}
692
693TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700694 // This test serializes crypto payloads slightly larger than a packet, which
695 // Causes the multi-packet ClientHello check to fail.
696 FLAGS_quic_enforce_single_packet_chlo = false;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500697 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700698 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500699 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700700 GetEncryptionOverhead();
701 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
702 overhead += QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxPacketSize);
703 } else {
704 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
705 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500706 ASSERT_GT(kMaxPacketSize, overhead);
707 size_t capacity = kDefaultMaxPacketSize - overhead;
708 // Now, test various sizes around this size.
709 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700710 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700711 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500712 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
713
714 QuicFrame frame;
715 MakeIOVector(data, &iov_);
716 EXPECT_CALL(delegate_, OnSerializedPacket(_))
717 .WillRepeatedly(
718 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700719 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
720 ASSERT_TRUE(creator_.ConsumeData(
721 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
722 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
723 &frame));
724 size_t bytes_consumed = frame.stream_frame.data_length;
725 EXPECT_LT(0u, bytes_consumed);
726 } else {
727 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
728 ASSERT_TRUE(creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data.length(),
729 kOffset, NOT_RETRANSMISSION,
730 &frame));
731 size_t bytes_consumed = frame.crypto_frame->data_length;
732 EXPECT_LT(0u, bytes_consumed);
733 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500734 creator_.Flush();
735 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
736 // If there is not enough space in the packet to fit a padding frame
737 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
738 // will not be padded.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700739 if (bytes_free < 3 &&
740 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500741 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
742 serialized_packet_.encrypted_length);
743 } else {
744 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
745 }
746 DeleteSerializedPacket();
747 }
748}
749
750TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
751 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
752 // Compute the total overhead for a single frame in packet.
753 const size_t overhead =
754 GetPacketHeaderOverhead(client_framer_.transport_version()) +
755 GetEncryptionOverhead() +
756 GetStreamFrameOverhead(client_framer_.transport_version());
757 ASSERT_GT(kDefaultMaxPacketSize, overhead);
758 size_t capacity = kDefaultMaxPacketSize - overhead;
759 // Now, test various sizes around this size.
760 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700761 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500762 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
763
764 QuicFrame frame;
765 MakeIOVector(data, &iov_);
766 EXPECT_CALL(delegate_, OnSerializedPacket(_))
767 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
768 ASSERT_TRUE(creator_.ConsumeData(GetNthClientInitiatedStreamId(1), &iov_,
769 1u, iov_.iov_len, 0u, kOffset, false,
770 false, NOT_RETRANSMISSION, &frame));
771 size_t bytes_consumed = frame.stream_frame.data_length;
772 EXPECT_LT(0u, bytes_consumed);
773 creator_.Flush();
774 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
775 if (bytes_free > 0) {
776 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
777 serialized_packet_.encrypted_length);
778 } else {
779 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
780 }
781 DeleteSerializedPacket();
782 }
783}
784
785TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
786 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
787 ParsedQuicVersionVector versions;
788 versions.push_back(test::QuicVersionMax());
789 const bool ietf_quic = GetParam().version.transport_version > QUIC_VERSION_43;
790 std::unique_ptr<QuicEncryptedPacket> encrypted(
791 creator_.SerializeVersionNegotiationPacket(ietf_quic, versions));
792
793 {
794 InSequence s;
795 EXPECT_CALL(framer_visitor_, OnPacket());
796 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
797 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
798 }
799 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
800 client_framer_.ProcessPacket(*encrypted);
801}
802
803TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700804 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500805 EncryptionLevel level = static_cast<EncryptionLevel>(i);
806
807 creator_.set_encryption_level(level);
808
809 OwningSerializedPacketPointer encrypted;
810 if (GetParam().version.transport_version == QUIC_VERSION_99) {
811 QuicPathFrameBuffer payload = {
812 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
813 encrypted =
814 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
815 } else {
816 encrypted = creator_.SerializeConnectivityProbingPacket();
817 }
818 {
819 InSequence s;
820 EXPECT_CALL(framer_visitor_, OnPacket());
821 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
822 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
823 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
824 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
825 if (GetParam().version.transport_version == QUIC_VERSION_99) {
826 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
827 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
828 } else {
829 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
830 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
831 }
832 EXPECT_CALL(framer_visitor_, OnPacketComplete());
833 }
834 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
835 server_framer_.ProcessPacket(QuicEncryptedPacket(
836 encrypted->encrypted_buffer, encrypted->encrypted_length));
837 }
838}
839
840TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
841 if (GetParam().version.transport_version != QUIC_VERSION_99) {
842 return;
843 }
844 QuicPathFrameBuffer payload = {
845 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
846
QUICHE team6987b4a2019-03-15 16:23:04 -0700847 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500848 EncryptionLevel level = static_cast<EncryptionLevel>(i);
849
850 creator_.set_encryption_level(level);
851
852 OwningSerializedPacketPointer encrypted(
853 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
854 {
855 InSequence s;
856 EXPECT_CALL(framer_visitor_, OnPacket());
857 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
858 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
859 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
860 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
861 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
862 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
863 EXPECT_CALL(framer_visitor_, OnPacketComplete());
864 }
865 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
866 server_framer_.ProcessPacket(QuicEncryptedPacket(
867 encrypted->encrypted_buffer, encrypted->encrypted_length));
868 }
869}
870
871TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
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
QUICHE team6987b4a2019-03-15 16:23:04 -0700878 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500879 EncryptionLevel level = static_cast<EncryptionLevel>(i);
880 creator_.set_encryption_level(level);
881
882 QuicDeque<QuicPathFrameBuffer> payloads;
883 payloads.push_back(payload0);
884
885 OwningSerializedPacketPointer encrypted(
886 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
887 true));
888 {
889 InSequence s;
890 EXPECT_CALL(framer_visitor_, OnPacket());
891 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
892 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
893 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
894 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
895 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
896 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
897 EXPECT_CALL(framer_visitor_, OnPacketComplete());
898 }
899 server_framer_.ProcessPacket(QuicEncryptedPacket(
900 encrypted->encrypted_buffer, encrypted->encrypted_length));
901 }
902}
903
904TEST_P(QuicPacketCreatorTest,
905 SerializePathResponseProbePacket1PayloadUnPadded) {
906 if (GetParam().version.transport_version != QUIC_VERSION_99) {
907 return;
908 }
909 QuicPathFrameBuffer payload0 = {
910 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
911
QUICHE team6987b4a2019-03-15 16:23:04 -0700912 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500913 EncryptionLevel level = static_cast<EncryptionLevel>(i);
914 creator_.set_encryption_level(level);
915
916 QuicDeque<QuicPathFrameBuffer> payloads;
917 payloads.push_back(payload0);
918
919 OwningSerializedPacketPointer encrypted(
920 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
921 false));
922 {
923 InSequence s;
924 EXPECT_CALL(framer_visitor_, OnPacket());
925 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
926 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
927 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
928 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
929 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
930 EXPECT_CALL(framer_visitor_, OnPacketComplete());
931 }
932 server_framer_.ProcessPacket(QuicEncryptedPacket(
933 encrypted->encrypted_buffer, encrypted->encrypted_length));
934 }
935}
936
937TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
938 if (GetParam().version.transport_version != QUIC_VERSION_99) {
939 return;
940 }
941 QuicPathFrameBuffer payload0 = {
942 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
943 QuicPathFrameBuffer payload1 = {
944 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
945
QUICHE team6987b4a2019-03-15 16:23:04 -0700946 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500947 EncryptionLevel level = static_cast<EncryptionLevel>(i);
948 creator_.set_encryption_level(level);
949
950 QuicDeque<QuicPathFrameBuffer> payloads;
951 payloads.push_back(payload0);
952 payloads.push_back(payload1);
953
954 OwningSerializedPacketPointer encrypted(
955 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
956 true));
957 {
958 InSequence s;
959 EXPECT_CALL(framer_visitor_, OnPacket());
960 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
961 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
962 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
963 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
964 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
965 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
966 EXPECT_CALL(framer_visitor_, OnPacketComplete());
967 }
968 server_framer_.ProcessPacket(QuicEncryptedPacket(
969 encrypted->encrypted_buffer, encrypted->encrypted_length));
970 }
971}
972
973TEST_P(QuicPacketCreatorTest,
974 SerializePathResponseProbePacket2PayloadsUnPadded) {
975 if (GetParam().version.transport_version != QUIC_VERSION_99) {
976 return;
977 }
978 QuicPathFrameBuffer payload0 = {
979 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
980 QuicPathFrameBuffer payload1 = {
981 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
982
QUICHE team6987b4a2019-03-15 16:23:04 -0700983 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500984 EncryptionLevel level = static_cast<EncryptionLevel>(i);
985 creator_.set_encryption_level(level);
986
987 QuicDeque<QuicPathFrameBuffer> payloads;
988 payloads.push_back(payload0);
989 payloads.push_back(payload1);
990
991 OwningSerializedPacketPointer encrypted(
992 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
993 false));
994 {
995 InSequence s;
996 EXPECT_CALL(framer_visitor_, OnPacket());
997 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
998 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
999 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1000 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1001 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1002 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1003 }
1004 server_framer_.ProcessPacket(QuicEncryptedPacket(
1005 encrypted->encrypted_buffer, encrypted->encrypted_length));
1006 }
1007}
1008
1009TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
1010 if (GetParam().version.transport_version != QUIC_VERSION_99) {
1011 return;
1012 }
1013 QuicPathFrameBuffer payload0 = {
1014 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1015 QuicPathFrameBuffer payload1 = {
1016 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1017 QuicPathFrameBuffer payload2 = {
1018 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1019
QUICHE team6987b4a2019-03-15 16:23:04 -07001020 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001021 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1022 creator_.set_encryption_level(level);
1023
1024 QuicDeque<QuicPathFrameBuffer> payloads;
1025 payloads.push_back(payload0);
1026 payloads.push_back(payload1);
1027 payloads.push_back(payload2);
1028
1029 OwningSerializedPacketPointer encrypted(
1030 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1031 true));
1032 {
1033 InSequence s;
1034 EXPECT_CALL(framer_visitor_, OnPacket());
1035 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1036 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1037 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1038 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1039 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1040 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1041 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1042 }
1043 server_framer_.ProcessPacket(QuicEncryptedPacket(
1044 encrypted->encrypted_buffer, encrypted->encrypted_length));
1045 }
1046}
1047
1048TEST_P(QuicPacketCreatorTest,
1049 SerializePathResponseProbePacket3PayloadsUnpadded) {
1050 if (GetParam().version.transport_version != QUIC_VERSION_99) {
1051 return;
1052 }
1053 QuicPathFrameBuffer payload0 = {
1054 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1055 QuicPathFrameBuffer payload1 = {
1056 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1057 QuicPathFrameBuffer payload2 = {
1058 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1059
QUICHE team6987b4a2019-03-15 16:23:04 -07001060 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001061 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1062 creator_.set_encryption_level(level);
1063
1064 QuicDeque<QuicPathFrameBuffer> payloads;
1065 payloads.push_back(payload0);
1066 payloads.push_back(payload1);
1067 payloads.push_back(payload2);
1068
1069 OwningSerializedPacketPointer encrypted(
1070 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1071 false));
1072 InSequence s;
1073 EXPECT_CALL(framer_visitor_, OnPacket());
1074 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1075 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1076 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1077 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1078 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1079 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1080
1081 server_framer_.ProcessPacket(QuicEncryptedPacket(
1082 encrypted->encrypted_buffer, encrypted->encrypted_length));
1083 }
1084}
1085
1086TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
1087 if (GetParam().version.transport_version > QUIC_VERSION_43 &&
1088 GetParam().version.transport_version != QUIC_VERSION_99) {
1089 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1090 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1091 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1092 } else {
1093 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1094 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1095 }
1096
1097 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1098 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1099 10000 / kDefaultMaxPacketSize);
1100 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1101 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1102
1103 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1104 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1105 10000 / kDefaultMaxPacketSize);
1106 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1107 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1108
1109 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1110 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1111 10000 / kDefaultMaxPacketSize);
1112 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1113 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1114
1115 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1116 UINT64_C(64) * 256 * 256 * 256 * 256);
1117 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1118 10000 / kDefaultMaxPacketSize);
1119 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1120 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1121}
1122
1123TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1124 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
1125 if (GetParam().version.transport_version > QUIC_VERSION_43 &&
1126 GetParam().version.transport_version != QUIC_VERSION_99) {
1127 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1128 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1129 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1130 } else {
1131 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1132 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1133 }
1134
1135 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1136 10000 / kDefaultMaxPacketSize);
1137 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1138 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1139
1140 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1141 10000 * 256 / kDefaultMaxPacketSize);
1142 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1143 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1144
1145 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1146 10000 * 256 * 256 / kDefaultMaxPacketSize);
1147 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1148 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1149
1150 creator_.UpdatePacketNumberLength(
1151 QuicPacketNumber(1),
1152 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1153 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1154 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1155}
1156
1157TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1158 if (!GetParam().version_serialization) {
1159 creator_.StopSendingVersion();
1160 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001161 std::string data("a");
1162 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1163 QuicStreamFrame stream_frame(
1164 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1165 /*fin=*/false, 0u, QuicStringPiece());
1166 frames_.push_back(QuicFrame(stream_frame));
1167 } else {
1168 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1169 frames_.push_back(
1170 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1171 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001172 SerializedPacket serialized = SerializeAllFrames(frames_);
1173
1174 QuicPacketHeader header;
1175 {
1176 InSequence s;
1177 EXPECT_CALL(framer_visitor_, OnPacket());
1178 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1179 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1180 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1181 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1182 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001183 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1184 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1185 } else {
1186 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1187 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001188 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1189 }
1190 ProcessPacket(serialized);
1191 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001192 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001193}
1194
1195TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1196 if (!GetParam().version_serialization) {
1197 creator_.StopSendingVersion();
1198 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001199 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001200 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001201 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001202 size_t payload_length = creator_.max_packet_length();
1203 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001204 MakeIOVector(too_long_payload, &iov_);
1205 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1206 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001207 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1208 client_framer_.transport_version(), Perspective::IS_CLIENT);
1209 ASSERT_TRUE(creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u,
1210 true, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001211 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001212 // The entire payload could not be consumed.
1213 EXPECT_GT(payload_length, consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001214 creator_.Flush();
1215 DeleteSerializedPacket();
1216}
1217
1218TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1219 if (!GetParam().version_serialization) {
1220 creator_.StopSendingVersion();
1221 }
1222 const size_t max_plaintext_size =
1223 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1224 EXPECT_FALSE(creator_.HasPendingFrames());
1225 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1226 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1227 EXPECT_EQ(max_plaintext_size -
1228 GetPacketHeaderSize(
1229 client_framer_.transport_version(),
1230 creator_.GetDestinationConnectionIdLength(),
1231 creator_.GetSourceConnectionIdLength(),
1232 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1233 !kIncludeDiversificationNonce,
1234 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1235 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1236 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1237 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001238 StrictMock<MockDebugDelegate> debug;
1239 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001240
1241 // Add a variety of frame types and then a padding frame.
1242 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001243 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001244 EXPECT_TRUE(
1245 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1246 EXPECT_TRUE(creator_.HasPendingFrames());
1247 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1248 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1249
1250 QuicFrame frame;
1251 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001252 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001253 ASSERT_TRUE(creator_.ConsumeData(
1254 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
1255 1u, iov_.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION, &frame));
1256 size_t consumed = frame.stream_frame.data_length;
1257 EXPECT_EQ(4u, consumed);
1258 EXPECT_TRUE(creator_.HasPendingFrames());
1259 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(
1260 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1261
1262 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001263 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001264 EXPECT_TRUE(
1265 creator_.AddSavedFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
1266 EXPECT_TRUE(creator_.HasPendingFrames());
1267 EXPECT_EQ(0u, creator_.BytesFree());
1268
1269 // Packet is full. Creator will flush.
1270 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1271 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1272 EXPECT_FALSE(
1273 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1274
1275 // Ensure the packet is successfully created.
1276 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1277 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1278 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1279 ASSERT_EQ(1u, retransmittable.size());
1280 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1281 EXPECT_TRUE(serialized_packet_.has_ack);
1282 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1283 DeleteSerializedPacket();
1284
1285 EXPECT_FALSE(creator_.HasPendingFrames());
1286 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(
1287 QuicUtils::GetCryptoStreamId(client_framer_.transport_version())));
1288 EXPECT_EQ(max_plaintext_size -
1289 GetPacketHeaderSize(
1290 client_framer_.transport_version(),
1291 creator_.GetDestinationConnectionIdLength(),
1292 creator_.GetSourceConnectionIdLength(),
1293 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1294 !kIncludeDiversificationNonce,
1295 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1296 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1297 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1298 creator_.BytesFree());
1299}
1300
1301TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1302 if (!GetParam().version_serialization) {
1303 creator_.StopSendingVersion();
1304 }
1305 EXPECT_FALSE(creator_.HasPendingFrames());
1306
1307 MakeIOVector("test", &iov_);
1308 producer_.SaveStreamData(
1309 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()), &iov_,
1310 1u, 0u, iov_.iov_len);
1311 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1312 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1313 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001314 StrictMock<MockDebugDelegate> debug;
1315 creator_.set_debug_delegate(&debug);
1316 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001317 creator_.CreateAndSerializeStreamFrame(
1318 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()),
1319 iov_.iov_len, 0, 0, true, NOT_RETRANSMISSION, &num_bytes_consumed);
1320 EXPECT_EQ(4u, num_bytes_consumed);
1321
1322 // Ensure the packet is successfully created.
1323 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1324 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1325 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1326 ASSERT_EQ(1u, retransmittable.size());
1327 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1328 DeleteSerializedPacket();
1329
1330 EXPECT_FALSE(creator_.HasPendingFrames());
1331}
1332
1333TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1334 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1335 if (!IsDefaultTestConfiguration()) {
1336 return;
1337 }
1338
QUICHE team6987b4a2019-03-15 16:23:04 -07001339 creator_.set_encryption_level(ENCRYPTION_INITIAL);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001340 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _, _));
1341 QuicStreamFrame stream_frame(
1342 QuicUtils::GetHeadersStreamId(client_framer_.transport_version()),
1343 /*fin=*/false, 0u, QuicStringPiece());
1344 EXPECT_QUIC_BUG(
1345 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
1346 "Cannot send stream data without encryption.");
1347}
1348
1349TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1350 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1351 if (!IsDefaultTestConfiguration()) {
1352 return;
1353 }
1354
QUICHE teamdc41bf12019-03-20 12:58:42 -07001355 // This test only matters when the crypto handshake is sent in stream frames.
1356 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1357 // frames.
1358 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1359 return;
1360 }
1361
QUICHE teama6ef0a62019-03-07 20:34:33 -05001362 CryptoHandshakeMessage message;
1363 message.set_tag(kCHLO);
1364 message.set_minimum_size(kMaxPacketSize);
1365 CryptoFramer framer;
1366 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001367 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001368
1369 struct iovec iov;
1370 MakeIOVector(QuicStringPiece(message_data->data(), message_data->length()),
1371 &iov);
1372 QuicFrame frame;
1373 EXPECT_CALL(delegate_,
1374 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _));
1375 EXPECT_QUIC_BUG(creator_.ConsumeData(QuicUtils::GetCryptoStreamId(
1376 client_framer_.transport_version()),
1377 &iov, 1u, iov.iov_len, 0u, 0u, false,
1378 false, NOT_RETRANSMISSION, &frame),
1379 "Client hello won't fit in a single packet.");
1380}
1381
1382TEST_P(QuicPacketCreatorTest, PendingPadding) {
1383 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1384 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1385 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1386
1387 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1388 .WillRepeatedly(
1389 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1390 // Flush all paddings.
1391 while (creator_.pending_padding_bytes() > 0) {
1392 creator_.Flush();
1393 {
1394 InSequence s;
1395 EXPECT_CALL(framer_visitor_, OnPacket());
1396 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1397 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1398 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1399 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1400 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1401 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1402 }
1403 // Packet only contains padding.
1404 ProcessPacket(serialized_packet_);
1405 }
1406 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1407}
1408
1409TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001410 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001411 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1412 QuicFrame frame;
1413 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001414 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1415 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001416 ASSERT_TRUE(creator_.ConsumeData(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001417 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001418 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1419 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1420 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1421 creator_.Flush();
1422 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1423}
1424
1425TEST_P(QuicPacketCreatorTest, SendPendingPaddingInRetransmission) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001426 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1427 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1428 client_framer_.transport_version(), Perspective::IS_CLIENT);
1429 QuicStreamFrame stream_frame(stream_id,
1430 /*fin=*/false, 0u, QuicStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001431 QuicFrames frames;
1432 frames.push_back(QuicFrame(stream_frame));
1433 char buffer[kMaxPacketSize];
1434 QuicPendingRetransmission retransmission(CreateRetransmission(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001435 frames, true, /*num_padding_bytes=*/0, ENCRYPTION_FORWARD_SECURE,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001436 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
1437 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1438 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1439 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1440 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
1441 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1442 {
1443 InSequence s;
1444 EXPECT_CALL(framer_visitor_, OnPacket());
1445 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1446 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1447 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1448 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1449 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1450 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1451 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1452 }
1453 ProcessPacket(serialized_packet_);
1454}
1455
1456TEST_P(QuicPacketCreatorTest, SendPacketAfterFullPaddingRetransmission) {
1457 // Making sure needs_full_padding gets reset after a full padding
1458 // retransmission.
1459 EXPECT_EQ(0u, creator_.pending_padding_bytes());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001460 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001461 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -07001462 std::string data = "fake handshake message data";
1463 MakeIOVector(data, &iov_);
1464 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1465 client_framer_.transport_version(), Perspective::IS_CLIENT);
1466 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1467 stream_id =
1468 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1469 }
1470 producer_.SaveStreamData(stream_id, &iov_, 1u, 0u, iov_.iov_len);
1471 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, stream_id, iov_.iov_len,
1472 0u, false, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001473 QuicFrames frames;
1474 frames.push_back(frame);
1475 char buffer[kMaxPacketSize];
1476 QuicPendingRetransmission retransmission(CreateRetransmission(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001477 frames, true, /*num_padding_bytes=*/-1, ENCRYPTION_FORWARD_SECURE,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001478 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
1479 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1480 .WillRepeatedly(
1481 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1482 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
1483 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
1484 {
1485 InSequence s;
1486 EXPECT_CALL(framer_visitor_, OnPacket());
1487 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1488 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1489 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1490 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1491 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1492 // Full padding.
1493 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1494 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1495 }
1496 ProcessPacket(serialized_packet_);
1497
QUICHE teamdc41bf12019-03-20 12:58:42 -07001498 creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1499 NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001500 creator_.Flush();
1501 {
1502 InSequence s;
1503 EXPECT_CALL(framer_visitor_, OnPacket());
1504 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1505 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1506 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1507 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1508 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1509 // needs_full_padding gets reset.
1510 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
1511 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1512 }
1513 ProcessPacket(serialized_packet_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001514 DeleteFrames(&frames);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001515}
1516
1517TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001518 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001519 const QuicByteCount kStreamFramePayloadSize = 100u;
1520 // Set the packet size be enough for one stream frame with 0 stream offset +
1521 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001522 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1523 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001524 size_t length =
1525 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1526 GetEncryptionOverhead() +
1527 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001528 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001529 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1530 kStreamFramePayloadSize + 1;
1531 creator_.SetMaxPacketLength(length);
1532 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1533 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1534 QuicFrame frame;
1535 char buf[kStreamFramePayloadSize + 1] = {};
1536 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1537 .WillRepeatedly(
1538 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1539 // Send stream frame of size kStreamFramePayloadSize.
1540 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001541 creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1542 NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001543 creator_.Flush();
1544 // 1 byte padding is sent.
1545 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1546 // Send stream frame of size kStreamFramePayloadSize + 1.
1547 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize + 1), &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001548 creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u,
1549 kStreamFramePayloadSize, false, false,
1550 NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001551 // No padding is sent.
1552 creator_.Flush();
1553 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1554 // Flush all paddings.
1555 while (creator_.pending_padding_bytes() > 0) {
1556 creator_.Flush();
1557 }
1558 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1559}
1560
1561TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001562 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001563 char external_buffer[kMaxPacketSize];
1564 char* expected_buffer = external_buffer;
1565 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1566
1567 QuicFrame frame;
1568 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001569 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1570 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001571 ASSERT_TRUE(creator_.ConsumeData(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001572 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001573 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1574
1575 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1576 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1577 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1578 ClearSerializedPacket(serialized_packet);
1579 }));
1580 creator_.Flush();
1581}
1582
1583// Test for error found in
1584// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1585// length that crosses an IETF VarInt length boundary would cause a
1586// failure. While this test is not applicable to versions other than version 99,
1587// it should still work. Hence, it is not made version-specific.
1588TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1589 QuicAckFrame ack_frame =
1590 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1591 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1592 frames_.push_back(QuicFrame(&ack_frame));
1593 SerializeAllFrames(frames_);
1594}
1595
1596TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
1597 if (client_framer_.transport_version() <= QUIC_VERSION_44) {
1598 return;
1599 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001600 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001601 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1602 .Times(3)
1603 .WillRepeatedly(
1604 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1605 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1606 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001607 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1608 creator_.GetCurrentLargestMessagePayload()));
1609 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001610 QuicMessageFrame* message_frame =
1611 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001612 EXPECT_TRUE(
1613 creator_.AddSavedFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
1614 EXPECT_TRUE(creator_.HasPendingFrames());
1615 creator_.Flush();
1616
wub553a9662019-03-28 20:13:23 -07001617 QuicMessageFrame* frame2 =
1618 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001619 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
1620 EXPECT_TRUE(creator_.HasPendingFrames());
1621 // Verify if a new frame is added, 1 byte message length will be added.
1622 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001623 QuicMessageFrame* frame3 =
1624 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001625 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
1626 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
1627 creator_.Flush();
1628
1629 QuicFrame frame;
1630 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001631 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1632 client_framer_.transport_version(), Perspective::IS_CLIENT);
1633 EXPECT_TRUE(creator_.ConsumeData(stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u,
1634 false, false, NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001635 QuicMessageFrame* frame4 =
1636 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001637 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
1638 EXPECT_TRUE(creator_.HasPendingFrames());
1639 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001640 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1641 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001642 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001643 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001644 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
1645 EXPECT_FALSE(creator_.HasPendingFrames());
1646}
1647
1648TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
1649 if (client_framer_.transport_version() <= QUIC_VERSION_44) {
1650 return;
1651 }
vasilvvc48c8712019-03-11 13:38:16 -07001652 std::string message_data(kDefaultMaxPacketSize, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001653 QuicStringPiece message_buffer(message_data);
1654 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001655 // Test all possible encryption levels of message frames.
1656 for (EncryptionLevel level :
1657 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1658 creator_.set_encryption_level(level);
1659 // Test all possible sizes of message frames.
1660 for (size_t message_size = 0;
1661 message_size <= creator_.GetCurrentLargestMessagePayload();
1662 ++message_size) {
1663 QuicMessageFrame* frame = new QuicMessageFrame(
1664 0, MakeSpan(&allocator_,
1665 QuicStringPiece(message_buffer.data(), message_size),
1666 &storage));
1667 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame), NOT_RETRANSMISSION));
1668 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001669
ianswettb239f862019-04-05 09:15:06 -07001670 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1671 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1672 // Verify BytesFree returns bytes available for the next frame, which
1673 // should subtract the message length.
1674 size_t expected_bytes_free =
1675 creator_.GetCurrentLargestMessagePayload() - message_size <
1676 expansion_bytes
1677 ? 0
1678 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1679 message_size;
1680 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1681 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1682 creator_.GetCurrentLargestMessagePayload());
1683 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1684 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1685 creator_.Flush();
1686 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1687 DeleteSerializedPacket();
1688 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001689 }
1690}
1691
1692TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001693 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001694 creator_.set_can_set_transmission_type(true);
1695 creator_.SetTransmissionType(NOT_RETRANSMISSION);
1696
1697 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1698 QuicFrame ack_frame(&temp_ack_frame);
1699 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1700
QUICHE teamdc41bf12019-03-20 12:58:42 -07001701 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1702 client_framer_.transport_version(), Perspective::IS_CLIENT);
1703 QuicFrame stream_frame(QuicStreamFrame(stream_id,
1704 /*fin=*/false, 0u, QuicStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001705 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1706
1707 QuicFrame padding_frame{QuicPaddingFrame()};
1708 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1709
1710 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1711 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1712
1713 EXPECT_TRUE(creator_.AddSavedFrame(ack_frame, LOSS_RETRANSMISSION));
1714 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1715
1716 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame, RTO_RETRANSMISSION));
1717 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1718
1719 EXPECT_TRUE(creator_.AddSavedFrame(padding_frame, TLP_RETRANSMISSION));
1720 creator_.Flush();
1721 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1722
1723 if (creator_.ShouldSetTransmissionTypeForNextFrame()) {
1724 // The last retransmittable frame on packet is a stream frame, the packet's
1725 // transmission type should be the same as the stream frame's.
1726 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
1727 } else {
1728 EXPECT_EQ(serialized_packet_.transmission_type, NOT_RETRANSMISSION);
1729 }
1730 DeleteSerializedPacket();
1731}
1732
1733TEST_P(QuicPacketCreatorTest, RetryToken) {
1734 if (!GetParam().version_serialization ||
1735 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1736 return;
1737 }
1738
1739 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1740 9, 10, 11, 12, 13, 14, 15, 16};
1741
1742 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001743 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001744
QUICHE teamdc41bf12019-03-20 12:58:42 -07001745 std::string data("a");
1746 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1747 QuicStreamFrame stream_frame(
1748 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1749 /*fin=*/false, 0u, QuicStringPiece());
1750 frames_.push_back(QuicFrame(stream_frame));
1751 } else {
1752 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1753 frames_.push_back(
1754 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1755 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001756 SerializedPacket serialized = SerializeAllFrames(frames_);
1757
1758 QuicPacketHeader header;
1759 {
1760 InSequence s;
1761 EXPECT_CALL(framer_visitor_, OnPacket());
1762 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1763 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1764 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1765 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1766 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001767 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1768 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1769 } else {
1770 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1771 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001772 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1773 }
1774 ProcessPacket(serialized);
1775 ASSERT_TRUE(header.version_flag);
1776 ASSERT_EQ(header.long_packet_type, INITIAL);
1777 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1778 test::CompareCharArraysWithHexError(
1779 "retry token", header.retry_token.data(), header.retry_token.length(),
1780 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001781 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001782}
1783
1784} // namespace
1785} // namespace test
1786} // namespace quic