blob: 437f76c53f2aedb724ec06cc96015cdbce308a23 [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"
QUICHE teama6ef0a62019-03-07 20:34:33 -050025#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050026#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
27#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
28#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
29#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
30#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
31#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
32
33using testing::_;
34using testing::DoAll;
35using testing::InSequence;
36using testing::Invoke;
37using testing::Return;
38using testing::SaveArg;
39using testing::StrictMock;
40
41namespace quic {
42namespace test {
43namespace {
44
renjietang4c704c82019-10-07 16:39:11 -070045const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
46// Use fields in which each byte is distinct to ensure that every byte is
47// framed correctly. The values are otherwise arbitrary.
dschinazi423adc72019-10-23 09:58:55 -070048QuicConnectionId CreateTestConnectionId() {
49 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
50}
renjietang4c704c82019-10-07 16:39:11 -070051
QUICHE teama6ef0a62019-03-07 20:34:33 -050052// Run tests with combinations of {ParsedQuicVersion,
53// ToggleVersionSerialization}.
54struct TestParams {
55 TestParams(ParsedQuicVersion version, bool version_serialization)
56 : version(version), version_serialization(version_serialization) {}
57
QUICHE teama6ef0a62019-03-07 20:34:33 -050058 ParsedQuicVersion version;
59 bool version_serialization;
60};
61
dschinazi142051a2019-09-18 18:17:29 -070062// Used by ::testing::PrintToStringParamName().
63std::string PrintToString(const TestParams& p) {
64 return QuicStrCat(ParsedQuicVersionToString(p.version), "_",
65 (p.version_serialization ? "Include" : "No"), "Version");
66}
67
QUICHE teama6ef0a62019-03-07 20:34:33 -050068// Constructs various test permutations.
69std::vector<TestParams> GetTestParams() {
70 std::vector<TestParams> params;
71 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
72 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
73 params.push_back(TestParams(all_supported_versions[i], true));
74 params.push_back(TestParams(all_supported_versions[i], false));
75 }
76 return params;
77}
78
rchc76cd742019-03-26 16:00:03 -070079class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
80 public:
81 ~MockDebugDelegate() override = default;
82
83 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame& frame));
renjietangdbe98342019-10-18 11:00:57 -070084
85 MOCK_METHOD1(OnStreamFrameCoalesced, void(const QuicStreamFrame& frame));
rchc76cd742019-03-26 16:00:03 -070086};
87
QUICHE teama6ef0a62019-03-07 20:34:33 -050088class TestPacketCreator : public QuicPacketCreator {
89 public:
90 TestPacketCreator(QuicConnectionId connection_id,
91 QuicFramer* framer,
92 DelegateInterface* delegate,
93 SimpleDataProducer* producer)
94 : QuicPacketCreator(connection_id, framer, delegate),
95 producer_(producer),
96 version_(framer->transport_version()) {}
97
fayang62b637b2019-09-16 08:40:49 -070098 bool ConsumeDataToFillCurrentPacket(QuicStreamId id,
99 const struct iovec* iov,
100 int iov_count,
101 size_t total_length,
102 size_t iov_offset,
103 QuicStreamOffset offset,
104 bool fin,
105 bool needs_full_padding,
106 TransmissionType transmission_type,
107 QuicFrame* frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500108 // Save data before data is consumed.
109 QuicByteCount data_length = total_length - iov_offset;
110 if (data_length > 0) {
111 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
112 }
fayang62b637b2019-09-16 08:40:49 -0700113 return QuicPacketCreator::ConsumeDataToFillCurrentPacket(
114 id, data_length - iov_offset, offset, fin, needs_full_padding,
115 transmission_type, frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500116 }
117
118 void StopSendingVersion() {
fayangd4291e42019-05-30 10:31:21 -0700119 if (VersionHasIetfInvariantHeader(version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500120 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
121 return;
122 }
123 QuicPacketCreator::StopSendingVersion();
124 }
125
126 SimpleDataProducer* producer_;
127 QuicTransportVersion version_;
128};
129
130class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
131 public:
132 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) {
133 if (serialized_packet == nullptr) {
134 return;
135 }
136 ClearSerializedPacket(serialized_packet);
137 }
138
139 void SaveSerializedPacket(SerializedPacket* serialized_packet) {
140 if (serialized_packet == nullptr) {
141 return;
142 }
143 delete[] serialized_packet_.encrypted_buffer;
144 serialized_packet_ = *serialized_packet;
145 serialized_packet_.encrypted_buffer = CopyBuffer(*serialized_packet);
146 serialized_packet->retransmittable_frames.clear();
147 }
148
149 void DeleteSerializedPacket() {
150 delete[] serialized_packet_.encrypted_buffer;
151 serialized_packet_.encrypted_buffer = nullptr;
152 ClearSerializedPacket(&serialized_packet_);
153 }
154
155 protected:
156 QuicPacketCreatorTest()
157 : connection_id_(TestConnectionId(2)),
158 server_framer_(SupportedVersions(GetParam().version),
159 QuicTime::Zero(),
160 Perspective::IS_SERVER,
161 connection_id_.length()),
162 client_framer_(SupportedVersions(GetParam().version),
163 QuicTime::Zero(),
164 Perspective::IS_CLIENT,
165 connection_id_.length()),
166 data_("foo"),
167 creator_(connection_id_, &client_framer_, &delegate_, &producer_),
168 serialized_packet_(creator_.NoPacket()) {
169 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
nharperc6b99512019-09-19 11:13:48 -0700170 creator_.SetEncrypter(ENCRYPTION_INITIAL, std::make_unique<NullEncrypter>(
171 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700172 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, std::make_unique<NullEncrypter>(
QUICHE team88ea0082019-03-15 10:05:26 -0700173 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700174 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, std::make_unique<NullEncrypter>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500175 Perspective::IS_CLIENT));
176 creator_.SetEncrypter(
177 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700178 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500179 client_framer_.set_visitor(&framer_visitor_);
180 server_framer_.set_visitor(&framer_visitor_);
181 client_framer_.set_data_producer(&producer_);
zhongyi546cc452019-04-12 15:27:49 -0700182 if (server_framer_.version().KnowsWhichDecrypterToUse()) {
183 server_framer_.InstallDecrypter(
nharperc6b99512019-09-19 11:13:48 -0700184 ENCRYPTION_INITIAL,
185 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
186 server_framer_.InstallDecrypter(
zhongyi546cc452019-04-12 15:27:49 -0700187 ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -0700188 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700189 server_framer_.InstallDecrypter(
190 ENCRYPTION_HANDSHAKE,
vasilvv0fc587f2019-09-06 13:33:08 -0700191 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700192 server_framer_.InstallDecrypter(
193 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700194 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
nharperc6b99512019-09-19 11:13:48 -0700195 } else {
196 server_framer_.SetDecrypter(
197 ENCRYPTION_INITIAL,
198 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700199 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500200 }
201
202 ~QuicPacketCreatorTest() override {
203 delete[] serialized_packet_.encrypted_buffer;
204 ClearSerializedPacket(&serialized_packet_);
205 }
206
207 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
208 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
dschinazi66dea072019-04-09 11:41:06 -0700209 &creator_, frames, buffer_, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500210 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
211 packet.encryption_level);
212 return packet;
213 }
214
215 void ProcessPacket(const SerializedPacket& packet) {
216 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
217 packet.encrypted_length);
218 server_framer_.ProcessPacket(encrypted_packet);
219 }
220
221 void CheckStreamFrame(const QuicFrame& frame,
222 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700223 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500224 QuicStreamOffset offset,
225 bool fin) {
226 EXPECT_EQ(STREAM_FRAME, frame.type);
227 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
dschinazi66dea072019-04-09 11:41:06 -0700228 char buf[kMaxOutgoingPacketSize];
229 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500230 if (frame.stream_frame.data_length > 0) {
231 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
232 frame.stream_frame.data_length, &writer);
233 }
234 EXPECT_EQ(data, QuicStringPiece(buf, frame.stream_frame.data_length));
235 EXPECT_EQ(offset, frame.stream_frame.offset);
236 EXPECT_EQ(fin, frame.stream_frame.fin);
237 }
238
239 // Returns the number of bytes consumed by the header of packet, including
240 // the version.
241 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
242 return GetPacketHeaderSize(
243 version, creator_.GetDestinationConnectionIdLength(),
244 creator_.GetSourceConnectionIdLength(),
245 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
246 !kIncludeDiversificationNonce,
247 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
248 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
249 QuicPacketCreatorPeer::GetLengthLength(&creator_));
250 }
251
252 // Returns the number of bytes of overhead that will be added to a packet
253 // of maximum length.
254 size_t GetEncryptionOverhead() {
255 return creator_.max_packet_length() -
256 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
257 }
258
259 // Returns the number of bytes consumed by the non-data fields of a stream
260 // frame, assuming it is the last frame in the packet
261 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
262 return QuicFramer::GetMinStreamFrameSize(
263 version, GetNthClientInitiatedStreamId(1), kOffset, true,
264 /* data_length= */ 0);
265 }
266
QUICHE teama6ef0a62019-03-07 20:34:33 -0500267 bool IsDefaultTestConfiguration() {
268 TestParams p = GetParam();
269 return p.version == AllSupportedVersions()[0] && p.version_serialization;
270 }
271
272 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
dschinazi552accc2019-06-17 17:07:34 -0700273 return QuicUtils::GetFirstBidirectionalStreamId(
274 creator_.transport_version(), Perspective::IS_CLIENT) +
275 n * 2;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500276 }
277
278 static const QuicStreamOffset kOffset = 0u;
279
dschinazi66dea072019-04-09 11:41:06 -0700280 char buffer_[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500281 QuicConnectionId connection_id_;
282 QuicFrames frames_;
283 QuicFramer server_framer_;
284 QuicFramer client_framer_;
285 StrictMock<MockFramerVisitor> framer_visitor_;
286 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700287 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500288 struct iovec iov_;
289 TestPacketCreator creator_;
290 SerializedPacket serialized_packet_;
291 SimpleDataProducer producer_;
292 SimpleBufferAllocator allocator_;
293};
294
295// Run all packet creator tests with all supported versions of QUIC, and with
296// and without version in the packet header, as well as doing a run for each
297// length of truncated connection id.
298INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
299 QuicPacketCreatorTest,
dschinazi142051a2019-09-18 18:17:29 -0700300 ::testing::ValuesIn(GetTestParams()),
301 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500302
303TEST_P(QuicPacketCreatorTest, SerializeFrames) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700304 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500305 EncryptionLevel level = static_cast<EncryptionLevel>(i);
306 creator_.set_encryption_level(level);
307 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700308 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
309 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang49523232019-05-03 06:28:22 -0700310 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700311 frames_.push_back(
312 QuicFrame(QuicStreamFrame(stream_id, false, 0u, QuicStringPiece())));
renjietangdbe98342019-10-18 11:00:57 -0700313 if (!GetQuicReloadableFlag(quic_coalesce_stream_frames)) {
314 frames_.push_back(
315 QuicFrame(QuicStreamFrame(stream_id, true, 0u, QuicStringPiece())));
316 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700317 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500318 SerializedPacket serialized = SerializeAllFrames(frames_);
319 EXPECT_EQ(level, serialized.encryption_level);
320 delete frames_[0].ack_frame;
321 frames_.clear();
322
323 {
324 InSequence s;
325 EXPECT_CALL(framer_visitor_, OnPacket());
326 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
327 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
328 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
329 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
330 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
331 .WillOnce(Return(true));
332 EXPECT_CALL(framer_visitor_,
333 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
334 .WillOnce(Return(true));
335 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
336 .WillOnce(Return(true));
fayang49523232019-05-03 06:28:22 -0700337 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700338 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
renjietangdbe98342019-10-18 11:00:57 -0700339 if (!GetQuicReloadableFlag(quic_coalesce_stream_frames)) {
340 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
341 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700342 }
nharperc32d8ab2019-10-09 11:09:06 -0700343 if (client_framer_.version().HasHeaderProtection()) {
344 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_))
345 .Times(testing::AnyNumber());
346 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500347 EXPECT_CALL(framer_visitor_, OnPacketComplete());
348 }
349 ProcessPacket(serialized);
350 }
351}
352
QUICHE teama6ef0a62019-03-07 20:34:33 -0500353TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
renjietang4c704c82019-10-07 16:39:11 -0700354 QuicConnectionCloseFrame frame(creator_.transport_version(), QUIC_NO_ERROR,
355 "error",
fkastenholz591814c2019-09-06 12:11:46 -0700356 /*transport_close_frame_type=*/0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500357
358 QuicFrames frames;
359 frames.push_back(QuicFrame(&frame));
360 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700361 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500362 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
363 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
364
365 InSequence s;
366 EXPECT_CALL(framer_visitor_, OnPacket());
367 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
368 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
369 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
370 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
371 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
372 EXPECT_CALL(framer_visitor_, OnPacketComplete());
373
374 ProcessPacket(serialized);
375}
376
fayang62b637b2019-09-16 08:40:49 -0700377TEST_P(QuicPacketCreatorTest, ConsumeCryptoDataToFillCurrentPacket) {
vasilvvc48c8712019-03-11 13:38:16 -0700378 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500379 QuicFrame frame;
fayang62b637b2019-09-16 08:40:49 -0700380 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
381 ENCRYPTION_INITIAL, data.length(), 0,
382 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500383 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
384 EXPECT_TRUE(creator_.HasPendingFrames());
385}
386
fayang62b637b2019-09-16 08:40:49 -0700387TEST_P(QuicPacketCreatorTest, ConsumeDataToFillCurrentPacket) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700388 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500389 QuicFrame frame;
390 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700391 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
392 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700393 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
394 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
395 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500396 size_t consumed = frame.stream_frame.data_length;
397 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700398 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500399 EXPECT_TRUE(creator_.HasPendingFrames());
400}
401
402TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700403 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500404 QuicFrame frame;
405 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700406 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
407 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700408 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
409 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
410 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500411 size_t consumed = frame.stream_frame.data_length;
412 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700413 CheckStreamFrame(frame, stream_id, "test", 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500414 EXPECT_TRUE(creator_.HasPendingFrames());
415}
416
417TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700418 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500419 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700420 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
421 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700422 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
423 stream_id, nullptr, 0u, 0u, 0u, 0u, true, false, NOT_RETRANSMISSION,
424 &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500425 size_t consumed = frame.stream_frame.data_length;
426 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700427 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500428 EXPECT_TRUE(creator_.HasPendingFrames());
429}
430
431TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
432 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
433 const size_t overhead =
434 GetPacketHeaderOverhead(client_framer_.transport_version()) +
435 GetEncryptionOverhead();
QUICHE team2252b702019-05-14 23:55:14 -0400436 for (size_t i = overhead + QuicPacketCreator::MinPlaintextPacketSize(
437 client_framer_.version());
nharper55fa6132019-05-07 19:37:21 -0700438 i < overhead + 100; ++i) {
439 SCOPED_TRACE(i);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500440 creator_.SetMaxPacketLength(i);
441 const bool should_have_room =
442 i >
443 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
444 ASSERT_EQ(should_have_room,
445 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
446 kOffset, /* data_size=*/0xffff));
447 if (should_have_room) {
448 QuicFrame frame;
449 MakeIOVector("testdata", &iov_);
450 EXPECT_CALL(delegate_, OnSerializedPacket(_))
451 .WillRepeatedly(Invoke(
452 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
fayang62b637b2019-09-16 08:40:49 -0700453 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
454 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u,
455 kOffset, false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500456 size_t bytes_consumed = frame.stream_frame.data_length;
457 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700458 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500459 }
460 }
461}
462
463TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
464 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
465 // Compute the total overhead for a single frame in packet.
466 const size_t overhead =
467 GetPacketHeaderOverhead(client_framer_.transport_version()) +
468 GetEncryptionOverhead() +
469 GetStreamFrameOverhead(client_framer_.transport_version());
470 size_t capacity = kDefaultMaxPacketSize - overhead;
471 // Now, test various sizes around this size.
472 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700473 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500474 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
475 QuicFrame frame;
476 MakeIOVector(data, &iov_);
fayang62b637b2019-09-16 08:40:49 -0700477 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
478 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
479 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500480
481 // BytesFree() returns bytes available for the next frame, which will
482 // be two bytes smaller since the stream frame would need to be grown.
483 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
484 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
485 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
486 EXPECT_CALL(delegate_, OnSerializedPacket(_))
487 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700488 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500489 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
490 DeleteSerializedPacket();
491 }
492}
493
494TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700495 // This test serializes crypto payloads slightly larger than a packet, which
496 // Causes the multi-packet ClientHello check to fail.
danzh88e3e052019-06-13 11:47:18 -0700497 SetQuicFlag(FLAGS_quic_enforce_single_packet_chlo, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500498 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700499 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500500 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700501 GetEncryptionOverhead();
502 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
dschinazi66dea072019-04-09 11:41:06 -0700503 overhead +=
504 QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxOutgoingPacketSize);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700505 } else {
506 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
507 }
dschinazi66dea072019-04-09 11:41:06 -0700508 ASSERT_GT(kMaxOutgoingPacketSize, overhead);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500509 size_t capacity = kDefaultMaxPacketSize - overhead;
510 // Now, test various sizes around this size.
511 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700512 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700513 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500514 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
515
516 QuicFrame frame;
517 MakeIOVector(data, &iov_);
518 EXPECT_CALL(delegate_, OnSerializedPacket(_))
519 .WillRepeatedly(
520 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700521 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
fayang62b637b2019-09-16 08:40:49 -0700522 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700523 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
524 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
525 &frame));
526 size_t bytes_consumed = frame.stream_frame.data_length;
527 EXPECT_LT(0u, bytes_consumed);
528 } else {
529 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
fayang62b637b2019-09-16 08:40:49 -0700530 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
nharper51961cf2019-05-13 13:23:24 -0700531 ENCRYPTION_INITIAL, data.length(), kOffset,
532 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700533 size_t bytes_consumed = frame.crypto_frame->data_length;
534 EXPECT_LT(0u, bytes_consumed);
535 }
fayang62b637b2019-09-16 08:40:49 -0700536 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500537 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
538 // If there is not enough space in the packet to fit a padding frame
539 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
540 // will not be padded.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700541 if (bytes_free < 3 &&
542 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500543 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
544 serialized_packet_.encrypted_length);
545 } else {
546 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
547 }
548 DeleteSerializedPacket();
549 }
550}
551
552TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
553 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
554 // Compute the total overhead for a single frame in packet.
555 const size_t overhead =
556 GetPacketHeaderOverhead(client_framer_.transport_version()) +
557 GetEncryptionOverhead() +
558 GetStreamFrameOverhead(client_framer_.transport_version());
559 ASSERT_GT(kDefaultMaxPacketSize, overhead);
560 size_t capacity = kDefaultMaxPacketSize - overhead;
561 // Now, test various sizes around this size.
562 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700563 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500564 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
565
566 QuicFrame frame;
567 MakeIOVector(data, &iov_);
568 EXPECT_CALL(delegate_, OnSerializedPacket(_))
569 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700570 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
571 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
572 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500573 size_t bytes_consumed = frame.stream_frame.data_length;
574 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700575 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500576 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
577 if (bytes_free > 0) {
578 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
579 serialized_packet_.encrypted_length);
580 } else {
581 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
582 }
583 DeleteSerializedPacket();
584 }
585}
586
587TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
588 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
589 ParsedQuicVersionVector versions;
590 versions.push_back(test::QuicVersionMax());
fayangd4291e42019-05-30 10:31:21 -0700591 const bool ietf_quic =
renjietang4c704c82019-10-07 16:39:11 -0700592 VersionHasIetfInvariantHeader(creator_.transport_version());
dschinazi48ac9192019-07-31 00:07:26 -0700593 const bool has_length_prefix =
594 GetParam().version.HasLengthPrefixedConnectionIds();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500595 std::unique_ptr<QuicEncryptedPacket> encrypted(
dschinazi48ac9192019-07-31 00:07:26 -0700596 creator_.SerializeVersionNegotiationPacket(ietf_quic, has_length_prefix,
597 versions));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500598
599 {
600 InSequence s;
601 EXPECT_CALL(framer_visitor_, OnPacket());
602 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
603 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
604 }
605 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
606 client_framer_.ProcessPacket(*encrypted);
607}
608
renjietang4c704c82019-10-07 16:39:11 -0700609// Test that the path challenge connectivity probing packet is serialized
610// correctly as a padded PATH CHALLENGE packet.
611TEST_P(QuicPacketCreatorTest, BuildPathChallengePacket) {
612 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
613 // This frame is only for IETF QUIC.
614 return;
615 }
616
617 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700618 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700619 header.reset_flag = false;
620 header.version_flag = false;
621 header.packet_number = kPacketNumber;
622 QuicPathFrameBuffer payload;
623
624 // clang-format off
625 unsigned char packet[] = {
626 // type (short header, 4 byte packet number)
627 0x43,
628 // connection_id
629 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
630 // packet number
631 0x12, 0x34, 0x56, 0x78,
632
633 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
634 0x1a,
635 // 8 "random" bytes, MockRandom makes lots of r's
636 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
637 // frame type (padding frame)
638 0x00,
639 0x00, 0x00, 0x00, 0x00
640 };
641 // clang-format on
642
643 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
644 MockRandom randomizer;
645
646 size_t length = creator_.BuildPaddedPathChallengePacket(
647 header, buffer.get(), QUIC_ARRAYSIZE(packet), &payload, &randomizer,
648 ENCRYPTION_INITIAL);
649 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
650
651 // Payload has the random bytes that were generated. Copy them into packet,
652 // above, before checking that the generated packet is correct.
653 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
654
655 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
656 header);
657
658 test::CompareCharArraysWithHexError(
659 "constructed packet", data.data(), data.length(),
660 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
661}
662
663TEST_P(QuicPacketCreatorTest, BuildConnectivityProbingPacket) {
664 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700665 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700666 header.reset_flag = false;
667 header.version_flag = false;
668 header.packet_number = kPacketNumber;
669
670 // clang-format off
671 unsigned char packet[] = {
672 // public flags (8 byte connection_id)
673 0x2C,
674 // connection_id
675 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
676 // packet number
677 0x12, 0x34, 0x56, 0x78,
678
679 // frame type (ping frame)
680 0x07,
681 // frame type (padding frame)
682 0x00,
683 0x00, 0x00, 0x00, 0x00
684 };
685
686 unsigned char packet46[] = {
687 // type (short header, 4 byte packet number)
688 0x43,
689 // connection_id
690 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
691 // packet number
692 0x12, 0x34, 0x56, 0x78,
693
694 // frame type
695 0x07,
696 // frame type (padding frame)
697 0x00,
698 0x00, 0x00, 0x00, 0x00
699 };
700
701 unsigned char packet99[] = {
702 // type (short header, 4 byte packet number)
703 0x43,
704 // connection_id
705 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
706 // packet number
707 0x12, 0x34, 0x56, 0x78,
708
709 // frame type (IETF_PING frame)
710 0x01,
711 // frame type (padding frame)
712 0x00,
713 0x00, 0x00, 0x00, 0x00
714 };
715 // clang-format on
716
717 unsigned char* p = packet;
718 size_t packet_size = QUIC_ARRAYSIZE(packet);
719 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
720 p = packet99;
721 packet_size = QUIC_ARRAYSIZE(packet99);
722 } else if (creator_.transport_version() >= QUIC_VERSION_46) {
723 p = packet46;
724 packet_size = QUIC_ARRAYSIZE(packet46);
725 }
726
727 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
728
729 size_t length = creator_.BuildConnectivityProbingPacket(
730 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
731
732 EXPECT_NE(0u, length);
733 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
734 header);
735
736 test::CompareCharArraysWithHexError("constructed packet", data.data(),
737 data.length(), reinterpret_cast<char*>(p),
738 packet_size);
739}
740
741// Several tests that the path response connectivity probing packet is
742// serialized correctly as either a padded and unpadded PATH RESPONSE
743// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
744// exercised the single- and multiple- payload cases.
745TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponseUnpadded) {
746 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
747 // This frame is only for IETF QUIC.
748 return;
749 }
750
751 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700752 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700753 header.reset_flag = false;
754 header.version_flag = false;
755 header.packet_number = kPacketNumber;
756 QuicPathFrameBuffer payload0 = {
757 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
758
759 // Build 1 PATH RESPONSE, not padded
760 // clang-format off
761 unsigned char packet[] = {
762 // type (short header, 4 byte packet number)
763 0x43,
764 // connection_id
765 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
766 // packet number
767 0x12, 0x34, 0x56, 0x78,
768
769 // Path Response Frame type (IETF_PATH_RESPONSE)
770 0x1b,
771 // 8 "random" bytes
772 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
773 };
774 // clang-format on
775 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
776 QuicDeque<QuicPathFrameBuffer> payloads;
777 payloads.push_back(payload0);
778 size_t length = creator_.BuildPathResponsePacket(
779 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
780 /*is_padded=*/false, ENCRYPTION_INITIAL);
781 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
782 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
783 header);
784
785 test::CompareCharArraysWithHexError(
786 "constructed packet", data.data(), data.length(),
787 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
788}
789
790TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponsePadded) {
791 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
792 // This frame is only for IETF QUIC.
793 return;
794 }
795
796 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700797 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700798 header.reset_flag = false;
799 header.version_flag = false;
800 header.packet_number = kPacketNumber;
801 QuicPathFrameBuffer payload0 = {
802 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
803
804 // Build 1 PATH RESPONSE, padded
805 // clang-format off
806 unsigned char packet[] = {
807 // type (short header, 4 byte packet number)
808 0x43,
809 // connection_id
810 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
811 // packet number
812 0x12, 0x34, 0x56, 0x78,
813
814 // Path Response Frame type (IETF_PATH_RESPONSE)
815 0x1b,
816 // 8 "random" bytes
817 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
818 // Padding type and pad
819 0x00, 0x00, 0x00, 0x00, 0x00
820 };
821 // clang-format on
822 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
823 QuicDeque<QuicPathFrameBuffer> payloads;
824 payloads.push_back(payload0);
825 size_t length = creator_.BuildPathResponsePacket(
826 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
827 /*is_padded=*/true, ENCRYPTION_INITIAL);
828 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
829 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
830 header);
831
832 test::CompareCharArraysWithHexError(
833 "constructed packet", data.data(), data.length(),
834 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
835}
836
837TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesUnpadded) {
838 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
839 // This frame is only for IETF QUIC.
840 return;
841 }
842
843 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700844 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700845 header.reset_flag = false;
846 header.version_flag = false;
847 header.packet_number = kPacketNumber;
848 QuicPathFrameBuffer payload0 = {
849 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
850 QuicPathFrameBuffer payload1 = {
851 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
852 QuicPathFrameBuffer payload2 = {
853 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
854
855 // Build one packet with 3 PATH RESPONSES, no padding
856 // clang-format off
857 unsigned char packet[] = {
858 // type (short header, 4 byte packet number)
859 0x43,
860 // connection_id
861 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
862 // packet number
863 0x12, 0x34, 0x56, 0x78,
864
865 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
866 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
867 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
868 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
869 };
870 // clang-format on
871
872 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
873 QuicDeque<QuicPathFrameBuffer> payloads;
874 payloads.push_back(payload0);
875 payloads.push_back(payload1);
876 payloads.push_back(payload2);
877 size_t length = creator_.BuildPathResponsePacket(
878 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
879 /*is_padded=*/false, ENCRYPTION_INITIAL);
880 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
881 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
882 header);
883
884 test::CompareCharArraysWithHexError(
885 "constructed packet", data.data(), data.length(),
886 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
887}
888
889TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesPadded) {
890 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
891 // This frame is only for IETF QUIC.
892 return;
893 }
894
895 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700896 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700897 header.reset_flag = false;
898 header.version_flag = false;
899 header.packet_number = kPacketNumber;
900 QuicPathFrameBuffer payload0 = {
901 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
902 QuicPathFrameBuffer payload1 = {
903 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
904 QuicPathFrameBuffer payload2 = {
905 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
906
907 // Build one packet with 3 PATH RESPONSES, with padding
908 // clang-format off
909 unsigned char packet[] = {
910 // type (short header, 4 byte packet number)
911 0x43,
912 // connection_id
913 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
914 // packet number
915 0x12, 0x34, 0x56, 0x78,
916
917 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
918 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
919 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
920 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
921 // Padding
922 0x00, 0x00, 0x00, 0x00, 0x00
923 };
924 // clang-format on
925
926 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
927 QuicDeque<QuicPathFrameBuffer> payloads;
928 payloads.push_back(payload0);
929 payloads.push_back(payload1);
930 payloads.push_back(payload2);
931 size_t length = creator_.BuildPathResponsePacket(
932 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
933 /*is_padded=*/true, ENCRYPTION_INITIAL);
934 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
935 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
936 header);
937
938 test::CompareCharArraysWithHexError(
939 "constructed packet", data.data(), data.length(),
940 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
941}
942
QUICHE teama6ef0a62019-03-07 20:34:33 -0500943TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700944 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500945 EncryptionLevel level = static_cast<EncryptionLevel>(i);
946
947 creator_.set_encryption_level(level);
948
949 OwningSerializedPacketPointer encrypted;
renjietang4c704c82019-10-07 16:39:11 -0700950 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500951 QuicPathFrameBuffer payload = {
952 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
953 encrypted =
954 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
955 } else {
956 encrypted = creator_.SerializeConnectivityProbingPacket();
957 }
958 {
959 InSequence s;
960 EXPECT_CALL(framer_visitor_, OnPacket());
961 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
962 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
963 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
964 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
renjietang4c704c82019-10-07 16:39:11 -0700965 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500966 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
967 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
968 } else {
969 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
970 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
971 }
972 EXPECT_CALL(framer_visitor_, OnPacketComplete());
973 }
974 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
975 server_framer_.ProcessPacket(QuicEncryptedPacket(
976 encrypted->encrypted_buffer, encrypted->encrypted_length));
977 }
978}
979
980TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
renjietang4c704c82019-10-07 16:39:11 -0700981 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500982 return;
983 }
984 QuicPathFrameBuffer payload = {
985 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
986
QUICHE team6987b4a2019-03-15 16:23:04 -0700987 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500988 EncryptionLevel level = static_cast<EncryptionLevel>(i);
989
990 creator_.set_encryption_level(level);
991
992 OwningSerializedPacketPointer encrypted(
993 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
994 {
995 InSequence s;
996 EXPECT_CALL(framer_visitor_, OnPacket());
997 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
998 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
999 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1000 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1001 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
1002 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1003 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1004 }
1005 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
1006 server_framer_.ProcessPacket(QuicEncryptedPacket(
1007 encrypted->encrypted_buffer, encrypted->encrypted_length));
1008 }
1009}
1010
1011TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001012 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001013 return;
1014 }
1015 QuicPathFrameBuffer payload0 = {
1016 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1017
QUICHE team6987b4a2019-03-15 16:23:04 -07001018 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001019 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1020 creator_.set_encryption_level(level);
1021
1022 QuicDeque<QuicPathFrameBuffer> payloads;
1023 payloads.push_back(payload0);
1024
1025 OwningSerializedPacketPointer encrypted(
1026 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1027 true));
1028 {
1029 InSequence s;
1030 EXPECT_CALL(framer_visitor_, OnPacket());
1031 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1032 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1033 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1034 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1035 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1036 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1037 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1038 }
1039 server_framer_.ProcessPacket(QuicEncryptedPacket(
1040 encrypted->encrypted_buffer, encrypted->encrypted_length));
1041 }
1042}
1043
1044TEST_P(QuicPacketCreatorTest,
1045 SerializePathResponseProbePacket1PayloadUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001046 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001047 return;
1048 }
1049 QuicPathFrameBuffer payload0 = {
1050 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1051
QUICHE team6987b4a2019-03-15 16:23:04 -07001052 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001053 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1054 creator_.set_encryption_level(level);
1055
1056 QuicDeque<QuicPathFrameBuffer> payloads;
1057 payloads.push_back(payload0);
1058
1059 OwningSerializedPacketPointer encrypted(
1060 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1061 false));
1062 {
1063 InSequence s;
1064 EXPECT_CALL(framer_visitor_, OnPacket());
1065 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1066 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1067 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1068 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1069 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1070 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1071 }
1072 server_framer_.ProcessPacket(QuicEncryptedPacket(
1073 encrypted->encrypted_buffer, encrypted->encrypted_length));
1074 }
1075}
1076
1077TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001078 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001079 return;
1080 }
1081 QuicPathFrameBuffer payload0 = {
1082 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1083 QuicPathFrameBuffer payload1 = {
1084 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1085
QUICHE team6987b4a2019-03-15 16:23:04 -07001086 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001087 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1088 creator_.set_encryption_level(level);
1089
1090 QuicDeque<QuicPathFrameBuffer> payloads;
1091 payloads.push_back(payload0);
1092 payloads.push_back(payload1);
1093
1094 OwningSerializedPacketPointer encrypted(
1095 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1096 true));
1097 {
1098 InSequence s;
1099 EXPECT_CALL(framer_visitor_, OnPacket());
1100 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1101 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1102 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1103 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1104 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1105 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1106 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1107 }
1108 server_framer_.ProcessPacket(QuicEncryptedPacket(
1109 encrypted->encrypted_buffer, encrypted->encrypted_length));
1110 }
1111}
1112
1113TEST_P(QuicPacketCreatorTest,
1114 SerializePathResponseProbePacket2PayloadsUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001115 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001116 return;
1117 }
1118 QuicPathFrameBuffer payload0 = {
1119 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1120 QuicPathFrameBuffer payload1 = {
1121 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1122
QUICHE team6987b4a2019-03-15 16:23:04 -07001123 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001124 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1125 creator_.set_encryption_level(level);
1126
1127 QuicDeque<QuicPathFrameBuffer> payloads;
1128 payloads.push_back(payload0);
1129 payloads.push_back(payload1);
1130
1131 OwningSerializedPacketPointer encrypted(
1132 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1133 false));
1134 {
1135 InSequence s;
1136 EXPECT_CALL(framer_visitor_, OnPacket());
1137 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1138 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1139 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1140 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1141 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1142 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1143 }
1144 server_framer_.ProcessPacket(QuicEncryptedPacket(
1145 encrypted->encrypted_buffer, encrypted->encrypted_length));
1146 }
1147}
1148
1149TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001150 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001151 return;
1152 }
1153 QuicPathFrameBuffer payload0 = {
1154 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1155 QuicPathFrameBuffer payload1 = {
1156 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1157 QuicPathFrameBuffer payload2 = {
1158 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1159
QUICHE team6987b4a2019-03-15 16:23:04 -07001160 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001161 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1162 creator_.set_encryption_level(level);
1163
1164 QuicDeque<QuicPathFrameBuffer> payloads;
1165 payloads.push_back(payload0);
1166 payloads.push_back(payload1);
1167 payloads.push_back(payload2);
1168
1169 OwningSerializedPacketPointer encrypted(
1170 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1171 true));
1172 {
1173 InSequence s;
1174 EXPECT_CALL(framer_visitor_, OnPacket());
1175 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1176 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1177 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1178 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1179 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1180 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1181 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1182 }
1183 server_framer_.ProcessPacket(QuicEncryptedPacket(
1184 encrypted->encrypted_buffer, encrypted->encrypted_length));
1185 }
1186}
1187
1188TEST_P(QuicPacketCreatorTest,
1189 SerializePathResponseProbePacket3PayloadsUnpadded) {
renjietang4c704c82019-10-07 16:39:11 -07001190 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001191 return;
1192 }
1193 QuicPathFrameBuffer payload0 = {
1194 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1195 QuicPathFrameBuffer payload1 = {
1196 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1197 QuicPathFrameBuffer payload2 = {
1198 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1199
QUICHE team6987b4a2019-03-15 16:23:04 -07001200 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001201 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1202 creator_.set_encryption_level(level);
1203
1204 QuicDeque<QuicPathFrameBuffer> payloads;
1205 payloads.push_back(payload0);
1206 payloads.push_back(payload1);
1207 payloads.push_back(payload2);
1208
1209 OwningSerializedPacketPointer encrypted(
1210 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1211 false));
1212 InSequence s;
1213 EXPECT_CALL(framer_visitor_, OnPacket());
1214 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1215 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1216 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1217 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1218 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1219 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1220
1221 server_framer_.ProcessPacket(QuicEncryptedPacket(
1222 encrypted->encrypted_buffer, encrypted->encrypted_length));
1223 }
1224}
1225
1226TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
renjietang4c704c82019-10-07 16:39:11 -07001227 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001228 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001229 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1230 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1231 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1232 } else {
1233 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1234 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1235 }
1236
1237 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1238 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1239 10000 / kDefaultMaxPacketSize);
1240 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1241 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1242
1243 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1244 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1245 10000 / kDefaultMaxPacketSize);
1246 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1247 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1248
1249 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1250 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1251 10000 / kDefaultMaxPacketSize);
1252 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1253 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1254
1255 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1256 UINT64_C(64) * 256 * 256 * 256 * 256);
1257 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1258 10000 / kDefaultMaxPacketSize);
1259 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1260 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1261}
1262
1263TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1264 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001265 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001266 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001267 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1268 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1269 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1270 } else {
1271 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1272 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1273 }
1274
1275 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1276 10000 / kDefaultMaxPacketSize);
1277 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1278 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1279
1280 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1281 10000 * 256 / kDefaultMaxPacketSize);
1282 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1283 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1284
1285 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1286 10000 * 256 * 256 / kDefaultMaxPacketSize);
1287 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1288 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1289
1290 creator_.UpdatePacketNumberLength(
1291 QuicPacketNumber(1),
1292 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1293 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1294 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1295}
1296
fayang4c1c2362019-09-13 07:20:01 -07001297TEST_P(QuicPacketCreatorTest, SkipNPacketNumbers) {
1298 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001299 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang4c1c2362019-09-13 07:20:01 -07001300 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1301 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1302 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1303 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1304 } else {
1305 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1306 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1307 }
1308 creator_.SkipNPacketNumbers(63, QuicPacketNumber(2),
1309 10000 / kDefaultMaxPacketSize);
1310 EXPECT_EQ(QuicPacketNumber(64), creator_.packet_number());
1311 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1312 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1313
1314 creator_.SkipNPacketNumbers(64 * 255, QuicPacketNumber(2),
1315 10000 / kDefaultMaxPacketSize);
1316 EXPECT_EQ(QuicPacketNumber(64 * 256), creator_.packet_number());
1317 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1318 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1319
1320 creator_.SkipNPacketNumbers(64 * 256 * 255, QuicPacketNumber(2),
1321 10000 / kDefaultMaxPacketSize);
1322 EXPECT_EQ(QuicPacketNumber(64 * 256 * 256), creator_.packet_number());
1323 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1324 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1325}
1326
QUICHE teama6ef0a62019-03-07 20:34:33 -05001327TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1328 if (!GetParam().version_serialization) {
1329 creator_.StopSendingVersion();
1330 }
nharper55fa6132019-05-07 19:37:21 -07001331 std::string data("test data");
1332 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1333 QuicStreamFrame stream_frame(
1334 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1335 /*fin=*/false, 0u, QuicStringPiece());
1336 frames_.push_back(QuicFrame(stream_frame));
1337 } else {
1338 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1339 frames_.push_back(
1340 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1341 }
1342 SerializedPacket serialized = SerializeAllFrames(frames_);
1343
1344 QuicPacketHeader header;
1345 {
1346 InSequence s;
1347 EXPECT_CALL(framer_visitor_, OnPacket());
1348 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1349 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1350 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1351 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1352 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1353 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1354 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1355 } else {
1356 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1357 }
1358 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1359 }
1360 ProcessPacket(serialized);
1361 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1362 DeleteFrames(&frames_);
1363}
1364
1365TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
1366 if (!GetParam().version_serialization) {
1367 creator_.StopSendingVersion();
1368 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001369 std::string data("a");
1370 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1371 QuicStreamFrame stream_frame(
1372 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1373 /*fin=*/false, 0u, QuicStringPiece());
1374 frames_.push_back(QuicFrame(stream_frame));
1375 } else {
1376 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1377 frames_.push_back(
1378 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1379 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001380 SerializedPacket serialized = SerializeAllFrames(frames_);
1381
1382 QuicPacketHeader header;
1383 {
1384 InSequence s;
1385 EXPECT_CALL(framer_visitor_, OnPacket());
1386 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1387 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1388 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1389 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1390 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001391 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1392 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1393 } else {
1394 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1395 }
nharper55fa6132019-05-07 19:37:21 -07001396 if (client_framer_.version().HasHeaderProtection()) {
1397 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1398 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001399 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1400 }
1401 ProcessPacket(serialized);
1402 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001403 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001404}
1405
1406TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1407 if (!GetParam().version_serialization) {
1408 creator_.StopSendingVersion();
1409 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001410 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001411 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001412 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001413 size_t payload_length = creator_.max_packet_length();
1414 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001415 MakeIOVector(too_long_payload, &iov_);
1416 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1417 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001418 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1419 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001420 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1421 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
1422 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001423 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001424 // The entire payload could not be consumed.
1425 EXPECT_GT(payload_length, consumed);
fayang62b637b2019-09-16 08:40:49 -07001426 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001427 DeleteSerializedPacket();
1428}
1429
1430TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1431 if (!GetParam().version_serialization) {
1432 creator_.StopSendingVersion();
1433 }
1434 const size_t max_plaintext_size =
1435 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1436 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001437 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1438 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1439 client_framer_.transport_version(), Perspective::IS_CLIENT);
1440 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1441 stream_id =
1442 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1443 }
1444 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001445 EXPECT_EQ(max_plaintext_size -
1446 GetPacketHeaderSize(
1447 client_framer_.transport_version(),
1448 creator_.GetDestinationConnectionIdLength(),
1449 creator_.GetSourceConnectionIdLength(),
1450 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1451 !kIncludeDiversificationNonce,
1452 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1453 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1454 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1455 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001456 StrictMock<MockDebugDelegate> debug;
1457 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001458
1459 // Add a variety of frame types and then a padding frame.
1460 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001461 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001462 EXPECT_TRUE(
1463 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1464 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001465 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001466
1467 QuicFrame frame;
1468 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001469 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
fayang62b637b2019-09-16 08:40:49 -07001470 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1471 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1472 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001473 size_t consumed = frame.stream_frame.data_length;
1474 EXPECT_EQ(4u, consumed);
1475 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001476 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001477
1478 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001479 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001480 EXPECT_TRUE(
1481 creator_.AddSavedFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
1482 EXPECT_TRUE(creator_.HasPendingFrames());
1483 EXPECT_EQ(0u, creator_.BytesFree());
1484
1485 // Packet is full. Creator will flush.
1486 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1487 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1488 EXPECT_FALSE(
1489 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1490
1491 // Ensure the packet is successfully created.
1492 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1493 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1494 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1495 ASSERT_EQ(1u, retransmittable.size());
1496 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1497 EXPECT_TRUE(serialized_packet_.has_ack);
1498 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1499 DeleteSerializedPacket();
1500
1501 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001502 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001503 EXPECT_EQ(max_plaintext_size -
1504 GetPacketHeaderSize(
1505 client_framer_.transport_version(),
1506 creator_.GetDestinationConnectionIdLength(),
1507 creator_.GetSourceConnectionIdLength(),
1508 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1509 !kIncludeDiversificationNonce,
1510 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1511 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1512 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1513 creator_.BytesFree());
1514}
1515
1516TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1517 if (!GetParam().version_serialization) {
1518 creator_.StopSendingVersion();
1519 }
1520 EXPECT_FALSE(creator_.HasPendingFrames());
1521
1522 MakeIOVector("test", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001523 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1524 iov_.iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001525 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1526 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1527 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001528 StrictMock<MockDebugDelegate> debug;
1529 creator_.set_debug_delegate(&debug);
1530 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001531 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001532 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1533 NOT_RETRANSMISSION, &num_bytes_consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001534 EXPECT_EQ(4u, num_bytes_consumed);
1535
1536 // Ensure the packet is successfully created.
1537 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1538 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1539 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1540 ASSERT_EQ(1u, retransmittable.size());
1541 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1542 DeleteSerializedPacket();
1543
1544 EXPECT_FALSE(creator_.HasPendingFrames());
1545}
1546
nharperebabffd2019-06-03 17:34:45 -07001547TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1548 // Regression test to check that CreateAndSerializeStreamFrame uses a
1549 // correctly formatted stream frame header when appending padding.
1550
1551 if (!GetParam().version_serialization) {
1552 creator_.StopSendingVersion();
1553 }
1554 EXPECT_FALSE(creator_.HasPendingFrames());
1555
1556 // Send one byte of stream data.
1557 MakeIOVector("a", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001558 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1559 iov_.iov_len);
nharperebabffd2019-06-03 17:34:45 -07001560 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1561 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1562 size_t num_bytes_consumed;
1563 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001564 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1565 NOT_RETRANSMISSION, &num_bytes_consumed);
nharperebabffd2019-06-03 17:34:45 -07001566 EXPECT_EQ(1u, num_bytes_consumed);
1567
1568 // Check that a packet is created.
1569 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1570 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1571 {
1572 InSequence s;
1573 EXPECT_CALL(framer_visitor_, OnPacket());
1574 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1575 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1576 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1577 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1578 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1579 if (client_framer_.version().HasHeaderProtection()) {
1580 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1581 }
1582 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1583 }
1584 ProcessPacket(serialized_packet_);
1585}
1586
QUICHE teama6ef0a62019-03-07 20:34:33 -05001587TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1588 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1589 if (!IsDefaultTestConfiguration()) {
1590 return;
1591 }
1592
QUICHE team6987b4a2019-03-15 16:23:04 -07001593 creator_.set_encryption_level(ENCRYPTION_INITIAL);
fkastenholz85f18902019-05-28 12:47:00 -07001594 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001595 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1596 /*fin=*/false, 0u, QuicStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001597 EXPECT_QUIC_BUG(
1598 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001599 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1600}
1601
1602TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1603 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1604 if (!IsDefaultTestConfiguration()) {
1605 return;
1606 }
1607
1608 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
fkastenholz85f18902019-05-28 12:47:00 -07001609 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001610 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1611 /*fin=*/false, 0u, QuicStringPiece());
fayang49523232019-05-03 06:28:22 -07001612 EXPECT_QUIC_BUG(
1613 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
1614 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001615}
1616
1617TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1618 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1619 if (!IsDefaultTestConfiguration()) {
1620 return;
1621 }
1622
QUICHE teamdc41bf12019-03-20 12:58:42 -07001623 // This test only matters when the crypto handshake is sent in stream frames.
1624 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1625 // frames.
1626 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1627 return;
1628 }
1629
QUICHE teama6ef0a62019-03-07 20:34:33 -05001630 CryptoHandshakeMessage message;
1631 message.set_tag(kCHLO);
dschinazi66dea072019-04-09 11:41:06 -07001632 message.set_minimum_size(kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001633 CryptoFramer framer;
1634 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001635 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001636
1637 struct iovec iov;
1638 MakeIOVector(QuicStringPiece(message_data->data(), message_data->length()),
1639 &iov);
1640 QuicFrame frame;
fkastenholz85f18902019-05-28 12:47:00 -07001641 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
fayang62b637b2019-09-16 08:40:49 -07001642 EXPECT_QUIC_BUG(
1643 creator_.ConsumeDataToFillCurrentPacket(
1644 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1645 &iov, 1u, iov.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION,
1646 &frame),
1647 "Client hello won't fit in a single packet.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001648}
1649
1650TEST_P(QuicPacketCreatorTest, PendingPadding) {
1651 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1652 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1653 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1654
1655 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1656 .WillRepeatedly(
1657 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1658 // Flush all paddings.
1659 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001660 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001661 {
1662 InSequence s;
1663 EXPECT_CALL(framer_visitor_, OnPacket());
1664 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1665 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1666 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1667 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1668 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1669 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1670 }
1671 // Packet only contains padding.
1672 ProcessPacket(serialized_packet_);
1673 }
1674 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1675}
1676
1677TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001678 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001679 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1680 QuicFrame frame;
1681 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001682 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1683 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001684 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001685 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001686 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1687 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1688 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001689 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001690 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1691}
1692
QUICHE teama6ef0a62019-03-07 20:34:33 -05001693TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001694 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001695 const QuicByteCount kStreamFramePayloadSize = 100u;
1696 // Set the packet size be enough for one stream frame with 0 stream offset +
1697 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001698 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1699 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001700 size_t length =
1701 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1702 GetEncryptionOverhead() +
1703 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001704 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001705 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1706 kStreamFramePayloadSize + 1;
1707 creator_.SetMaxPacketLength(length);
1708 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1709 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1710 QuicFrame frame;
1711 char buf[kStreamFramePayloadSize + 1] = {};
1712 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1713 .WillRepeatedly(
1714 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1715 // Send stream frame of size kStreamFramePayloadSize.
1716 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001717 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1718 0u, 0u, false, false,
1719 NOT_RETRANSMISSION, &frame);
1720 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001721 // 1 byte padding is sent.
1722 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1723 // Send stream frame of size kStreamFramePayloadSize + 1.
1724 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize + 1), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001725 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1726 0u, kStreamFramePayloadSize, false,
1727 false, NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001728 // No padding is sent.
fayang62b637b2019-09-16 08:40:49 -07001729 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001730 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1731 // Flush all paddings.
1732 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001733 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001734 }
1735 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1736}
1737
1738TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001739 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
dschinazi66dea072019-04-09 11:41:06 -07001740 char external_buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001741 char* expected_buffer = external_buffer;
1742 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1743
1744 QuicFrame frame;
1745 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001746 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1747 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001748 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001749 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001750 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1751
1752 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1753 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1754 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1755 ClearSerializedPacket(serialized_packet);
1756 }));
fayang62b637b2019-09-16 08:40:49 -07001757 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001758}
1759
1760// Test for error found in
1761// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1762// length that crosses an IETF VarInt length boundary would cause a
1763// failure. While this test is not applicable to versions other than version 99,
1764// it should still work. Hence, it is not made version-specific.
1765TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1766 QuicAckFrame ack_frame =
1767 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1768 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1769 frames_.push_back(QuicFrame(&ack_frame));
1770 SerializeAllFrames(frames_);
1771}
1772
1773TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
fayangd4291e42019-05-30 10:31:21 -07001774 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001775 return;
1776 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001777 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001778 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1779 .Times(3)
1780 .WillRepeatedly(
1781 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1782 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1783 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001784 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1785 creator_.GetCurrentLargestMessagePayload()));
1786 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001787 QuicMessageFrame* message_frame =
1788 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001789 EXPECT_TRUE(
1790 creator_.AddSavedFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
1791 EXPECT_TRUE(creator_.HasPendingFrames());
fayang62b637b2019-09-16 08:40:49 -07001792 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001793
wub553a9662019-03-28 20:13:23 -07001794 QuicMessageFrame* frame2 =
1795 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001796 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
1797 EXPECT_TRUE(creator_.HasPendingFrames());
1798 // Verify if a new frame is added, 1 byte message length will be added.
1799 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001800 QuicMessageFrame* frame3 =
1801 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001802 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
1803 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
fayang62b637b2019-09-16 08:40:49 -07001804 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001805
1806 QuicFrame frame;
1807 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001808 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1809 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001810 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1811 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1812 NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001813 QuicMessageFrame* frame4 =
1814 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001815 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
1816 EXPECT_TRUE(creator_.HasPendingFrames());
1817 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001818 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1819 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001820 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001821 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001822 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
1823 EXPECT_FALSE(creator_.HasPendingFrames());
1824}
1825
1826TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
fayangd4291e42019-05-30 10:31:21 -07001827 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001828 return;
1829 }
vasilvvc48c8712019-03-11 13:38:16 -07001830 std::string message_data(kDefaultMaxPacketSize, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001831 QuicStringPiece message_buffer(message_data);
1832 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001833 // Test all possible encryption levels of message frames.
1834 for (EncryptionLevel level :
1835 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1836 creator_.set_encryption_level(level);
1837 // Test all possible sizes of message frames.
1838 for (size_t message_size = 0;
1839 message_size <= creator_.GetCurrentLargestMessagePayload();
1840 ++message_size) {
1841 QuicMessageFrame* frame = new QuicMessageFrame(
1842 0, MakeSpan(&allocator_,
1843 QuicStringPiece(message_buffer.data(), message_size),
1844 &storage));
1845 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame), NOT_RETRANSMISSION));
1846 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001847
ianswettb239f862019-04-05 09:15:06 -07001848 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1849 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1850 // Verify BytesFree returns bytes available for the next frame, which
1851 // should subtract the message length.
1852 size_t expected_bytes_free =
1853 creator_.GetCurrentLargestMessagePayload() - message_size <
1854 expansion_bytes
1855 ? 0
1856 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1857 message_size;
1858 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1859 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1860 creator_.GetCurrentLargestMessagePayload());
1861 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1862 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001863 creator_.FlushCurrentPacket();
ianswettb239f862019-04-05 09:15:06 -07001864 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1865 DeleteSerializedPacket();
1866 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001867 }
1868}
1869
nharperd43f1d62019-07-01 15:18:20 -07001870// Regression test for bugfix of GetPacketHeaderSize.
1871TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
renjietang4c704c82019-10-07 16:39:11 -07001872 QuicTransportVersion version = creator_.transport_version();
nharperd43f1d62019-07-01 15:18:20 -07001873 if (!VersionSupportsMessageFrames(version)) {
1874 return;
1875 }
1876 QuicPacketLength expected_largest_payload = 1319;
1877 if (QuicVersionHasLongHeaderLengths(version)) {
1878 expected_largest_payload -= 2;
1879 }
dschinazi48ac9192019-07-31 00:07:26 -07001880 if (GetParam().version.HasLengthPrefixedConnectionIds()) {
1881 expected_largest_payload -= 1;
1882 }
nharperd43f1d62019-07-01 15:18:20 -07001883 EXPECT_EQ(expected_largest_payload,
1884 creator_.GetGuaranteedLargestMessagePayload());
1885}
1886
QUICHE teama6ef0a62019-03-07 20:34:33 -05001887TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001888 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001889
1890 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1891 QuicFrame ack_frame(&temp_ack_frame);
1892 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1893
QUICHE teamdc41bf12019-03-20 12:58:42 -07001894 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1895 client_framer_.transport_version(), Perspective::IS_CLIENT);
1896 QuicFrame stream_frame(QuicStreamFrame(stream_id,
1897 /*fin=*/false, 0u, QuicStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001898 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1899
1900 QuicFrame padding_frame{QuicPaddingFrame()};
1901 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1902
1903 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1904 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1905
1906 EXPECT_TRUE(creator_.AddSavedFrame(ack_frame, LOSS_RETRANSMISSION));
1907 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1908
1909 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame, RTO_RETRANSMISSION));
1910 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1911
1912 EXPECT_TRUE(creator_.AddSavedFrame(padding_frame, TLP_RETRANSMISSION));
fayang62b637b2019-09-16 08:40:49 -07001913 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001914 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1915
fayangcff885a2019-10-22 07:39:04 -07001916 // The last retransmittable frame on packet is a stream frame, the packet's
1917 // transmission type should be the same as the stream frame's.
1918 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001919 DeleteSerializedPacket();
1920}
1921
1922TEST_P(QuicPacketCreatorTest, RetryToken) {
1923 if (!GetParam().version_serialization ||
1924 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1925 return;
1926 }
1927
1928 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1929 9, 10, 11, 12, 13, 14, 15, 16};
1930
1931 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001932 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001933
QUICHE teamdc41bf12019-03-20 12:58:42 -07001934 std::string data("a");
1935 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1936 QuicStreamFrame stream_frame(
1937 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1938 /*fin=*/false, 0u, QuicStringPiece());
1939 frames_.push_back(QuicFrame(stream_frame));
1940 } else {
1941 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1942 frames_.push_back(
1943 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1944 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001945 SerializedPacket serialized = SerializeAllFrames(frames_);
1946
1947 QuicPacketHeader header;
1948 {
1949 InSequence s;
1950 EXPECT_CALL(framer_visitor_, OnPacket());
1951 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1952 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1953 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1954 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1955 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001956 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1957 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1958 } else {
1959 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1960 }
nharper55fa6132019-05-07 19:37:21 -07001961 if (client_framer_.version().HasHeaderProtection()) {
1962 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1963 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001964 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1965 }
1966 ProcessPacket(serialized);
1967 ASSERT_TRUE(header.version_flag);
1968 ASSERT_EQ(header.long_packet_type, INITIAL);
1969 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1970 test::CompareCharArraysWithHexError(
1971 "retry token", header.retry_token.data(), header.retry_token.length(),
1972 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001973 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001974}
1975
QUICHE team2252b702019-05-14 23:55:14 -04001976TEST_P(QuicPacketCreatorTest, GetConnectionId) {
QUICHE team2252b702019-05-14 23:55:14 -04001977 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1978 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1979}
1980
dschinazi346b7ce2019-06-05 01:38:18 -07001981TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
dschinazi346b7ce2019-06-05 01:38:18 -07001982 if (!client_framer_.version().SupportsClientConnectionIds()) {
1983 return;
1984 }
1985 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1986 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1987 creator_.SetClientConnectionId(TestConnectionId(0x33));
1988 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1989 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
1990}
1991
renjietangdbe98342019-10-18 11:00:57 -07001992TEST_P(QuicPacketCreatorTest, CoalesceStreamFrames) {
1993 InSequence s;
1994 if (!GetParam().version_serialization) {
1995 creator_.StopSendingVersion();
1996 }
1997 SetQuicReloadableFlag(quic_coalesce_stream_frames, true);
1998 const size_t max_plaintext_size =
1999 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
2000 EXPECT_FALSE(creator_.HasPendingFrames());
2001 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2002 QuicStreamId stream_id1 = QuicUtils::GetFirstBidirectionalStreamId(
2003 client_framer_.transport_version(), Perspective::IS_CLIENT);
2004 QuicStreamId stream_id2 = GetNthClientInitiatedStreamId(1);
2005 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2006 EXPECT_EQ(max_plaintext_size -
2007 GetPacketHeaderSize(
2008 client_framer_.transport_version(),
2009 creator_.GetDestinationConnectionIdLength(),
2010 creator_.GetSourceConnectionIdLength(),
2011 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2012 !kIncludeDiversificationNonce,
2013 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2014 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
2015 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
2016 creator_.BytesFree());
2017 StrictMock<MockDebugDelegate> debug;
2018 creator_.set_debug_delegate(&debug);
2019
2020 MakeIOVector("test", &iov_);
2021 QuicFrame frame;
2022 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2023 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2024 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2025 NOT_RETRANSMISSION, &frame));
2026 EXPECT_TRUE(creator_.HasPendingFrames());
2027 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2028
2029 MakeIOVector("coalesce", &iov_);
2030 // frame will be coalesced with the first frame.
2031 const auto previous_size = creator_.PacketSize();
renjietang2a6ba792019-10-22 10:44:58 -07002032 QuicStreamFrame target(stream_id1, true, 0, 12);
2033 EXPECT_CALL(debug, OnStreamFrameCoalesced(target));
renjietangdbe98342019-10-18 11:00:57 -07002034 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2035 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 4u, true, false,
2036 NOT_RETRANSMISSION, &frame));
2037 EXPECT_EQ(frame.stream_frame.data_length,
2038 creator_.PacketSize() - previous_size);
renjietangdbe98342019-10-18 11:00:57 -07002039
2040 // frame is for another stream, so it won't be coalesced.
2041 const auto length = creator_.BytesFree() - 10u;
renjietang7f46be32019-10-21 16:55:17 -07002042 std::string large_data(length, 'x');
renjietangdbe98342019-10-18 11:00:57 -07002043 MakeIOVector(large_data, &iov_);
2044 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2045 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2046 stream_id2, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2047 NOT_RETRANSMISSION, &frame));
2048 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id2));
2049
2050 // The packet doesn't have enough free bytes for all data, but will still be
2051 // able to consume and coalesce part of them.
2052 EXPECT_CALL(debug, OnStreamFrameCoalesced(_));
2053 MakeIOVector("somerandomdata", &iov_);
2054 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2055 stream_id2, &iov_, 1u, iov_.iov_len, 0u, length, false, false,
2056 NOT_RETRANSMISSION, &frame));
2057
2058 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2059 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2060 creator_.FlushCurrentPacket();
2061 EXPECT_CALL(framer_visitor_, OnPacket());
2062 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2063 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2064 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2065 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2066 // The packet should only have 2 stream frames.
2067 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2068 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2069 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2070 ProcessPacket(serialized_packet_);
2071}
2072
fayang51152fd2019-10-21 06:48:09 -07002073TEST_P(QuicPacketCreatorTest, SaveNonRetransmittableFrames) {
2074 if (!GetQuicReloadableFlag(quic_populate_nonretransmittable_frames)) {
2075 return;
2076 }
2077 QuicAckFrame ack_frame(InitAckFrame(1));
2078 frames_.push_back(QuicFrame(&ack_frame));
2079 frames_.push_back(QuicFrame(QuicPaddingFrame(-1)));
2080 SerializedPacket serialized = SerializeAllFrames(frames_);
2081 ASSERT_EQ(2u, serialized.nonretransmittable_frames.size());
2082 EXPECT_EQ(ACK_FRAME, serialized.nonretransmittable_frames[0].type);
2083 EXPECT_EQ(PADDING_FRAME, serialized.nonretransmittable_frames[1].type);
fayangeb268412019-10-21 14:05:38 -07002084 // Verify full padding frame is translated to a padding frame with actual
2085 // bytes of padding.
2086 EXPECT_LT(
2087 0,
2088 serialized.nonretransmittable_frames[1].padding_frame.num_padding_bytes);
fayang51152fd2019-10-21 06:48:09 -07002089 frames_.clear();
2090
2091 // Serialize another packet with the same frames.
2092 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
2093 &creator_, serialized.nonretransmittable_frames, buffer_,
2094 kMaxOutgoingPacketSize);
2095 // Verify the packet length of both packets are equal.
2096 EXPECT_EQ(serialized.encrypted_length, packet.encrypted_length);
2097}
2098
QUICHE teama6ef0a62019-03-07 20:34:33 -05002099} // namespace
2100} // namespace test
2101} // namespace quic