blob: 4efcbfebc5746cc5952050240ec02257aed08148 [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>
bnc463f2352019-10-10 04:49:34 -070011#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -050012
zhongyi546cc452019-04-12 15:27:49 -070013#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050014#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
15#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
renjietangdbe98342019-10-18 11:00:57 -070017#include "net/third_party/quiche/src/quic/core/frames/quic_stream_frame.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050018#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050019#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
20#include "net/third_party/quiche/src/quic/core/quic_types.h"
21#include "net/third_party/quiche/src/quic/core/quic_utils.h"
renjietang4c704c82019-10-07 16:39:11 -070022#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050023#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
renjietangdbe98342019-10-18 11:00:57 -070024#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
fayang08750832019-10-24 11:25:34 -070025#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050026#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050027#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
28#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
29#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
30#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
31#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
32#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
33
34using testing::_;
35using testing::DoAll;
36using testing::InSequence;
37using testing::Invoke;
38using testing::Return;
39using testing::SaveArg;
40using testing::StrictMock;
41
42namespace quic {
43namespace test {
44namespace {
45
renjietang4c704c82019-10-07 16:39:11 -070046const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
47// Use fields in which each byte is distinct to ensure that every byte is
48// framed correctly. The values are otherwise arbitrary.
dschinazi423adc72019-10-23 09:58:55 -070049QuicConnectionId CreateTestConnectionId() {
50 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
51}
renjietang4c704c82019-10-07 16:39:11 -070052
QUICHE teama6ef0a62019-03-07 20:34:33 -050053// Run tests with combinations of {ParsedQuicVersion,
54// ToggleVersionSerialization}.
55struct TestParams {
56 TestParams(ParsedQuicVersion version, bool version_serialization)
57 : version(version), version_serialization(version_serialization) {}
58
QUICHE teama6ef0a62019-03-07 20:34:33 -050059 ParsedQuicVersion version;
60 bool version_serialization;
61};
62
dschinazi142051a2019-09-18 18:17:29 -070063// Used by ::testing::PrintToStringParamName().
64std::string PrintToString(const TestParams& p) {
65 return QuicStrCat(ParsedQuicVersionToString(p.version), "_",
66 (p.version_serialization ? "Include" : "No"), "Version");
67}
68
QUICHE teama6ef0a62019-03-07 20:34:33 -050069// Constructs various test permutations.
70std::vector<TestParams> GetTestParams() {
71 std::vector<TestParams> params;
72 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
73 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
74 params.push_back(TestParams(all_supported_versions[i], true));
75 params.push_back(TestParams(all_supported_versions[i], false));
76 }
77 return params;
78}
79
rchc76cd742019-03-26 16:00:03 -070080class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
81 public:
82 ~MockDebugDelegate() override = default;
83
84 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame& frame));
renjietangdbe98342019-10-18 11:00:57 -070085
86 MOCK_METHOD1(OnStreamFrameCoalesced, void(const QuicStreamFrame& frame));
rchc76cd742019-03-26 16:00:03 -070087};
88
QUICHE teama6ef0a62019-03-07 20:34:33 -050089class TestPacketCreator : public QuicPacketCreator {
90 public:
91 TestPacketCreator(QuicConnectionId connection_id,
92 QuicFramer* framer,
93 DelegateInterface* delegate,
94 SimpleDataProducer* producer)
95 : QuicPacketCreator(connection_id, framer, delegate),
96 producer_(producer),
97 version_(framer->transport_version()) {}
98
fayang62b637b2019-09-16 08:40:49 -070099 bool ConsumeDataToFillCurrentPacket(QuicStreamId id,
100 const struct iovec* iov,
101 int iov_count,
102 size_t total_length,
103 size_t iov_offset,
104 QuicStreamOffset offset,
105 bool fin,
106 bool needs_full_padding,
107 TransmissionType transmission_type,
108 QuicFrame* frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500109 // Save data before data is consumed.
110 QuicByteCount data_length = total_length - iov_offset;
111 if (data_length > 0) {
112 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
113 }
fayang62b637b2019-09-16 08:40:49 -0700114 return QuicPacketCreator::ConsumeDataToFillCurrentPacket(
115 id, data_length - iov_offset, offset, fin, needs_full_padding,
116 transmission_type, frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500117 }
118
119 void StopSendingVersion() {
fayangd4291e42019-05-30 10:31:21 -0700120 if (VersionHasIetfInvariantHeader(version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500121 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
122 return;
123 }
124 QuicPacketCreator::StopSendingVersion();
125 }
126
127 SimpleDataProducer* producer_;
128 QuicTransportVersion version_;
129};
130
131class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
132 public:
133 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) {
134 if (serialized_packet == nullptr) {
135 return;
136 }
137 ClearSerializedPacket(serialized_packet);
138 }
139
140 void SaveSerializedPacket(SerializedPacket* serialized_packet) {
141 if (serialized_packet == nullptr) {
142 return;
143 }
144 delete[] serialized_packet_.encrypted_buffer;
145 serialized_packet_ = *serialized_packet;
146 serialized_packet_.encrypted_buffer = CopyBuffer(*serialized_packet);
147 serialized_packet->retransmittable_frames.clear();
148 }
149
150 void DeleteSerializedPacket() {
151 delete[] serialized_packet_.encrypted_buffer;
152 serialized_packet_.encrypted_buffer = nullptr;
153 ClearSerializedPacket(&serialized_packet_);
154 }
155
156 protected:
157 QuicPacketCreatorTest()
158 : connection_id_(TestConnectionId(2)),
159 server_framer_(SupportedVersions(GetParam().version),
160 QuicTime::Zero(),
161 Perspective::IS_SERVER,
162 connection_id_.length()),
163 client_framer_(SupportedVersions(GetParam().version),
164 QuicTime::Zero(),
165 Perspective::IS_CLIENT,
166 connection_id_.length()),
167 data_("foo"),
168 creator_(connection_id_, &client_framer_, &delegate_, &producer_),
169 serialized_packet_(creator_.NoPacket()) {
170 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
nharperc6b99512019-09-19 11:13:48 -0700171 creator_.SetEncrypter(ENCRYPTION_INITIAL, std::make_unique<NullEncrypter>(
172 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700173 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, std::make_unique<NullEncrypter>(
QUICHE team88ea0082019-03-15 10:05:26 -0700174 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700175 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, std::make_unique<NullEncrypter>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500176 Perspective::IS_CLIENT));
177 creator_.SetEncrypter(
178 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700179 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500180 client_framer_.set_visitor(&framer_visitor_);
181 server_framer_.set_visitor(&framer_visitor_);
182 client_framer_.set_data_producer(&producer_);
zhongyi546cc452019-04-12 15:27:49 -0700183 if (server_framer_.version().KnowsWhichDecrypterToUse()) {
184 server_framer_.InstallDecrypter(
nharperc6b99512019-09-19 11:13:48 -0700185 ENCRYPTION_INITIAL,
186 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
187 server_framer_.InstallDecrypter(
zhongyi546cc452019-04-12 15:27:49 -0700188 ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -0700189 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700190 server_framer_.InstallDecrypter(
191 ENCRYPTION_HANDSHAKE,
vasilvv0fc587f2019-09-06 13:33:08 -0700192 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700193 server_framer_.InstallDecrypter(
194 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700195 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
nharperc6b99512019-09-19 11:13:48 -0700196 } else {
197 server_framer_.SetDecrypter(
198 ENCRYPTION_INITIAL,
199 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700200 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500201 }
202
203 ~QuicPacketCreatorTest() override {
204 delete[] serialized_packet_.encrypted_buffer;
205 ClearSerializedPacket(&serialized_packet_);
206 }
207
208 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
209 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
dschinazi66dea072019-04-09 11:41:06 -0700210 &creator_, frames, buffer_, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500211 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
212 packet.encryption_level);
213 return packet;
214 }
215
216 void ProcessPacket(const SerializedPacket& packet) {
217 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
218 packet.encrypted_length);
219 server_framer_.ProcessPacket(encrypted_packet);
220 }
221
222 void CheckStreamFrame(const QuicFrame& frame,
223 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700224 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500225 QuicStreamOffset offset,
226 bool fin) {
227 EXPECT_EQ(STREAM_FRAME, frame.type);
228 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
dschinazi66dea072019-04-09 11:41:06 -0700229 char buf[kMaxOutgoingPacketSize];
230 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500231 if (frame.stream_frame.data_length > 0) {
232 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
233 frame.stream_frame.data_length, &writer);
234 }
235 EXPECT_EQ(data, QuicStringPiece(buf, frame.stream_frame.data_length));
236 EXPECT_EQ(offset, frame.stream_frame.offset);
237 EXPECT_EQ(fin, frame.stream_frame.fin);
238 }
239
240 // Returns the number of bytes consumed by the header of packet, including
241 // the version.
242 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
243 return GetPacketHeaderSize(
244 version, creator_.GetDestinationConnectionIdLength(),
245 creator_.GetSourceConnectionIdLength(),
246 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
247 !kIncludeDiversificationNonce,
248 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
249 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
250 QuicPacketCreatorPeer::GetLengthLength(&creator_));
251 }
252
253 // Returns the number of bytes of overhead that will be added to a packet
254 // of maximum length.
255 size_t GetEncryptionOverhead() {
256 return creator_.max_packet_length() -
257 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
258 }
259
260 // Returns the number of bytes consumed by the non-data fields of a stream
261 // frame, assuming it is the last frame in the packet
262 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
263 return QuicFramer::GetMinStreamFrameSize(
264 version, GetNthClientInitiatedStreamId(1), kOffset, true,
265 /* data_length= */ 0);
266 }
267
QUICHE teama6ef0a62019-03-07 20:34:33 -0500268 bool IsDefaultTestConfiguration() {
269 TestParams p = GetParam();
270 return p.version == AllSupportedVersions()[0] && p.version_serialization;
271 }
272
273 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
dschinazi552accc2019-06-17 17:07:34 -0700274 return QuicUtils::GetFirstBidirectionalStreamId(
275 creator_.transport_version(), Perspective::IS_CLIENT) +
276 n * 2;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500277 }
278
279 static const QuicStreamOffset kOffset = 0u;
280
dschinazi66dea072019-04-09 11:41:06 -0700281 char buffer_[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500282 QuicConnectionId connection_id_;
283 QuicFrames frames_;
284 QuicFramer server_framer_;
285 QuicFramer client_framer_;
286 StrictMock<MockFramerVisitor> framer_visitor_;
287 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700288 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500289 struct iovec iov_;
290 TestPacketCreator creator_;
291 SerializedPacket serialized_packet_;
292 SimpleDataProducer producer_;
293 SimpleBufferAllocator allocator_;
294};
295
296// Run all packet creator tests with all supported versions of QUIC, and with
297// and without version in the packet header, as well as doing a run for each
298// length of truncated connection id.
299INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
300 QuicPacketCreatorTest,
dschinazi142051a2019-09-18 18:17:29 -0700301 ::testing::ValuesIn(GetTestParams()),
302 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500303
304TEST_P(QuicPacketCreatorTest, SerializeFrames) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700305 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500306 EncryptionLevel level = static_cast<EncryptionLevel>(i);
307 creator_.set_encryption_level(level);
308 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700309 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
310 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang49523232019-05-03 06:28:22 -0700311 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700312 frames_.push_back(
313 QuicFrame(QuicStreamFrame(stream_id, false, 0u, QuicStringPiece())));
renjietangdbe98342019-10-18 11:00:57 -0700314 if (!GetQuicReloadableFlag(quic_coalesce_stream_frames)) {
315 frames_.push_back(
316 QuicFrame(QuicStreamFrame(stream_id, true, 0u, QuicStringPiece())));
317 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700318 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500319 SerializedPacket serialized = SerializeAllFrames(frames_);
320 EXPECT_EQ(level, serialized.encryption_level);
321 delete frames_[0].ack_frame;
322 frames_.clear();
323
324 {
325 InSequence s;
326 EXPECT_CALL(framer_visitor_, OnPacket());
327 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
328 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
329 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
330 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
331 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
332 .WillOnce(Return(true));
333 EXPECT_CALL(framer_visitor_,
334 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
335 .WillOnce(Return(true));
336 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
337 .WillOnce(Return(true));
fayang49523232019-05-03 06:28:22 -0700338 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700339 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
renjietangdbe98342019-10-18 11:00:57 -0700340 if (!GetQuicReloadableFlag(quic_coalesce_stream_frames)) {
341 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
342 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700343 }
nharperc32d8ab2019-10-09 11:09:06 -0700344 if (client_framer_.version().HasHeaderProtection()) {
345 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_))
346 .Times(testing::AnyNumber());
347 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500348 EXPECT_CALL(framer_visitor_, OnPacketComplete());
349 }
350 ProcessPacket(serialized);
351 }
352}
353
QUICHE teama6ef0a62019-03-07 20:34:33 -0500354TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
renjietang4c704c82019-10-07 16:39:11 -0700355 QuicConnectionCloseFrame frame(creator_.transport_version(), QUIC_NO_ERROR,
356 "error",
fkastenholz591814c2019-09-06 12:11:46 -0700357 /*transport_close_frame_type=*/0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500358
359 QuicFrames frames;
360 frames.push_back(QuicFrame(&frame));
361 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700362 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500363 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
364 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
365
366 InSequence s;
367 EXPECT_CALL(framer_visitor_, OnPacket());
368 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
369 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
370 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
371 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
372 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
373 EXPECT_CALL(framer_visitor_, OnPacketComplete());
374
375 ProcessPacket(serialized);
376}
377
fayang62b637b2019-09-16 08:40:49 -0700378TEST_P(QuicPacketCreatorTest, ConsumeCryptoDataToFillCurrentPacket) {
vasilvvc48c8712019-03-11 13:38:16 -0700379 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500380 QuicFrame frame;
fayang62b637b2019-09-16 08:40:49 -0700381 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
382 ENCRYPTION_INITIAL, data.length(), 0,
383 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500384 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
385 EXPECT_TRUE(creator_.HasPendingFrames());
386}
387
fayang62b637b2019-09-16 08:40:49 -0700388TEST_P(QuicPacketCreatorTest, ConsumeDataToFillCurrentPacket) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700389 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500390 QuicFrame frame;
391 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700392 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
393 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700394 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
395 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
396 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500397 size_t consumed = frame.stream_frame.data_length;
398 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700399 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500400 EXPECT_TRUE(creator_.HasPendingFrames());
401}
402
403TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700404 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405 QuicFrame frame;
406 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700407 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
408 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700409 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
410 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
411 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500412 size_t consumed = frame.stream_frame.data_length;
413 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700414 CheckStreamFrame(frame, stream_id, "test", 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500415 EXPECT_TRUE(creator_.HasPendingFrames());
416}
417
418TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700419 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500420 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700421 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
422 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700423 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
424 stream_id, nullptr, 0u, 0u, 0u, 0u, true, false, NOT_RETRANSMISSION,
425 &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500426 size_t consumed = frame.stream_frame.data_length;
427 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700428 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500429 EXPECT_TRUE(creator_.HasPendingFrames());
430}
431
432TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
433 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
434 const size_t overhead =
435 GetPacketHeaderOverhead(client_framer_.transport_version()) +
436 GetEncryptionOverhead();
QUICHE team2252b702019-05-14 23:55:14 -0400437 for (size_t i = overhead + QuicPacketCreator::MinPlaintextPacketSize(
438 client_framer_.version());
nharper55fa6132019-05-07 19:37:21 -0700439 i < overhead + 100; ++i) {
440 SCOPED_TRACE(i);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500441 creator_.SetMaxPacketLength(i);
442 const bool should_have_room =
443 i >
444 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
445 ASSERT_EQ(should_have_room,
446 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
447 kOffset, /* data_size=*/0xffff));
448 if (should_have_room) {
449 QuicFrame frame;
450 MakeIOVector("testdata", &iov_);
451 EXPECT_CALL(delegate_, OnSerializedPacket(_))
452 .WillRepeatedly(Invoke(
453 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
fayang62b637b2019-09-16 08:40:49 -0700454 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
455 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u,
456 kOffset, false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500457 size_t bytes_consumed = frame.stream_frame.data_length;
458 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700459 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500460 }
461 }
462}
463
464TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
465 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
466 // Compute the total overhead for a single frame in packet.
467 const size_t overhead =
468 GetPacketHeaderOverhead(client_framer_.transport_version()) +
469 GetEncryptionOverhead() +
470 GetStreamFrameOverhead(client_framer_.transport_version());
471 size_t capacity = kDefaultMaxPacketSize - overhead;
472 // Now, test various sizes around this size.
473 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700474 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500475 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
476 QuicFrame frame;
477 MakeIOVector(data, &iov_);
fayang62b637b2019-09-16 08:40:49 -0700478 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
479 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
480 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500481
482 // BytesFree() returns bytes available for the next frame, which will
483 // be two bytes smaller since the stream frame would need to be grown.
484 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
485 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
486 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
487 EXPECT_CALL(delegate_, OnSerializedPacket(_))
488 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700489 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500490 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
491 DeleteSerializedPacket();
492 }
493}
494
495TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700496 // This test serializes crypto payloads slightly larger than a packet, which
497 // Causes the multi-packet ClientHello check to fail.
danzh88e3e052019-06-13 11:47:18 -0700498 SetQuicFlag(FLAGS_quic_enforce_single_packet_chlo, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500499 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700500 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500501 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700502 GetEncryptionOverhead();
503 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
dschinazi66dea072019-04-09 11:41:06 -0700504 overhead +=
505 QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxOutgoingPacketSize);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700506 } else {
507 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
508 }
dschinazi66dea072019-04-09 11:41:06 -0700509 ASSERT_GT(kMaxOutgoingPacketSize, overhead);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500510 size_t capacity = kDefaultMaxPacketSize - overhead;
511 // Now, test various sizes around this size.
512 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700513 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700514 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500515 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
516
517 QuicFrame frame;
518 MakeIOVector(data, &iov_);
519 EXPECT_CALL(delegate_, OnSerializedPacket(_))
520 .WillRepeatedly(
521 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700522 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
fayang62b637b2019-09-16 08:40:49 -0700523 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700524 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
525 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
526 &frame));
527 size_t bytes_consumed = frame.stream_frame.data_length;
528 EXPECT_LT(0u, bytes_consumed);
529 } else {
530 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
fayang62b637b2019-09-16 08:40:49 -0700531 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
nharper51961cf2019-05-13 13:23:24 -0700532 ENCRYPTION_INITIAL, data.length(), kOffset,
533 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700534 size_t bytes_consumed = frame.crypto_frame->data_length;
535 EXPECT_LT(0u, bytes_consumed);
536 }
fayang62b637b2019-09-16 08:40:49 -0700537 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500538 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
539 // If there is not enough space in the packet to fit a padding frame
540 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
541 // will not be padded.
fayang58f71072019-11-05 08:47:02 -0800542 // Padding is skipped when we try to send coalesced packets.
543 if ((bytes_free < 3 &&
544 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) ||
545 client_framer_.version().CanSendCoalescedPackets()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500546 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
547 serialized_packet_.encrypted_length);
548 } else {
549 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
550 }
551 DeleteSerializedPacket();
552 }
553}
554
555TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
556 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
557 // Compute the total overhead for a single frame in packet.
558 const size_t overhead =
559 GetPacketHeaderOverhead(client_framer_.transport_version()) +
560 GetEncryptionOverhead() +
561 GetStreamFrameOverhead(client_framer_.transport_version());
562 ASSERT_GT(kDefaultMaxPacketSize, overhead);
563 size_t capacity = kDefaultMaxPacketSize - overhead;
564 // Now, test various sizes around this size.
565 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700566 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500567 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
568
569 QuicFrame frame;
570 MakeIOVector(data, &iov_);
571 EXPECT_CALL(delegate_, OnSerializedPacket(_))
572 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700573 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
574 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
575 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500576 size_t bytes_consumed = frame.stream_frame.data_length;
577 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700578 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500579 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
580 if (bytes_free > 0) {
581 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
582 serialized_packet_.encrypted_length);
583 } else {
584 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
585 }
586 DeleteSerializedPacket();
587 }
588}
589
590TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
591 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
592 ParsedQuicVersionVector versions;
593 versions.push_back(test::QuicVersionMax());
fayangd4291e42019-05-30 10:31:21 -0700594 const bool ietf_quic =
renjietang4c704c82019-10-07 16:39:11 -0700595 VersionHasIetfInvariantHeader(creator_.transport_version());
dschinazi48ac9192019-07-31 00:07:26 -0700596 const bool has_length_prefix =
597 GetParam().version.HasLengthPrefixedConnectionIds();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500598 std::unique_ptr<QuicEncryptedPacket> encrypted(
dschinazi48ac9192019-07-31 00:07:26 -0700599 creator_.SerializeVersionNegotiationPacket(ietf_quic, has_length_prefix,
600 versions));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500601
602 {
603 InSequence s;
604 EXPECT_CALL(framer_visitor_, OnPacket());
605 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
606 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
607 }
608 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
609 client_framer_.ProcessPacket(*encrypted);
610}
611
renjietang4c704c82019-10-07 16:39:11 -0700612// Test that the path challenge connectivity probing packet is serialized
613// correctly as a padded PATH CHALLENGE packet.
614TEST_P(QuicPacketCreatorTest, BuildPathChallengePacket) {
615 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
616 // This frame is only for IETF QUIC.
617 return;
618 }
619
620 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700621 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700622 header.reset_flag = false;
623 header.version_flag = false;
624 header.packet_number = kPacketNumber;
625 QuicPathFrameBuffer payload;
626
627 // clang-format off
628 unsigned char packet[] = {
629 // type (short header, 4 byte packet number)
630 0x43,
631 // connection_id
632 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
633 // packet number
634 0x12, 0x34, 0x56, 0x78,
635
636 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
637 0x1a,
638 // 8 "random" bytes, MockRandom makes lots of r's
639 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
640 // frame type (padding frame)
641 0x00,
642 0x00, 0x00, 0x00, 0x00
643 };
644 // clang-format on
645
646 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
647 MockRandom randomizer;
648
649 size_t length = creator_.BuildPaddedPathChallengePacket(
650 header, buffer.get(), QUIC_ARRAYSIZE(packet), &payload, &randomizer,
651 ENCRYPTION_INITIAL);
652 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
653
654 // Payload has the random bytes that were generated. Copy them into packet,
655 // above, before checking that the generated packet is correct.
656 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
657
658 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
659 header);
660
661 test::CompareCharArraysWithHexError(
662 "constructed packet", data.data(), data.length(),
663 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
664}
665
666TEST_P(QuicPacketCreatorTest, BuildConnectivityProbingPacket) {
667 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700668 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700669 header.reset_flag = false;
670 header.version_flag = false;
671 header.packet_number = kPacketNumber;
672
673 // clang-format off
674 unsigned char packet[] = {
675 // public flags (8 byte connection_id)
676 0x2C,
677 // connection_id
678 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
679 // packet number
680 0x12, 0x34, 0x56, 0x78,
681
682 // frame type (ping frame)
683 0x07,
684 // frame type (padding frame)
685 0x00,
686 0x00, 0x00, 0x00, 0x00
687 };
688
689 unsigned char packet46[] = {
690 // type (short header, 4 byte packet number)
691 0x43,
692 // connection_id
693 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
694 // packet number
695 0x12, 0x34, 0x56, 0x78,
696
697 // frame type
698 0x07,
699 // frame type (padding frame)
700 0x00,
701 0x00, 0x00, 0x00, 0x00
702 };
703
704 unsigned char packet99[] = {
705 // type (short header, 4 byte packet number)
706 0x43,
707 // connection_id
708 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
709 // packet number
710 0x12, 0x34, 0x56, 0x78,
711
712 // frame type (IETF_PING frame)
713 0x01,
714 // frame type (padding frame)
715 0x00,
716 0x00, 0x00, 0x00, 0x00
717 };
718 // clang-format on
719
720 unsigned char* p = packet;
721 size_t packet_size = QUIC_ARRAYSIZE(packet);
722 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
723 p = packet99;
724 packet_size = QUIC_ARRAYSIZE(packet99);
725 } else if (creator_.transport_version() >= QUIC_VERSION_46) {
726 p = packet46;
727 packet_size = QUIC_ARRAYSIZE(packet46);
728 }
729
730 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
731
732 size_t length = creator_.BuildConnectivityProbingPacket(
733 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
734
735 EXPECT_NE(0u, length);
736 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
737 header);
738
739 test::CompareCharArraysWithHexError("constructed packet", data.data(),
740 data.length(), reinterpret_cast<char*>(p),
741 packet_size);
742}
743
744// Several tests that the path response connectivity probing packet is
745// serialized correctly as either a padded and unpadded PATH RESPONSE
746// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
747// exercised the single- and multiple- payload cases.
748TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponseUnpadded) {
749 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
750 // This frame is only for IETF QUIC.
751 return;
752 }
753
754 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700755 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700756 header.reset_flag = false;
757 header.version_flag = false;
758 header.packet_number = kPacketNumber;
759 QuicPathFrameBuffer payload0 = {
760 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
761
762 // Build 1 PATH RESPONSE, not padded
763 // clang-format off
764 unsigned char packet[] = {
765 // type (short header, 4 byte packet number)
766 0x43,
767 // connection_id
768 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
769 // packet number
770 0x12, 0x34, 0x56, 0x78,
771
772 // Path Response Frame type (IETF_PATH_RESPONSE)
773 0x1b,
774 // 8 "random" bytes
775 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
776 };
777 // clang-format on
778 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
779 QuicDeque<QuicPathFrameBuffer> payloads;
780 payloads.push_back(payload0);
781 size_t length = creator_.BuildPathResponsePacket(
782 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
783 /*is_padded=*/false, ENCRYPTION_INITIAL);
784 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
785 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
786 header);
787
788 test::CompareCharArraysWithHexError(
789 "constructed packet", data.data(), data.length(),
790 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
791}
792
793TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponsePadded) {
794 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
795 // This frame is only for IETF QUIC.
796 return;
797 }
798
799 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700800 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700801 header.reset_flag = false;
802 header.version_flag = false;
803 header.packet_number = kPacketNumber;
804 QuicPathFrameBuffer payload0 = {
805 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
806
807 // Build 1 PATH RESPONSE, padded
808 // clang-format off
809 unsigned char packet[] = {
810 // type (short header, 4 byte packet number)
811 0x43,
812 // connection_id
813 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
814 // packet number
815 0x12, 0x34, 0x56, 0x78,
816
817 // Path Response Frame type (IETF_PATH_RESPONSE)
818 0x1b,
819 // 8 "random" bytes
820 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
821 // Padding type and pad
822 0x00, 0x00, 0x00, 0x00, 0x00
823 };
824 // clang-format on
825 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
826 QuicDeque<QuicPathFrameBuffer> payloads;
827 payloads.push_back(payload0);
828 size_t length = creator_.BuildPathResponsePacket(
829 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
830 /*is_padded=*/true, ENCRYPTION_INITIAL);
831 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
832 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
833 header);
834
835 test::CompareCharArraysWithHexError(
836 "constructed packet", data.data(), data.length(),
837 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
838}
839
840TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesUnpadded) {
841 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
842 // This frame is only for IETF QUIC.
843 return;
844 }
845
846 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700847 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700848 header.reset_flag = false;
849 header.version_flag = false;
850 header.packet_number = kPacketNumber;
851 QuicPathFrameBuffer payload0 = {
852 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
853 QuicPathFrameBuffer payload1 = {
854 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
855 QuicPathFrameBuffer payload2 = {
856 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
857
858 // Build one packet with 3 PATH RESPONSES, no padding
859 // clang-format off
860 unsigned char packet[] = {
861 // type (short header, 4 byte packet number)
862 0x43,
863 // connection_id
864 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
865 // packet number
866 0x12, 0x34, 0x56, 0x78,
867
868 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
869 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
870 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
871 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
872 };
873 // clang-format on
874
875 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
876 QuicDeque<QuicPathFrameBuffer> payloads;
877 payloads.push_back(payload0);
878 payloads.push_back(payload1);
879 payloads.push_back(payload2);
880 size_t length = creator_.BuildPathResponsePacket(
881 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
882 /*is_padded=*/false, ENCRYPTION_INITIAL);
883 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
884 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
885 header);
886
887 test::CompareCharArraysWithHexError(
888 "constructed packet", data.data(), data.length(),
889 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
890}
891
892TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesPadded) {
893 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
894 // This frame is only for IETF QUIC.
895 return;
896 }
897
898 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700899 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700900 header.reset_flag = false;
901 header.version_flag = false;
902 header.packet_number = kPacketNumber;
903 QuicPathFrameBuffer payload0 = {
904 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
905 QuicPathFrameBuffer payload1 = {
906 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
907 QuicPathFrameBuffer payload2 = {
908 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
909
910 // Build one packet with 3 PATH RESPONSES, with padding
911 // clang-format off
912 unsigned char packet[] = {
913 // type (short header, 4 byte packet number)
914 0x43,
915 // connection_id
916 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
917 // packet number
918 0x12, 0x34, 0x56, 0x78,
919
920 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
921 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
922 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
923 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
924 // Padding
925 0x00, 0x00, 0x00, 0x00, 0x00
926 };
927 // clang-format on
928
929 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
930 QuicDeque<QuicPathFrameBuffer> payloads;
931 payloads.push_back(payload0);
932 payloads.push_back(payload1);
933 payloads.push_back(payload2);
934 size_t length = creator_.BuildPathResponsePacket(
935 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
936 /*is_padded=*/true, ENCRYPTION_INITIAL);
937 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
938 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
939 header);
940
941 test::CompareCharArraysWithHexError(
942 "constructed packet", data.data(), data.length(),
943 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
944}
945
QUICHE teama6ef0a62019-03-07 20:34:33 -0500946TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700947 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500948 EncryptionLevel level = static_cast<EncryptionLevel>(i);
949
950 creator_.set_encryption_level(level);
951
952 OwningSerializedPacketPointer encrypted;
renjietang4c704c82019-10-07 16:39:11 -0700953 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500954 QuicPathFrameBuffer payload = {
955 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
956 encrypted =
957 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
958 } else {
959 encrypted = creator_.SerializeConnectivityProbingPacket();
960 }
961 {
962 InSequence s;
963 EXPECT_CALL(framer_visitor_, OnPacket());
964 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
965 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
966 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
967 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
renjietang4c704c82019-10-07 16:39:11 -0700968 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500969 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
970 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
971 } else {
972 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
973 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
974 }
975 EXPECT_CALL(framer_visitor_, OnPacketComplete());
976 }
977 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
978 server_framer_.ProcessPacket(QuicEncryptedPacket(
979 encrypted->encrypted_buffer, encrypted->encrypted_length));
980 }
981}
982
983TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
renjietang4c704c82019-10-07 16:39:11 -0700984 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500985 return;
986 }
987 QuicPathFrameBuffer payload = {
988 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
989
QUICHE team6987b4a2019-03-15 16:23:04 -0700990 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500991 EncryptionLevel level = static_cast<EncryptionLevel>(i);
992
993 creator_.set_encryption_level(level);
994
995 OwningSerializedPacketPointer encrypted(
996 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
997 {
998 InSequence s;
999 EXPECT_CALL(framer_visitor_, OnPacket());
1000 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1001 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1002 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1003 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1004 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
1005 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1006 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1007 }
1008 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
1009 server_framer_.ProcessPacket(QuicEncryptedPacket(
1010 encrypted->encrypted_buffer, encrypted->encrypted_length));
1011 }
1012}
1013
1014TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001015 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001016 return;
1017 }
1018 QuicPathFrameBuffer payload0 = {
1019 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1020
QUICHE team6987b4a2019-03-15 16:23:04 -07001021 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001022 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1023 creator_.set_encryption_level(level);
1024
1025 QuicDeque<QuicPathFrameBuffer> payloads;
1026 payloads.push_back(payload0);
1027
1028 OwningSerializedPacketPointer encrypted(
1029 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1030 true));
1031 {
1032 InSequence s;
1033 EXPECT_CALL(framer_visitor_, OnPacket());
1034 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1035 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1036 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1037 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1038 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1039 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1040 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1041 }
1042 server_framer_.ProcessPacket(QuicEncryptedPacket(
1043 encrypted->encrypted_buffer, encrypted->encrypted_length));
1044 }
1045}
1046
1047TEST_P(QuicPacketCreatorTest,
1048 SerializePathResponseProbePacket1PayloadUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001049 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001050 return;
1051 }
1052 QuicPathFrameBuffer payload0 = {
1053 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1054
QUICHE team6987b4a2019-03-15 16:23:04 -07001055 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001056 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1057 creator_.set_encryption_level(level);
1058
1059 QuicDeque<QuicPathFrameBuffer> payloads;
1060 payloads.push_back(payload0);
1061
1062 OwningSerializedPacketPointer encrypted(
1063 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1064 false));
1065 {
1066 InSequence s;
1067 EXPECT_CALL(framer_visitor_, OnPacket());
1068 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1069 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1070 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1071 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1072 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1073 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1074 }
1075 server_framer_.ProcessPacket(QuicEncryptedPacket(
1076 encrypted->encrypted_buffer, encrypted->encrypted_length));
1077 }
1078}
1079
1080TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001081 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001082 return;
1083 }
1084 QuicPathFrameBuffer payload0 = {
1085 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1086 QuicPathFrameBuffer payload1 = {
1087 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1088
QUICHE team6987b4a2019-03-15 16:23:04 -07001089 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001090 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1091 creator_.set_encryption_level(level);
1092
1093 QuicDeque<QuicPathFrameBuffer> payloads;
1094 payloads.push_back(payload0);
1095 payloads.push_back(payload1);
1096
1097 OwningSerializedPacketPointer encrypted(
1098 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1099 true));
1100 {
1101 InSequence s;
1102 EXPECT_CALL(framer_visitor_, OnPacket());
1103 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1104 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1105 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1106 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1107 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1108 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1109 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1110 }
1111 server_framer_.ProcessPacket(QuicEncryptedPacket(
1112 encrypted->encrypted_buffer, encrypted->encrypted_length));
1113 }
1114}
1115
1116TEST_P(QuicPacketCreatorTest,
1117 SerializePathResponseProbePacket2PayloadsUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001118 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001119 return;
1120 }
1121 QuicPathFrameBuffer payload0 = {
1122 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1123 QuicPathFrameBuffer payload1 = {
1124 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1125
QUICHE team6987b4a2019-03-15 16:23:04 -07001126 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001127 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1128 creator_.set_encryption_level(level);
1129
1130 QuicDeque<QuicPathFrameBuffer> payloads;
1131 payloads.push_back(payload0);
1132 payloads.push_back(payload1);
1133
1134 OwningSerializedPacketPointer encrypted(
1135 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1136 false));
1137 {
1138 InSequence s;
1139 EXPECT_CALL(framer_visitor_, OnPacket());
1140 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1141 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1142 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1143 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1144 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1145 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1146 }
1147 server_framer_.ProcessPacket(QuicEncryptedPacket(
1148 encrypted->encrypted_buffer, encrypted->encrypted_length));
1149 }
1150}
1151
1152TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001153 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001154 return;
1155 }
1156 QuicPathFrameBuffer payload0 = {
1157 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1158 QuicPathFrameBuffer payload1 = {
1159 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1160 QuicPathFrameBuffer payload2 = {
1161 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1162
QUICHE team6987b4a2019-03-15 16:23:04 -07001163 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001164 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1165 creator_.set_encryption_level(level);
1166
1167 QuicDeque<QuicPathFrameBuffer> payloads;
1168 payloads.push_back(payload0);
1169 payloads.push_back(payload1);
1170 payloads.push_back(payload2);
1171
1172 OwningSerializedPacketPointer encrypted(
1173 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1174 true));
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 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1183 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1184 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1185 }
1186 server_framer_.ProcessPacket(QuicEncryptedPacket(
1187 encrypted->encrypted_buffer, encrypted->encrypted_length));
1188 }
1189}
1190
1191TEST_P(QuicPacketCreatorTest,
1192 SerializePathResponseProbePacket3PayloadsUnpadded) {
renjietang4c704c82019-10-07 16:39:11 -07001193 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001194 return;
1195 }
1196 QuicPathFrameBuffer payload0 = {
1197 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1198 QuicPathFrameBuffer payload1 = {
1199 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1200 QuicPathFrameBuffer payload2 = {
1201 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1202
QUICHE team6987b4a2019-03-15 16:23:04 -07001203 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001204 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1205 creator_.set_encryption_level(level);
1206
1207 QuicDeque<QuicPathFrameBuffer> payloads;
1208 payloads.push_back(payload0);
1209 payloads.push_back(payload1);
1210 payloads.push_back(payload2);
1211
1212 OwningSerializedPacketPointer encrypted(
1213 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1214 false));
1215 InSequence s;
1216 EXPECT_CALL(framer_visitor_, OnPacket());
1217 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1218 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1219 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1220 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1221 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1222 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1223
1224 server_framer_.ProcessPacket(QuicEncryptedPacket(
1225 encrypted->encrypted_buffer, encrypted->encrypted_length));
1226 }
1227}
1228
1229TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
renjietang4c704c82019-10-07 16:39:11 -07001230 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001231 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001232 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1233 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1234 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1235 } else {
1236 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1237 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1238 }
1239
1240 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1241 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1242 10000 / kDefaultMaxPacketSize);
1243 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1244 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1245
1246 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1247 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1248 10000 / kDefaultMaxPacketSize);
1249 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1250 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1251
1252 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1253 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1254 10000 / kDefaultMaxPacketSize);
1255 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1256 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1257
1258 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1259 UINT64_C(64) * 256 * 256 * 256 * 256);
1260 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1261 10000 / kDefaultMaxPacketSize);
1262 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1263 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1264}
1265
1266TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1267 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001268 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001269 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001270 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1271 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1272 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1273 } else {
1274 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1275 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1276 }
1277
1278 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1279 10000 / kDefaultMaxPacketSize);
1280 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1281 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1282
1283 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1284 10000 * 256 / kDefaultMaxPacketSize);
1285 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1286 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1287
1288 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1289 10000 * 256 * 256 / kDefaultMaxPacketSize);
1290 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1291 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1292
1293 creator_.UpdatePacketNumberLength(
1294 QuicPacketNumber(1),
1295 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1296 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1297 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1298}
1299
fayang4c1c2362019-09-13 07:20:01 -07001300TEST_P(QuicPacketCreatorTest, SkipNPacketNumbers) {
1301 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001302 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang4c1c2362019-09-13 07:20:01 -07001303 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1304 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1305 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1306 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1307 } else {
1308 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1309 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1310 }
1311 creator_.SkipNPacketNumbers(63, QuicPacketNumber(2),
1312 10000 / kDefaultMaxPacketSize);
1313 EXPECT_EQ(QuicPacketNumber(64), creator_.packet_number());
1314 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1315 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1316
1317 creator_.SkipNPacketNumbers(64 * 255, QuicPacketNumber(2),
1318 10000 / kDefaultMaxPacketSize);
1319 EXPECT_EQ(QuicPacketNumber(64 * 256), creator_.packet_number());
1320 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1321 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1322
1323 creator_.SkipNPacketNumbers(64 * 256 * 255, QuicPacketNumber(2),
1324 10000 / kDefaultMaxPacketSize);
1325 EXPECT_EQ(QuicPacketNumber(64 * 256 * 256), creator_.packet_number());
1326 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1327 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1328}
1329
QUICHE teama6ef0a62019-03-07 20:34:33 -05001330TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1331 if (!GetParam().version_serialization) {
1332 creator_.StopSendingVersion();
1333 }
nharper55fa6132019-05-07 19:37:21 -07001334 std::string data("test data");
1335 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1336 QuicStreamFrame stream_frame(
1337 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1338 /*fin=*/false, 0u, QuicStringPiece());
1339 frames_.push_back(QuicFrame(stream_frame));
1340 } else {
1341 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1342 frames_.push_back(
1343 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1344 }
1345 SerializedPacket serialized = SerializeAllFrames(frames_);
1346
1347 QuicPacketHeader header;
1348 {
1349 InSequence s;
1350 EXPECT_CALL(framer_visitor_, OnPacket());
1351 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1352 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1353 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1354 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1355 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1356 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1357 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1358 } else {
1359 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1360 }
1361 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1362 }
1363 ProcessPacket(serialized);
1364 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1365 DeleteFrames(&frames_);
1366}
1367
1368TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
1369 if (!GetParam().version_serialization) {
1370 creator_.StopSendingVersion();
1371 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001372 std::string data("a");
1373 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1374 QuicStreamFrame stream_frame(
1375 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1376 /*fin=*/false, 0u, QuicStringPiece());
1377 frames_.push_back(QuicFrame(stream_frame));
1378 } else {
1379 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1380 frames_.push_back(
1381 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1382 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001383 SerializedPacket serialized = SerializeAllFrames(frames_);
1384
1385 QuicPacketHeader header;
1386 {
1387 InSequence s;
1388 EXPECT_CALL(framer_visitor_, OnPacket());
1389 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1390 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1391 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1392 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1393 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001394 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1395 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1396 } else {
1397 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1398 }
nharper55fa6132019-05-07 19:37:21 -07001399 if (client_framer_.version().HasHeaderProtection()) {
1400 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1401 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001402 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1403 }
1404 ProcessPacket(serialized);
1405 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001406 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001407}
1408
1409TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1410 if (!GetParam().version_serialization) {
1411 creator_.StopSendingVersion();
1412 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001413 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001414 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001415 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001416 size_t payload_length = creator_.max_packet_length();
1417 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001418 MakeIOVector(too_long_payload, &iov_);
1419 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1420 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001421 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1422 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001423 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1424 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
1425 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001426 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001427 // The entire payload could not be consumed.
1428 EXPECT_GT(payload_length, consumed);
fayang62b637b2019-09-16 08:40:49 -07001429 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001430 DeleteSerializedPacket();
1431}
1432
1433TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1434 if (!GetParam().version_serialization) {
1435 creator_.StopSendingVersion();
1436 }
1437 const size_t max_plaintext_size =
1438 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1439 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001440 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1441 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1442 client_framer_.transport_version(), Perspective::IS_CLIENT);
1443 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1444 stream_id =
1445 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1446 }
1447 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001448 EXPECT_EQ(max_plaintext_size -
1449 GetPacketHeaderSize(
1450 client_framer_.transport_version(),
1451 creator_.GetDestinationConnectionIdLength(),
1452 creator_.GetSourceConnectionIdLength(),
1453 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1454 !kIncludeDiversificationNonce,
1455 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1456 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1457 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1458 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001459 StrictMock<MockDebugDelegate> debug;
1460 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001461
1462 // Add a variety of frame types and then a padding frame.
1463 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001464 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001465 EXPECT_TRUE(
1466 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1467 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001468 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001469
1470 QuicFrame frame;
1471 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001472 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
fayang62b637b2019-09-16 08:40:49 -07001473 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1474 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1475 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001476 size_t consumed = frame.stream_frame.data_length;
1477 EXPECT_EQ(4u, consumed);
1478 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001479 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001480
1481 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001482 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001483 EXPECT_TRUE(
1484 creator_.AddSavedFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
1485 EXPECT_TRUE(creator_.HasPendingFrames());
1486 EXPECT_EQ(0u, creator_.BytesFree());
1487
1488 // Packet is full. Creator will flush.
1489 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1490 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1491 EXPECT_FALSE(
1492 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1493
1494 // Ensure the packet is successfully created.
1495 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1496 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1497 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1498 ASSERT_EQ(1u, retransmittable.size());
1499 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1500 EXPECT_TRUE(serialized_packet_.has_ack);
1501 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1502 DeleteSerializedPacket();
1503
1504 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001505 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001506 EXPECT_EQ(max_plaintext_size -
1507 GetPacketHeaderSize(
1508 client_framer_.transport_version(),
1509 creator_.GetDestinationConnectionIdLength(),
1510 creator_.GetSourceConnectionIdLength(),
1511 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1512 !kIncludeDiversificationNonce,
1513 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1514 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1515 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1516 creator_.BytesFree());
1517}
1518
1519TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1520 if (!GetParam().version_serialization) {
1521 creator_.StopSendingVersion();
1522 }
1523 EXPECT_FALSE(creator_.HasPendingFrames());
1524
1525 MakeIOVector("test", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001526 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1527 iov_.iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001528 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1529 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1530 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001531 StrictMock<MockDebugDelegate> debug;
1532 creator_.set_debug_delegate(&debug);
1533 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001534 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001535 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1536 NOT_RETRANSMISSION, &num_bytes_consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001537 EXPECT_EQ(4u, num_bytes_consumed);
1538
1539 // Ensure the packet is successfully created.
1540 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1541 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1542 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1543 ASSERT_EQ(1u, retransmittable.size());
1544 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1545 DeleteSerializedPacket();
1546
1547 EXPECT_FALSE(creator_.HasPendingFrames());
1548}
1549
nharperebabffd2019-06-03 17:34:45 -07001550TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1551 // Regression test to check that CreateAndSerializeStreamFrame uses a
1552 // correctly formatted stream frame header when appending padding.
1553
1554 if (!GetParam().version_serialization) {
1555 creator_.StopSendingVersion();
1556 }
1557 EXPECT_FALSE(creator_.HasPendingFrames());
1558
1559 // Send one byte of stream data.
1560 MakeIOVector("a", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001561 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1562 iov_.iov_len);
nharperebabffd2019-06-03 17:34:45 -07001563 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1564 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1565 size_t num_bytes_consumed;
1566 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001567 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1568 NOT_RETRANSMISSION, &num_bytes_consumed);
nharperebabffd2019-06-03 17:34:45 -07001569 EXPECT_EQ(1u, num_bytes_consumed);
1570
1571 // Check that a packet is created.
1572 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1573 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1574 {
1575 InSequence s;
1576 EXPECT_CALL(framer_visitor_, OnPacket());
1577 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1578 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1579 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1580 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1581 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1582 if (client_framer_.version().HasHeaderProtection()) {
1583 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1584 }
1585 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1586 }
1587 ProcessPacket(serialized_packet_);
1588}
1589
QUICHE teama6ef0a62019-03-07 20:34:33 -05001590TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1591 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1592 if (!IsDefaultTestConfiguration()) {
1593 return;
1594 }
1595
QUICHE team6987b4a2019-03-15 16:23:04 -07001596 creator_.set_encryption_level(ENCRYPTION_INITIAL);
fkastenholz85f18902019-05-28 12:47:00 -07001597 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001598 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1599 /*fin=*/false, 0u, QuicStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001600 EXPECT_QUIC_BUG(
1601 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001602 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1603}
1604
1605TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1606 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1607 if (!IsDefaultTestConfiguration()) {
1608 return;
1609 }
1610
1611 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
fkastenholz85f18902019-05-28 12:47:00 -07001612 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001613 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1614 /*fin=*/false, 0u, QuicStringPiece());
fayang49523232019-05-03 06:28:22 -07001615 EXPECT_QUIC_BUG(
1616 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
1617 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001618}
1619
1620TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1621 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1622 if (!IsDefaultTestConfiguration()) {
1623 return;
1624 }
1625
QUICHE teamdc41bf12019-03-20 12:58:42 -07001626 // This test only matters when the crypto handshake is sent in stream frames.
1627 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1628 // frames.
1629 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1630 return;
1631 }
1632
QUICHE teama6ef0a62019-03-07 20:34:33 -05001633 CryptoHandshakeMessage message;
1634 message.set_tag(kCHLO);
dschinazi66dea072019-04-09 11:41:06 -07001635 message.set_minimum_size(kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001636 CryptoFramer framer;
1637 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001638 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001639
1640 struct iovec iov;
1641 MakeIOVector(QuicStringPiece(message_data->data(), message_data->length()),
1642 &iov);
1643 QuicFrame frame;
fkastenholz85f18902019-05-28 12:47:00 -07001644 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
fayang62b637b2019-09-16 08:40:49 -07001645 EXPECT_QUIC_BUG(
1646 creator_.ConsumeDataToFillCurrentPacket(
1647 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1648 &iov, 1u, iov.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION,
1649 &frame),
1650 "Client hello won't fit in a single packet.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001651}
1652
1653TEST_P(QuicPacketCreatorTest, PendingPadding) {
1654 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1655 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1656 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1657
1658 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1659 .WillRepeatedly(
1660 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1661 // Flush all paddings.
1662 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001663 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001664 {
1665 InSequence s;
1666 EXPECT_CALL(framer_visitor_, OnPacket());
1667 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1668 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1669 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1670 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1671 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1672 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1673 }
1674 // Packet only contains padding.
1675 ProcessPacket(serialized_packet_);
1676 }
1677 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1678}
1679
1680TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001681 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001682 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1683 QuicFrame frame;
1684 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001685 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1686 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001687 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001688 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001689 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1690 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1691 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001692 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001693 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1694}
1695
QUICHE teama6ef0a62019-03-07 20:34:33 -05001696TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001697 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001698 const QuicByteCount kStreamFramePayloadSize = 100u;
1699 // Set the packet size be enough for one stream frame with 0 stream offset +
1700 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001701 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1702 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001703 size_t length =
1704 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1705 GetEncryptionOverhead() +
1706 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001707 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001708 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1709 kStreamFramePayloadSize + 1;
1710 creator_.SetMaxPacketLength(length);
1711 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1712 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1713 QuicFrame frame;
1714 char buf[kStreamFramePayloadSize + 1] = {};
1715 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1716 .WillRepeatedly(
1717 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1718 // Send stream frame of size kStreamFramePayloadSize.
1719 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001720 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1721 0u, 0u, false, false,
1722 NOT_RETRANSMISSION, &frame);
1723 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001724 // 1 byte padding is sent.
1725 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1726 // Send stream frame of size kStreamFramePayloadSize + 1.
1727 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize + 1), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001728 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1729 0u, kStreamFramePayloadSize, false,
1730 false, NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001731 // No padding is sent.
fayang62b637b2019-09-16 08:40:49 -07001732 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001733 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1734 // Flush all paddings.
1735 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001736 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001737 }
1738 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1739}
1740
1741TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001742 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
dschinazi66dea072019-04-09 11:41:06 -07001743 char external_buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001744 char* expected_buffer = external_buffer;
1745 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1746
1747 QuicFrame frame;
1748 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001749 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1750 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001751 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001752 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001753 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1754
1755 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1756 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1757 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1758 ClearSerializedPacket(serialized_packet);
1759 }));
fayang62b637b2019-09-16 08:40:49 -07001760 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001761}
1762
1763// Test for error found in
1764// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1765// length that crosses an IETF VarInt length boundary would cause a
1766// failure. While this test is not applicable to versions other than version 99,
1767// it should still work. Hence, it is not made version-specific.
1768TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1769 QuicAckFrame ack_frame =
1770 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1771 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1772 frames_.push_back(QuicFrame(&ack_frame));
1773 SerializeAllFrames(frames_);
1774}
1775
1776TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
fayangd4291e42019-05-30 10:31:21 -07001777 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001778 return;
1779 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001780 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001781 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1782 .Times(3)
1783 .WillRepeatedly(
1784 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1785 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1786 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001787 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1788 creator_.GetCurrentLargestMessagePayload()));
1789 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001790 QuicMessageFrame* message_frame =
1791 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001792 EXPECT_TRUE(
1793 creator_.AddSavedFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
1794 EXPECT_TRUE(creator_.HasPendingFrames());
fayang62b637b2019-09-16 08:40:49 -07001795 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001796
wub553a9662019-03-28 20:13:23 -07001797 QuicMessageFrame* frame2 =
1798 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001799 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
1800 EXPECT_TRUE(creator_.HasPendingFrames());
1801 // Verify if a new frame is added, 1 byte message length will be added.
1802 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001803 QuicMessageFrame* frame3 =
1804 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001805 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
1806 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
fayang62b637b2019-09-16 08:40:49 -07001807 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001808
1809 QuicFrame frame;
1810 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001811 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1812 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001813 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1814 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1815 NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001816 QuicMessageFrame* frame4 =
1817 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001818 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
1819 EXPECT_TRUE(creator_.HasPendingFrames());
1820 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001821 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1822 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001823 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001824 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001825 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
1826 EXPECT_FALSE(creator_.HasPendingFrames());
1827}
1828
1829TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
fayangd4291e42019-05-30 10:31:21 -07001830 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001831 return;
1832 }
vasilvvc48c8712019-03-11 13:38:16 -07001833 std::string message_data(kDefaultMaxPacketSize, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001834 QuicStringPiece message_buffer(message_data);
1835 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001836 // Test all possible encryption levels of message frames.
1837 for (EncryptionLevel level :
1838 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1839 creator_.set_encryption_level(level);
1840 // Test all possible sizes of message frames.
1841 for (size_t message_size = 0;
1842 message_size <= creator_.GetCurrentLargestMessagePayload();
1843 ++message_size) {
1844 QuicMessageFrame* frame = new QuicMessageFrame(
1845 0, MakeSpan(&allocator_,
1846 QuicStringPiece(message_buffer.data(), message_size),
1847 &storage));
1848 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame), NOT_RETRANSMISSION));
1849 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001850
ianswettb239f862019-04-05 09:15:06 -07001851 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1852 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1853 // Verify BytesFree returns bytes available for the next frame, which
1854 // should subtract the message length.
1855 size_t expected_bytes_free =
1856 creator_.GetCurrentLargestMessagePayload() - message_size <
1857 expansion_bytes
1858 ? 0
1859 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1860 message_size;
1861 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1862 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1863 creator_.GetCurrentLargestMessagePayload());
1864 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1865 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001866 creator_.FlushCurrentPacket();
ianswettb239f862019-04-05 09:15:06 -07001867 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1868 DeleteSerializedPacket();
1869 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001870 }
1871}
1872
nharperd43f1d62019-07-01 15:18:20 -07001873// Regression test for bugfix of GetPacketHeaderSize.
1874TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
renjietang4c704c82019-10-07 16:39:11 -07001875 QuicTransportVersion version = creator_.transport_version();
nharperd43f1d62019-07-01 15:18:20 -07001876 if (!VersionSupportsMessageFrames(version)) {
1877 return;
1878 }
1879 QuicPacketLength expected_largest_payload = 1319;
1880 if (QuicVersionHasLongHeaderLengths(version)) {
1881 expected_largest_payload -= 2;
1882 }
dschinazi48ac9192019-07-31 00:07:26 -07001883 if (GetParam().version.HasLengthPrefixedConnectionIds()) {
1884 expected_largest_payload -= 1;
1885 }
nharperd43f1d62019-07-01 15:18:20 -07001886 EXPECT_EQ(expected_largest_payload,
1887 creator_.GetGuaranteedLargestMessagePayload());
1888}
1889
QUICHE teama6ef0a62019-03-07 20:34:33 -05001890TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001891 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001892
1893 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1894 QuicFrame ack_frame(&temp_ack_frame);
1895 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1896
QUICHE teamdc41bf12019-03-20 12:58:42 -07001897 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1898 client_framer_.transport_version(), Perspective::IS_CLIENT);
1899 QuicFrame stream_frame(QuicStreamFrame(stream_id,
1900 /*fin=*/false, 0u, QuicStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001901 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1902
1903 QuicFrame padding_frame{QuicPaddingFrame()};
1904 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1905
1906 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1907 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1908
1909 EXPECT_TRUE(creator_.AddSavedFrame(ack_frame, LOSS_RETRANSMISSION));
1910 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1911
1912 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame, RTO_RETRANSMISSION));
1913 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1914
1915 EXPECT_TRUE(creator_.AddSavedFrame(padding_frame, TLP_RETRANSMISSION));
fayang62b637b2019-09-16 08:40:49 -07001916 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001917 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1918
fayangcff885a2019-10-22 07:39:04 -07001919 // The last retransmittable frame on packet is a stream frame, the packet's
1920 // transmission type should be the same as the stream frame's.
1921 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001922 DeleteSerializedPacket();
1923}
1924
1925TEST_P(QuicPacketCreatorTest, RetryToken) {
1926 if (!GetParam().version_serialization ||
1927 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1928 return;
1929 }
1930
1931 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1932 9, 10, 11, 12, 13, 14, 15, 16};
1933
1934 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001935 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001936
QUICHE teamdc41bf12019-03-20 12:58:42 -07001937 std::string data("a");
1938 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1939 QuicStreamFrame stream_frame(
1940 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1941 /*fin=*/false, 0u, QuicStringPiece());
1942 frames_.push_back(QuicFrame(stream_frame));
1943 } else {
1944 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1945 frames_.push_back(
1946 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1947 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001948 SerializedPacket serialized = SerializeAllFrames(frames_);
1949
1950 QuicPacketHeader header;
1951 {
1952 InSequence s;
1953 EXPECT_CALL(framer_visitor_, OnPacket());
1954 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1955 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1956 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1957 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1958 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001959 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1960 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1961 } else {
1962 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1963 }
nharper55fa6132019-05-07 19:37:21 -07001964 if (client_framer_.version().HasHeaderProtection()) {
1965 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1966 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001967 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1968 }
1969 ProcessPacket(serialized);
1970 ASSERT_TRUE(header.version_flag);
1971 ASSERT_EQ(header.long_packet_type, INITIAL);
1972 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1973 test::CompareCharArraysWithHexError(
1974 "retry token", header.retry_token.data(), header.retry_token.length(),
1975 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001976 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001977}
1978
QUICHE team2252b702019-05-14 23:55:14 -04001979TEST_P(QuicPacketCreatorTest, GetConnectionId) {
QUICHE team2252b702019-05-14 23:55:14 -04001980 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1981 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1982}
1983
dschinazi346b7ce2019-06-05 01:38:18 -07001984TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
dschinazi346b7ce2019-06-05 01:38:18 -07001985 if (!client_framer_.version().SupportsClientConnectionIds()) {
1986 return;
1987 }
1988 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1989 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1990 creator_.SetClientConnectionId(TestConnectionId(0x33));
1991 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1992 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
1993}
1994
renjietangdbe98342019-10-18 11:00:57 -07001995TEST_P(QuicPacketCreatorTest, CoalesceStreamFrames) {
1996 InSequence s;
1997 if (!GetParam().version_serialization) {
1998 creator_.StopSendingVersion();
1999 }
2000 SetQuicReloadableFlag(quic_coalesce_stream_frames, true);
2001 const size_t max_plaintext_size =
2002 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
2003 EXPECT_FALSE(creator_.HasPendingFrames());
2004 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2005 QuicStreamId stream_id1 = QuicUtils::GetFirstBidirectionalStreamId(
2006 client_framer_.transport_version(), Perspective::IS_CLIENT);
2007 QuicStreamId stream_id2 = GetNthClientInitiatedStreamId(1);
2008 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2009 EXPECT_EQ(max_plaintext_size -
2010 GetPacketHeaderSize(
2011 client_framer_.transport_version(),
2012 creator_.GetDestinationConnectionIdLength(),
2013 creator_.GetSourceConnectionIdLength(),
2014 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2015 !kIncludeDiversificationNonce,
2016 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2017 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
2018 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
2019 creator_.BytesFree());
2020 StrictMock<MockDebugDelegate> debug;
2021 creator_.set_debug_delegate(&debug);
2022
2023 MakeIOVector("test", &iov_);
2024 QuicFrame frame;
2025 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2026 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2027 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2028 NOT_RETRANSMISSION, &frame));
2029 EXPECT_TRUE(creator_.HasPendingFrames());
2030 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2031
2032 MakeIOVector("coalesce", &iov_);
2033 // frame will be coalesced with the first frame.
2034 const auto previous_size = creator_.PacketSize();
renjietang2a6ba792019-10-22 10:44:58 -07002035 QuicStreamFrame target(stream_id1, true, 0, 12);
2036 EXPECT_CALL(debug, OnStreamFrameCoalesced(target));
renjietangdbe98342019-10-18 11:00:57 -07002037 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2038 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 4u, true, false,
2039 NOT_RETRANSMISSION, &frame));
2040 EXPECT_EQ(frame.stream_frame.data_length,
2041 creator_.PacketSize() - previous_size);
renjietangdbe98342019-10-18 11:00:57 -07002042
2043 // frame is for another stream, so it won't be coalesced.
2044 const auto length = creator_.BytesFree() - 10u;
renjietang7f46be32019-10-21 16:55:17 -07002045 std::string large_data(length, 'x');
renjietangdbe98342019-10-18 11:00:57 -07002046 MakeIOVector(large_data, &iov_);
2047 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2048 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2049 stream_id2, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2050 NOT_RETRANSMISSION, &frame));
2051 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id2));
2052
2053 // The packet doesn't have enough free bytes for all data, but will still be
2054 // able to consume and coalesce part of them.
2055 EXPECT_CALL(debug, OnStreamFrameCoalesced(_));
2056 MakeIOVector("somerandomdata", &iov_);
2057 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2058 stream_id2, &iov_, 1u, iov_.iov_len, 0u, length, false, false,
2059 NOT_RETRANSMISSION, &frame));
2060
2061 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2062 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2063 creator_.FlushCurrentPacket();
2064 EXPECT_CALL(framer_visitor_, OnPacket());
2065 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2066 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2067 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2068 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2069 // The packet should only have 2 stream frames.
2070 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2071 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2072 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2073 ProcessPacket(serialized_packet_);
2074}
2075
fayang51152fd2019-10-21 06:48:09 -07002076TEST_P(QuicPacketCreatorTest, SaveNonRetransmittableFrames) {
fayang58f71072019-11-05 08:47:02 -08002077 if (!GetQuicReloadableFlag(quic_populate_nonretransmittable_frames) &&
2078 !client_framer_.version().CanSendCoalescedPackets()) {
fayang51152fd2019-10-21 06:48:09 -07002079 return;
2080 }
2081 QuicAckFrame ack_frame(InitAckFrame(1));
2082 frames_.push_back(QuicFrame(&ack_frame));
2083 frames_.push_back(QuicFrame(QuicPaddingFrame(-1)));
2084 SerializedPacket serialized = SerializeAllFrames(frames_);
2085 ASSERT_EQ(2u, serialized.nonretransmittable_frames.size());
2086 EXPECT_EQ(ACK_FRAME, serialized.nonretransmittable_frames[0].type);
2087 EXPECT_EQ(PADDING_FRAME, serialized.nonretransmittable_frames[1].type);
fayangeb268412019-10-21 14:05:38 -07002088 // Verify full padding frame is translated to a padding frame with actual
2089 // bytes of padding.
2090 EXPECT_LT(
2091 0,
2092 serialized.nonretransmittable_frames[1].padding_frame.num_padding_bytes);
fayang51152fd2019-10-21 06:48:09 -07002093 frames_.clear();
2094
2095 // Serialize another packet with the same frames.
2096 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
2097 &creator_, serialized.nonretransmittable_frames, buffer_,
2098 kMaxOutgoingPacketSize);
2099 // Verify the packet length of both packets are equal.
2100 EXPECT_EQ(serialized.encrypted_length, packet.encrypted_length);
2101}
2102
fayang08750832019-10-24 11:25:34 -07002103TEST_P(QuicPacketCreatorTest, SerializeCoalescedPacket) {
2104 if (!GetQuicReloadableFlag(quic_populate_nonretransmittable_frames)) {
2105 return;
2106 }
2107 QuicCoalescedPacket coalesced;
2108 SimpleBufferAllocator allocator;
2109 QuicSocketAddress self_address(QuicIpAddress::Loopback4(), 1);
2110 QuicSocketAddress peer_address(QuicIpAddress::Loopback4(), 2);
2111 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2112 EncryptionLevel level = static_cast<EncryptionLevel>(i);
2113 creator_.set_encryption_level(level);
2114 QuicAckFrame ack_frame(InitAckFrame(1));
2115 frames_.push_back(QuicFrame(&ack_frame));
2116 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
2117 frames_.push_back(
2118 QuicFrame(QuicStreamFrame(1, false, 0u, QuicStringPiece())));
2119 }
2120 SerializedPacket serialized = SerializeAllFrames(frames_);
2121 EXPECT_EQ(level, serialized.encryption_level);
2122 frames_.clear();
2123 ASSERT_TRUE(coalesced.MaybeCoalescePacket(serialized, self_address,
2124 peer_address, &allocator,
2125 creator_.max_packet_length()));
2126 }
2127 char buffer[kMaxOutgoingPacketSize];
2128 size_t coalesced_length = creator_.SerializeCoalescedPacket(
2129 coalesced, buffer, kMaxOutgoingPacketSize);
2130 // Verify packet is padded to full.
2131 ASSERT_EQ(coalesced.max_packet_length(), coalesced_length);
2132 if (!QuicVersionHasLongHeaderLengths(server_framer_.transport_version())) {
2133 return;
2134 }
2135 // Verify packet process.
2136 std::unique_ptr<QuicEncryptedPacket> packets[NUM_ENCRYPTION_LEVELS];
2137 packets[ENCRYPTION_INITIAL] =
bnc40d0fa52019-10-29 11:40:48 -07002138 std::make_unique<QuicEncryptedPacket>(buffer, coalesced_length);
fayang08750832019-10-24 11:25:34 -07002139 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2140 InSequence s;
2141 EXPECT_CALL(framer_visitor_, OnPacket());
2142 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2143 if (i < ENCRYPTION_FORWARD_SECURE) {
2144 // Save coalesced packet.
2145 EXPECT_CALL(framer_visitor_, OnCoalescedPacket(_))
2146 .WillOnce(Invoke([i, &packets](const QuicEncryptedPacket& packet) {
2147 packets[i + 1] = packet.Clone();
2148 }));
2149 }
2150 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2151 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2152 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2153 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _)).WillOnce(Return(true));
2154 EXPECT_CALL(framer_visitor_,
2155 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
2156 .WillOnce(Return(true));
2157 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(_)).WillOnce(Return(true));
2158 if (i == ENCRYPTION_INITIAL) {
2159 // Verify padding is added.
2160 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2161 } else {
2162 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(testing::AtMost(1));
2163 }
2164 if (i != ENCRYPTION_INITIAL && i != ENCRYPTION_HANDSHAKE) {
2165 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2166 }
2167 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2168
2169 server_framer_.ProcessPacket(*packets[i]);
2170 }
2171}
2172
fayang2ab1e852019-11-04 11:24:36 -08002173TEST_P(QuicPacketCreatorTest, SoftMaxPacketLength) {
2174 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2175 QuicByteCount previous_max_packet_length = creator_.max_packet_length();
2176 const size_t overhead =
2177 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2178 QuicPacketCreator::MinPlaintextPacketSize(client_framer_.version()) +
2179 GetEncryptionOverhead();
2180 // Make sure a length which cannot accommodate header (includes header
2181 // protection minimal length) gets rejected.
2182 creator_.SetSoftMaxPacketLength(overhead - 1);
2183 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2184
2185 creator_.SetSoftMaxPacketLength(overhead);
2186 EXPECT_EQ(overhead, creator_.max_packet_length());
2187
2188 // Verify creator has room for stream frame because max_packet_length_ gets
2189 // restored.
2190 ASSERT_TRUE(creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
2191 kMaxIetfVarInt, kMaxIetfVarInt));
2192 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2193
2194 // Same for message frame.
2195 if (VersionSupportsMessageFrames(client_framer_.transport_version())) {
2196 creator_.SetSoftMaxPacketLength(overhead);
2197 // Verify GetCurrentLargestMessagePayload is based on the actual
2198 // max_packet_length.
2199 EXPECT_LT(1u, creator_.GetCurrentLargestMessagePayload());
2200 EXPECT_EQ(overhead, creator_.max_packet_length());
2201 ASSERT_TRUE(creator_.HasRoomForMessageFrame(
2202 creator_.GetCurrentLargestMessagePayload()));
2203 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2204 }
2205
2206 // Verify creator can consume crypto data because max_packet_length_ gets
2207 // restored.
2208 creator_.SetSoftMaxPacketLength(overhead);
2209 EXPECT_EQ(overhead, creator_.max_packet_length());
2210 std::string data = "crypto data";
2211 MakeIOVector(data, &iov_);
2212 QuicFrame frame;
2213 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
2214 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2215 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
2216 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
2217 &frame));
2218 size_t bytes_consumed = frame.stream_frame.data_length;
2219 EXPECT_LT(0u, bytes_consumed);
2220 } else {
2221 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
2222 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
2223 ENCRYPTION_INITIAL, data.length(), kOffset,
2224 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
2225 size_t bytes_consumed = frame.crypto_frame->data_length;
2226 EXPECT_LT(0u, bytes_consumed);
2227 }
2228 EXPECT_TRUE(creator_.HasPendingFrames());
2229 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2230 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2231 creator_.FlushCurrentPacket();
2232
2233 // Verify ACK frame can be consumed.
2234 creator_.SetSoftMaxPacketLength(overhead);
2235 EXPECT_EQ(overhead, creator_.max_packet_length());
2236 QuicAckFrame ack_frame(InitAckFrame(10u));
2237 EXPECT_TRUE(
2238 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
2239 EXPECT_TRUE(creator_.HasPendingFrames());
2240}
2241
QUICHE teama6ef0a62019-03-07 20:34:33 -05002242} // namespace
2243} // namespace test
2244} // namespace quic