blob: da6b5eaec016a36e8441a4c86c42187711246721 [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>
vasilvva57bbb32019-11-06 06:19:27 -08008#include <limits>
QUICHE teama6ef0a62019-03-07 20:34:33 -05009#include <memory>
10#include <ostream>
vasilvv872e7a32019-03-12 16:42:44 -070011#include <string>
bnc463f2352019-10-10 04:49:34 -070012#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -050013
zhongyi546cc452019-04-12 15:27:49 -070014#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050015#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
17#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
renjietangdbe98342019-10-18 11:00:57 -070018#include "net/third_party/quiche/src/quic/core/frames/quic_stream_frame.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050019#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050020#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
21#include "net/third_party/quiche/src/quic/core/quic_types.h"
22#include "net/third_party/quiche/src/quic/core/quic_utils.h"
renjietang4c704c82019-10-07 16:39:11 -070023#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050024#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
renjietangdbe98342019-10-18 11:00:57 -070025#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
fayang08750832019-10-24 11:25:34 -070026#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050027#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050028#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
29#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
30#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
31#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
32#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
33#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
fayang4245c212019-11-05 13:33:46 -080034#include "net/third_party/quiche/src/quic/test_tools/simple_quic_framer.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050035
36using testing::_;
37using testing::DoAll;
38using testing::InSequence;
39using testing::Invoke;
40using testing::Return;
41using testing::SaveArg;
42using testing::StrictMock;
43
44namespace quic {
45namespace test {
46namespace {
47
renjietang4c704c82019-10-07 16:39:11 -070048const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
49// Use fields in which each byte is distinct to ensure that every byte is
50// framed correctly. The values are otherwise arbitrary.
dschinazi423adc72019-10-23 09:58:55 -070051QuicConnectionId CreateTestConnectionId() {
52 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
53}
renjietang4c704c82019-10-07 16:39:11 -070054
QUICHE teama6ef0a62019-03-07 20:34:33 -050055// Run tests with combinations of {ParsedQuicVersion,
56// ToggleVersionSerialization}.
57struct TestParams {
58 TestParams(ParsedQuicVersion version, bool version_serialization)
59 : version(version), version_serialization(version_serialization) {}
60
QUICHE teama6ef0a62019-03-07 20:34:33 -050061 ParsedQuicVersion version;
62 bool version_serialization;
63};
64
dschinazi142051a2019-09-18 18:17:29 -070065// Used by ::testing::PrintToStringParamName().
66std::string PrintToString(const TestParams& p) {
67 return QuicStrCat(ParsedQuicVersionToString(p.version), "_",
68 (p.version_serialization ? "Include" : "No"), "Version");
69}
70
QUICHE teama6ef0a62019-03-07 20:34:33 -050071// Constructs various test permutations.
72std::vector<TestParams> GetTestParams() {
73 std::vector<TestParams> params;
74 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
75 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
76 params.push_back(TestParams(all_supported_versions[i], true));
77 params.push_back(TestParams(all_supported_versions[i], false));
78 }
79 return params;
80}
81
rchc76cd742019-03-26 16:00:03 -070082class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
83 public:
84 ~MockDebugDelegate() override = default;
85
86 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame& frame));
renjietangdbe98342019-10-18 11:00:57 -070087
88 MOCK_METHOD1(OnStreamFrameCoalesced, void(const QuicStreamFrame& frame));
rchc76cd742019-03-26 16:00:03 -070089};
90
QUICHE teama6ef0a62019-03-07 20:34:33 -050091class TestPacketCreator : public QuicPacketCreator {
92 public:
93 TestPacketCreator(QuicConnectionId connection_id,
94 QuicFramer* framer,
95 DelegateInterface* delegate,
96 SimpleDataProducer* producer)
97 : QuicPacketCreator(connection_id, framer, delegate),
98 producer_(producer),
99 version_(framer->transport_version()) {}
100
fayang62b637b2019-09-16 08:40:49 -0700101 bool ConsumeDataToFillCurrentPacket(QuicStreamId id,
102 const struct iovec* iov,
103 int iov_count,
104 size_t total_length,
105 size_t iov_offset,
106 QuicStreamOffset offset,
107 bool fin,
108 bool needs_full_padding,
109 TransmissionType transmission_type,
110 QuicFrame* frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500111 // Save data before data is consumed.
112 QuicByteCount data_length = total_length - iov_offset;
113 if (data_length > 0) {
114 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
115 }
fayang62b637b2019-09-16 08:40:49 -0700116 return QuicPacketCreator::ConsumeDataToFillCurrentPacket(
117 id, data_length - iov_offset, offset, fin, needs_full_padding,
118 transmission_type, frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500119 }
120
121 void StopSendingVersion() {
fayangd4291e42019-05-30 10:31:21 -0700122 if (VersionHasIetfInvariantHeader(version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500123 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
124 return;
125 }
126 QuicPacketCreator::StopSendingVersion();
127 }
128
129 SimpleDataProducer* producer_;
130 QuicTransportVersion version_;
131};
132
133class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
134 public:
135 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) {
136 if (serialized_packet == nullptr) {
137 return;
138 }
139 ClearSerializedPacket(serialized_packet);
140 }
141
142 void SaveSerializedPacket(SerializedPacket* serialized_packet) {
143 if (serialized_packet == nullptr) {
144 return;
145 }
146 delete[] serialized_packet_.encrypted_buffer;
147 serialized_packet_ = *serialized_packet;
148 serialized_packet_.encrypted_buffer = CopyBuffer(*serialized_packet);
149 serialized_packet->retransmittable_frames.clear();
150 }
151
152 void DeleteSerializedPacket() {
153 delete[] serialized_packet_.encrypted_buffer;
154 serialized_packet_.encrypted_buffer = nullptr;
155 ClearSerializedPacket(&serialized_packet_);
156 }
157
158 protected:
159 QuicPacketCreatorTest()
160 : connection_id_(TestConnectionId(2)),
161 server_framer_(SupportedVersions(GetParam().version),
162 QuicTime::Zero(),
163 Perspective::IS_SERVER,
164 connection_id_.length()),
165 client_framer_(SupportedVersions(GetParam().version),
166 QuicTime::Zero(),
167 Perspective::IS_CLIENT,
168 connection_id_.length()),
169 data_("foo"),
170 creator_(connection_id_, &client_framer_, &delegate_, &producer_),
171 serialized_packet_(creator_.NoPacket()) {
172 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
nharperc6b99512019-09-19 11:13:48 -0700173 creator_.SetEncrypter(ENCRYPTION_INITIAL, std::make_unique<NullEncrypter>(
174 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700175 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, std::make_unique<NullEncrypter>(
QUICHE team88ea0082019-03-15 10:05:26 -0700176 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700177 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, std::make_unique<NullEncrypter>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500178 Perspective::IS_CLIENT));
179 creator_.SetEncrypter(
180 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700181 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500182 client_framer_.set_visitor(&framer_visitor_);
183 server_framer_.set_visitor(&framer_visitor_);
184 client_framer_.set_data_producer(&producer_);
zhongyi546cc452019-04-12 15:27:49 -0700185 if (server_framer_.version().KnowsWhichDecrypterToUse()) {
186 server_framer_.InstallDecrypter(
nharperc6b99512019-09-19 11:13:48 -0700187 ENCRYPTION_INITIAL,
188 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
189 server_framer_.InstallDecrypter(
zhongyi546cc452019-04-12 15:27:49 -0700190 ENCRYPTION_ZERO_RTT,
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_HANDSHAKE,
vasilvv0fc587f2019-09-06 13:33:08 -0700194 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700195 server_framer_.InstallDecrypter(
196 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700197 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
nharperc6b99512019-09-19 11:13:48 -0700198 } else {
199 server_framer_.SetDecrypter(
200 ENCRYPTION_INITIAL,
201 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700202 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500203 }
204
205 ~QuicPacketCreatorTest() override {
206 delete[] serialized_packet_.encrypted_buffer;
207 ClearSerializedPacket(&serialized_packet_);
208 }
209
210 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
211 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
dschinazi66dea072019-04-09 11:41:06 -0700212 &creator_, frames, buffer_, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500213 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
214 packet.encryption_level);
215 return packet;
216 }
217
218 void ProcessPacket(const SerializedPacket& packet) {
219 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
220 packet.encrypted_length);
221 server_framer_.ProcessPacket(encrypted_packet);
222 }
223
224 void CheckStreamFrame(const QuicFrame& frame,
225 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700226 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500227 QuicStreamOffset offset,
228 bool fin) {
229 EXPECT_EQ(STREAM_FRAME, frame.type);
230 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
dschinazi66dea072019-04-09 11:41:06 -0700231 char buf[kMaxOutgoingPacketSize];
232 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500233 if (frame.stream_frame.data_length > 0) {
234 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
235 frame.stream_frame.data_length, &writer);
236 }
237 EXPECT_EQ(data, QuicStringPiece(buf, frame.stream_frame.data_length));
238 EXPECT_EQ(offset, frame.stream_frame.offset);
239 EXPECT_EQ(fin, frame.stream_frame.fin);
240 }
241
242 // Returns the number of bytes consumed by the header of packet, including
243 // the version.
244 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
245 return GetPacketHeaderSize(
246 version, creator_.GetDestinationConnectionIdLength(),
247 creator_.GetSourceConnectionIdLength(),
248 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
249 !kIncludeDiversificationNonce,
250 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
251 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
252 QuicPacketCreatorPeer::GetLengthLength(&creator_));
253 }
254
255 // Returns the number of bytes of overhead that will be added to a packet
256 // of maximum length.
257 size_t GetEncryptionOverhead() {
258 return creator_.max_packet_length() -
259 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
260 }
261
262 // Returns the number of bytes consumed by the non-data fields of a stream
263 // frame, assuming it is the last frame in the packet
264 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
265 return QuicFramer::GetMinStreamFrameSize(
266 version, GetNthClientInitiatedStreamId(1), kOffset, true,
267 /* data_length= */ 0);
268 }
269
QUICHE teama6ef0a62019-03-07 20:34:33 -0500270 bool IsDefaultTestConfiguration() {
271 TestParams p = GetParam();
272 return p.version == AllSupportedVersions()[0] && p.version_serialization;
273 }
274
275 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
dschinazi552accc2019-06-17 17:07:34 -0700276 return QuicUtils::GetFirstBidirectionalStreamId(
277 creator_.transport_version(), Perspective::IS_CLIENT) +
278 n * 2;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500279 }
280
281 static const QuicStreamOffset kOffset = 0u;
282
dschinazi66dea072019-04-09 11:41:06 -0700283 char buffer_[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500284 QuicConnectionId connection_id_;
285 QuicFrames frames_;
286 QuicFramer server_framer_;
287 QuicFramer client_framer_;
288 StrictMock<MockFramerVisitor> framer_visitor_;
289 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700290 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500291 struct iovec iov_;
292 TestPacketCreator creator_;
293 SerializedPacket serialized_packet_;
294 SimpleDataProducer producer_;
295 SimpleBufferAllocator allocator_;
296};
297
298// Run all packet creator tests with all supported versions of QUIC, and with
299// and without version in the packet header, as well as doing a run for each
300// length of truncated connection id.
301INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
302 QuicPacketCreatorTest,
dschinazi142051a2019-09-18 18:17:29 -0700303 ::testing::ValuesIn(GetTestParams()),
304 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500305
306TEST_P(QuicPacketCreatorTest, SerializeFrames) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700307 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500308 EncryptionLevel level = static_cast<EncryptionLevel>(i);
309 creator_.set_encryption_level(level);
310 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700311 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
312 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang49523232019-05-03 06:28:22 -0700313 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700314 frames_.push_back(
315 QuicFrame(QuicStreamFrame(stream_id, false, 0u, QuicStringPiece())));
renjietangdbe98342019-10-18 11:00:57 -0700316 if (!GetQuicReloadableFlag(quic_coalesce_stream_frames)) {
317 frames_.push_back(
318 QuicFrame(QuicStreamFrame(stream_id, true, 0u, QuicStringPiece())));
319 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700320 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500321 SerializedPacket serialized = SerializeAllFrames(frames_);
322 EXPECT_EQ(level, serialized.encryption_level);
323 delete frames_[0].ack_frame;
324 frames_.clear();
325
326 {
327 InSequence s;
328 EXPECT_CALL(framer_visitor_, OnPacket());
329 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
330 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
331 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
332 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
333 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
334 .WillOnce(Return(true));
335 EXPECT_CALL(framer_visitor_,
336 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
337 .WillOnce(Return(true));
338 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
339 .WillOnce(Return(true));
fayang49523232019-05-03 06:28:22 -0700340 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700341 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
renjietangdbe98342019-10-18 11:00:57 -0700342 if (!GetQuicReloadableFlag(quic_coalesce_stream_frames)) {
343 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
344 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700345 }
nharperc32d8ab2019-10-09 11:09:06 -0700346 if (client_framer_.version().HasHeaderProtection()) {
347 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_))
348 .Times(testing::AnyNumber());
349 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500350 EXPECT_CALL(framer_visitor_, OnPacketComplete());
351 }
352 ProcessPacket(serialized);
353 }
354}
355
QUICHE teama6ef0a62019-03-07 20:34:33 -0500356TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
renjietang4c704c82019-10-07 16:39:11 -0700357 QuicConnectionCloseFrame frame(creator_.transport_version(), QUIC_NO_ERROR,
358 "error",
fkastenholz591814c2019-09-06 12:11:46 -0700359 /*transport_close_frame_type=*/0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500360
361 QuicFrames frames;
362 frames.push_back(QuicFrame(&frame));
363 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700364 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500365 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
366 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
367
368 InSequence s;
369 EXPECT_CALL(framer_visitor_, OnPacket());
370 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
371 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
372 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
373 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
374 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
375 EXPECT_CALL(framer_visitor_, OnPacketComplete());
376
377 ProcessPacket(serialized);
378}
379
fayang62b637b2019-09-16 08:40:49 -0700380TEST_P(QuicPacketCreatorTest, ConsumeCryptoDataToFillCurrentPacket) {
vasilvvc48c8712019-03-11 13:38:16 -0700381 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500382 QuicFrame frame;
fayang62b637b2019-09-16 08:40:49 -0700383 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
384 ENCRYPTION_INITIAL, data.length(), 0,
385 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500386 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
387 EXPECT_TRUE(creator_.HasPendingFrames());
388}
389
fayang62b637b2019-09-16 08:40:49 -0700390TEST_P(QuicPacketCreatorTest, ConsumeDataToFillCurrentPacket) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700391 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500392 QuicFrame frame;
393 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700394 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
395 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700396 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
397 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
398 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500399 size_t consumed = frame.stream_frame.data_length;
400 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700401 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 EXPECT_TRUE(creator_.HasPendingFrames());
403}
404
405TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700406 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500407 QuicFrame frame;
408 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700409 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
410 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700411 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
412 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
413 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500414 size_t consumed = frame.stream_frame.data_length;
415 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700416 CheckStreamFrame(frame, stream_id, "test", 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500417 EXPECT_TRUE(creator_.HasPendingFrames());
418}
419
420TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700421 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500422 QuicFrame frame;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700423 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
424 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700425 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
426 stream_id, nullptr, 0u, 0u, 0u, 0u, true, false, NOT_RETRANSMISSION,
427 &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500428 size_t consumed = frame.stream_frame.data_length;
429 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700430 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500431 EXPECT_TRUE(creator_.HasPendingFrames());
432}
433
434TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
435 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
436 const size_t overhead =
437 GetPacketHeaderOverhead(client_framer_.transport_version()) +
438 GetEncryptionOverhead();
QUICHE team2252b702019-05-14 23:55:14 -0400439 for (size_t i = overhead + QuicPacketCreator::MinPlaintextPacketSize(
440 client_framer_.version());
nharper55fa6132019-05-07 19:37:21 -0700441 i < overhead + 100; ++i) {
442 SCOPED_TRACE(i);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500443 creator_.SetMaxPacketLength(i);
444 const bool should_have_room =
445 i >
446 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
447 ASSERT_EQ(should_have_room,
448 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
449 kOffset, /* data_size=*/0xffff));
450 if (should_have_room) {
451 QuicFrame frame;
452 MakeIOVector("testdata", &iov_);
453 EXPECT_CALL(delegate_, OnSerializedPacket(_))
454 .WillRepeatedly(Invoke(
455 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
fayang62b637b2019-09-16 08:40:49 -0700456 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
457 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u,
458 kOffset, false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500459 size_t bytes_consumed = frame.stream_frame.data_length;
460 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700461 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500462 }
463 }
464}
465
466TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
467 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
468 // Compute the total overhead for a single frame in packet.
469 const size_t overhead =
470 GetPacketHeaderOverhead(client_framer_.transport_version()) +
471 GetEncryptionOverhead() +
472 GetStreamFrameOverhead(client_framer_.transport_version());
473 size_t capacity = kDefaultMaxPacketSize - overhead;
474 // Now, test various sizes around this size.
475 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700476 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500477 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
478 QuicFrame frame;
479 MakeIOVector(data, &iov_);
fayang62b637b2019-09-16 08:40:49 -0700480 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
481 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
482 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500483
484 // BytesFree() returns bytes available for the next frame, which will
485 // be two bytes smaller since the stream frame would need to be grown.
486 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
487 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
488 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
489 EXPECT_CALL(delegate_, OnSerializedPacket(_))
490 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700491 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500492 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
493 DeleteSerializedPacket();
494 }
495}
496
497TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700498 // This test serializes crypto payloads slightly larger than a packet, which
499 // Causes the multi-packet ClientHello check to fail.
danzh88e3e052019-06-13 11:47:18 -0700500 SetQuicFlag(FLAGS_quic_enforce_single_packet_chlo, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500501 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700502 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500503 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700504 GetEncryptionOverhead();
505 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
dschinazi66dea072019-04-09 11:41:06 -0700506 overhead +=
507 QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxOutgoingPacketSize);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700508 } else {
509 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
510 }
dschinazi66dea072019-04-09 11:41:06 -0700511 ASSERT_GT(kMaxOutgoingPacketSize, overhead);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500512 size_t capacity = kDefaultMaxPacketSize - overhead;
513 // Now, test various sizes around this size.
514 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700515 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700516 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500517 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
518
519 QuicFrame frame;
520 MakeIOVector(data, &iov_);
521 EXPECT_CALL(delegate_, OnSerializedPacket(_))
522 .WillRepeatedly(
523 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700524 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
fayang62b637b2019-09-16 08:40:49 -0700525 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700526 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
527 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
528 &frame));
529 size_t bytes_consumed = frame.stream_frame.data_length;
530 EXPECT_LT(0u, bytes_consumed);
531 } else {
532 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
fayang62b637b2019-09-16 08:40:49 -0700533 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
nharper51961cf2019-05-13 13:23:24 -0700534 ENCRYPTION_INITIAL, data.length(), kOffset,
535 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700536 size_t bytes_consumed = frame.crypto_frame->data_length;
537 EXPECT_LT(0u, bytes_consumed);
538 }
fayang62b637b2019-09-16 08:40:49 -0700539 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500540 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
541 // If there is not enough space in the packet to fit a padding frame
542 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
543 // will not be padded.
fayang58f71072019-11-05 08:47:02 -0800544 // Padding is skipped when we try to send coalesced packets.
545 if ((bytes_free < 3 &&
546 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) ||
547 client_framer_.version().CanSendCoalescedPackets()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500548 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
549 serialized_packet_.encrypted_length);
550 } else {
551 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
552 }
553 DeleteSerializedPacket();
554 }
555}
556
557TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
558 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
559 // Compute the total overhead for a single frame in packet.
560 const size_t overhead =
561 GetPacketHeaderOverhead(client_framer_.transport_version()) +
562 GetEncryptionOverhead() +
563 GetStreamFrameOverhead(client_framer_.transport_version());
564 ASSERT_GT(kDefaultMaxPacketSize, overhead);
565 size_t capacity = kDefaultMaxPacketSize - overhead;
566 // Now, test various sizes around this size.
567 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700568 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500569 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
570
571 QuicFrame frame;
572 MakeIOVector(data, &iov_);
573 EXPECT_CALL(delegate_, OnSerializedPacket(_))
574 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700575 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
576 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
577 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500578 size_t bytes_consumed = frame.stream_frame.data_length;
579 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700580 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500581 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
582 if (bytes_free > 0) {
583 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
584 serialized_packet_.encrypted_length);
585 } else {
586 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
587 }
588 DeleteSerializedPacket();
589 }
590}
591
592TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
593 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
594 ParsedQuicVersionVector versions;
595 versions.push_back(test::QuicVersionMax());
fayangd4291e42019-05-30 10:31:21 -0700596 const bool ietf_quic =
renjietang4c704c82019-10-07 16:39:11 -0700597 VersionHasIetfInvariantHeader(creator_.transport_version());
dschinazi48ac9192019-07-31 00:07:26 -0700598 const bool has_length_prefix =
599 GetParam().version.HasLengthPrefixedConnectionIds();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500600 std::unique_ptr<QuicEncryptedPacket> encrypted(
dschinazi48ac9192019-07-31 00:07:26 -0700601 creator_.SerializeVersionNegotiationPacket(ietf_quic, has_length_prefix,
602 versions));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500603
604 {
605 InSequence s;
606 EXPECT_CALL(framer_visitor_, OnPacket());
607 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
608 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
609 }
610 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT);
611 client_framer_.ProcessPacket(*encrypted);
612}
613
renjietang4c704c82019-10-07 16:39:11 -0700614// Test that the path challenge connectivity probing packet is serialized
615// correctly as a padded PATH CHALLENGE packet.
616TEST_P(QuicPacketCreatorTest, BuildPathChallengePacket) {
617 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
618 // This frame is only for IETF QUIC.
619 return;
620 }
621
622 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700623 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700624 header.reset_flag = false;
625 header.version_flag = false;
626 header.packet_number = kPacketNumber;
627 QuicPathFrameBuffer payload;
628
629 // clang-format off
630 unsigned char packet[] = {
631 // type (short header, 4 byte packet number)
632 0x43,
633 // connection_id
634 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
635 // packet number
636 0x12, 0x34, 0x56, 0x78,
637
638 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
639 0x1a,
640 // 8 "random" bytes, MockRandom makes lots of r's
641 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
642 // frame type (padding frame)
643 0x00,
644 0x00, 0x00, 0x00, 0x00
645 };
646 // clang-format on
647
648 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
649 MockRandom randomizer;
650
651 size_t length = creator_.BuildPaddedPathChallengePacket(
652 header, buffer.get(), QUIC_ARRAYSIZE(packet), &payload, &randomizer,
653 ENCRYPTION_INITIAL);
654 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
655
656 // Payload has the random bytes that were generated. Copy them into packet,
657 // above, before checking that the generated packet is correct.
658 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
659
660 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
661 header);
662
663 test::CompareCharArraysWithHexError(
664 "constructed packet", data.data(), data.length(),
665 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
666}
667
668TEST_P(QuicPacketCreatorTest, BuildConnectivityProbingPacket) {
669 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700670 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700671 header.reset_flag = false;
672 header.version_flag = false;
673 header.packet_number = kPacketNumber;
674
675 // clang-format off
676 unsigned char packet[] = {
677 // public flags (8 byte connection_id)
678 0x2C,
679 // connection_id
680 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
681 // packet number
682 0x12, 0x34, 0x56, 0x78,
683
684 // frame type (ping frame)
685 0x07,
686 // frame type (padding frame)
687 0x00,
688 0x00, 0x00, 0x00, 0x00
689 };
690
691 unsigned char packet46[] = {
692 // type (short header, 4 byte packet number)
693 0x43,
694 // connection_id
695 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
696 // packet number
697 0x12, 0x34, 0x56, 0x78,
698
699 // frame type
700 0x07,
701 // frame type (padding frame)
702 0x00,
703 0x00, 0x00, 0x00, 0x00
704 };
705
706 unsigned char packet99[] = {
707 // type (short header, 4 byte packet number)
708 0x43,
709 // connection_id
710 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
711 // packet number
712 0x12, 0x34, 0x56, 0x78,
713
714 // frame type (IETF_PING frame)
715 0x01,
716 // frame type (padding frame)
717 0x00,
718 0x00, 0x00, 0x00, 0x00
719 };
720 // clang-format on
721
722 unsigned char* p = packet;
723 size_t packet_size = QUIC_ARRAYSIZE(packet);
724 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
725 p = packet99;
726 packet_size = QUIC_ARRAYSIZE(packet99);
727 } else if (creator_.transport_version() >= QUIC_VERSION_46) {
728 p = packet46;
729 packet_size = QUIC_ARRAYSIZE(packet46);
730 }
731
732 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
733
734 size_t length = creator_.BuildConnectivityProbingPacket(
735 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
736
737 EXPECT_NE(0u, length);
738 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
739 header);
740
741 test::CompareCharArraysWithHexError("constructed packet", data.data(),
742 data.length(), reinterpret_cast<char*>(p),
743 packet_size);
744}
745
746// Several tests that the path response connectivity probing packet is
747// serialized correctly as either a padded and unpadded PATH RESPONSE
748// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
749// exercised the single- and multiple- payload cases.
750TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponseUnpadded) {
751 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
752 // This frame is only for IETF QUIC.
753 return;
754 }
755
756 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700757 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700758 header.reset_flag = false;
759 header.version_flag = false;
760 header.packet_number = kPacketNumber;
761 QuicPathFrameBuffer payload0 = {
762 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
763
764 // Build 1 PATH RESPONSE, not padded
765 // clang-format off
766 unsigned char packet[] = {
767 // type (short header, 4 byte packet number)
768 0x43,
769 // connection_id
770 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
771 // packet number
772 0x12, 0x34, 0x56, 0x78,
773
774 // Path Response Frame type (IETF_PATH_RESPONSE)
775 0x1b,
776 // 8 "random" bytes
777 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
778 };
779 // clang-format on
780 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
781 QuicDeque<QuicPathFrameBuffer> payloads;
782 payloads.push_back(payload0);
783 size_t length = creator_.BuildPathResponsePacket(
784 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
785 /*is_padded=*/false, ENCRYPTION_INITIAL);
786 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
787 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
788 header);
789
790 test::CompareCharArraysWithHexError(
791 "constructed packet", data.data(), data.length(),
792 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
793}
794
795TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponsePadded) {
796 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
797 // This frame is only for IETF QUIC.
798 return;
799 }
800
801 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700802 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700803 header.reset_flag = false;
804 header.version_flag = false;
805 header.packet_number = kPacketNumber;
806 QuicPathFrameBuffer payload0 = {
807 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
808
809 // Build 1 PATH RESPONSE, padded
810 // clang-format off
811 unsigned char packet[] = {
812 // type (short header, 4 byte packet number)
813 0x43,
814 // connection_id
815 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
816 // packet number
817 0x12, 0x34, 0x56, 0x78,
818
819 // Path Response Frame type (IETF_PATH_RESPONSE)
820 0x1b,
821 // 8 "random" bytes
822 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
823 // Padding type and pad
824 0x00, 0x00, 0x00, 0x00, 0x00
825 };
826 // clang-format on
827 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
828 QuicDeque<QuicPathFrameBuffer> payloads;
829 payloads.push_back(payload0);
830 size_t length = creator_.BuildPathResponsePacket(
831 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
832 /*is_padded=*/true, ENCRYPTION_INITIAL);
833 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
834 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
835 header);
836
837 test::CompareCharArraysWithHexError(
838 "constructed packet", data.data(), data.length(),
839 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
840}
841
842TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesUnpadded) {
843 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
844 // This frame is only for IETF QUIC.
845 return;
846 }
847
848 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700849 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700850 header.reset_flag = false;
851 header.version_flag = false;
852 header.packet_number = kPacketNumber;
853 QuicPathFrameBuffer payload0 = {
854 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
855 QuicPathFrameBuffer payload1 = {
856 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
857 QuicPathFrameBuffer payload2 = {
858 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
859
860 // Build one packet with 3 PATH RESPONSES, no padding
861 // clang-format off
862 unsigned char packet[] = {
863 // type (short header, 4 byte packet number)
864 0x43,
865 // connection_id
866 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
867 // packet number
868 0x12, 0x34, 0x56, 0x78,
869
870 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
871 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
872 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
873 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
874 };
875 // clang-format on
876
877 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
878 QuicDeque<QuicPathFrameBuffer> payloads;
879 payloads.push_back(payload0);
880 payloads.push_back(payload1);
881 payloads.push_back(payload2);
882 size_t length = creator_.BuildPathResponsePacket(
883 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
884 /*is_padded=*/false, ENCRYPTION_INITIAL);
885 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
886 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
887 header);
888
889 test::CompareCharArraysWithHexError(
890 "constructed packet", data.data(), data.length(),
891 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
892}
893
894TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesPadded) {
895 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
896 // This frame is only for IETF QUIC.
897 return;
898 }
899
900 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700901 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700902 header.reset_flag = false;
903 header.version_flag = false;
904 header.packet_number = kPacketNumber;
905 QuicPathFrameBuffer payload0 = {
906 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
907 QuicPathFrameBuffer payload1 = {
908 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
909 QuicPathFrameBuffer payload2 = {
910 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
911
912 // Build one packet with 3 PATH RESPONSES, with padding
913 // clang-format off
914 unsigned char packet[] = {
915 // type (short header, 4 byte packet number)
916 0x43,
917 // connection_id
918 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
919 // packet number
920 0x12, 0x34, 0x56, 0x78,
921
922 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
923 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
924 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
925 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
926 // Padding
927 0x00, 0x00, 0x00, 0x00, 0x00
928 };
929 // clang-format on
930
931 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
932 QuicDeque<QuicPathFrameBuffer> payloads;
933 payloads.push_back(payload0);
934 payloads.push_back(payload1);
935 payloads.push_back(payload2);
936 size_t length = creator_.BuildPathResponsePacket(
937 header, buffer.get(), QUIC_ARRAYSIZE(packet), payloads,
938 /*is_padded=*/true, ENCRYPTION_INITIAL);
939 EXPECT_EQ(length, QUIC_ARRAYSIZE(packet));
940 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
941 header);
942
943 test::CompareCharArraysWithHexError(
944 "constructed packet", data.data(), data.length(),
945 reinterpret_cast<char*>(packet), QUIC_ARRAYSIZE(packet));
946}
947
QUICHE teama6ef0a62019-03-07 20:34:33 -0500948TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700949 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500950 EncryptionLevel level = static_cast<EncryptionLevel>(i);
951
952 creator_.set_encryption_level(level);
953
954 OwningSerializedPacketPointer encrypted;
renjietang4c704c82019-10-07 16:39:11 -0700955 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500956 QuicPathFrameBuffer payload = {
957 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
958 encrypted =
959 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
960 } else {
961 encrypted = creator_.SerializeConnectivityProbingPacket();
962 }
963 {
964 InSequence s;
965 EXPECT_CALL(framer_visitor_, OnPacket());
966 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
967 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
968 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
969 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
renjietang4c704c82019-10-07 16:39:11 -0700970 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500971 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
972 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
973 } else {
974 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
975 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
976 }
977 EXPECT_CALL(framer_visitor_, OnPacketComplete());
978 }
979 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
980 server_framer_.ProcessPacket(QuicEncryptedPacket(
981 encrypted->encrypted_buffer, encrypted->encrypted_length));
982 }
983}
984
985TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
renjietang4c704c82019-10-07 16:39:11 -0700986 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500987 return;
988 }
989 QuicPathFrameBuffer payload = {
990 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
991
QUICHE team6987b4a2019-03-15 16:23:04 -0700992 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500993 EncryptionLevel level = static_cast<EncryptionLevel>(i);
994
995 creator_.set_encryption_level(level);
996
997 OwningSerializedPacketPointer encrypted(
998 creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
999 {
1000 InSequence s;
1001 EXPECT_CALL(framer_visitor_, OnPacket());
1002 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1003 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1004 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1005 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1006 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
1007 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1008 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1009 }
1010 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
1011 server_framer_.ProcessPacket(QuicEncryptedPacket(
1012 encrypted->encrypted_buffer, encrypted->encrypted_length));
1013 }
1014}
1015
1016TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001017 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001018 return;
1019 }
1020 QuicPathFrameBuffer payload0 = {
1021 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1022
QUICHE team6987b4a2019-03-15 16:23:04 -07001023 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001024 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1025 creator_.set_encryption_level(level);
1026
1027 QuicDeque<QuicPathFrameBuffer> payloads;
1028 payloads.push_back(payload0);
1029
1030 OwningSerializedPacketPointer encrypted(
1031 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1032 true));
1033 {
1034 InSequence s;
1035 EXPECT_CALL(framer_visitor_, OnPacket());
1036 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1037 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1038 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1039 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1040 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1041 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1042 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1043 }
1044 server_framer_.ProcessPacket(QuicEncryptedPacket(
1045 encrypted->encrypted_buffer, encrypted->encrypted_length));
1046 }
1047}
1048
1049TEST_P(QuicPacketCreatorTest,
1050 SerializePathResponseProbePacket1PayloadUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001051 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001052 return;
1053 }
1054 QuicPathFrameBuffer payload0 = {
1055 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1056
QUICHE team6987b4a2019-03-15 16:23:04 -07001057 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001058 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1059 creator_.set_encryption_level(level);
1060
1061 QuicDeque<QuicPathFrameBuffer> payloads;
1062 payloads.push_back(payload0);
1063
1064 OwningSerializedPacketPointer encrypted(
1065 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1066 false));
1067 {
1068 InSequence s;
1069 EXPECT_CALL(framer_visitor_, OnPacket());
1070 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1071 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1072 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1073 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1074 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1075 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1076 }
1077 server_framer_.ProcessPacket(QuicEncryptedPacket(
1078 encrypted->encrypted_buffer, encrypted->encrypted_length));
1079 }
1080}
1081
1082TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001083 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001084 return;
1085 }
1086 QuicPathFrameBuffer payload0 = {
1087 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1088 QuicPathFrameBuffer payload1 = {
1089 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1090
QUICHE team6987b4a2019-03-15 16:23:04 -07001091 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001092 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1093 creator_.set_encryption_level(level);
1094
1095 QuicDeque<QuicPathFrameBuffer> payloads;
1096 payloads.push_back(payload0);
1097 payloads.push_back(payload1);
1098
1099 OwningSerializedPacketPointer encrypted(
1100 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1101 true));
1102 {
1103 InSequence s;
1104 EXPECT_CALL(framer_visitor_, OnPacket());
1105 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1106 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1107 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1108 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1109 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1110 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1111 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1112 }
1113 server_framer_.ProcessPacket(QuicEncryptedPacket(
1114 encrypted->encrypted_buffer, encrypted->encrypted_length));
1115 }
1116}
1117
1118TEST_P(QuicPacketCreatorTest,
1119 SerializePathResponseProbePacket2PayloadsUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001120 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001121 return;
1122 }
1123 QuicPathFrameBuffer payload0 = {
1124 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1125 QuicPathFrameBuffer payload1 = {
1126 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1127
QUICHE team6987b4a2019-03-15 16:23:04 -07001128 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001129 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1130 creator_.set_encryption_level(level);
1131
1132 QuicDeque<QuicPathFrameBuffer> payloads;
1133 payloads.push_back(payload0);
1134 payloads.push_back(payload1);
1135
1136 OwningSerializedPacketPointer encrypted(
1137 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1138 false));
1139 {
1140 InSequence s;
1141 EXPECT_CALL(framer_visitor_, OnPacket());
1142 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1143 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1144 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1145 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1146 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1147 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1148 }
1149 server_framer_.ProcessPacket(QuicEncryptedPacket(
1150 encrypted->encrypted_buffer, encrypted->encrypted_length));
1151 }
1152}
1153
1154TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001155 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001156 return;
1157 }
1158 QuicPathFrameBuffer payload0 = {
1159 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1160 QuicPathFrameBuffer payload1 = {
1161 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1162 QuicPathFrameBuffer payload2 = {
1163 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1164
QUICHE team6987b4a2019-03-15 16:23:04 -07001165 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001166 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1167 creator_.set_encryption_level(level);
1168
1169 QuicDeque<QuicPathFrameBuffer> payloads;
1170 payloads.push_back(payload0);
1171 payloads.push_back(payload1);
1172 payloads.push_back(payload2);
1173
1174 OwningSerializedPacketPointer encrypted(
1175 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1176 true));
1177 {
1178 InSequence s;
1179 EXPECT_CALL(framer_visitor_, OnPacket());
1180 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1181 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1182 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1183 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1184 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1185 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1186 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1187 }
1188 server_framer_.ProcessPacket(QuicEncryptedPacket(
1189 encrypted->encrypted_buffer, encrypted->encrypted_length));
1190 }
1191}
1192
1193TEST_P(QuicPacketCreatorTest,
1194 SerializePathResponseProbePacket3PayloadsUnpadded) {
renjietang4c704c82019-10-07 16:39:11 -07001195 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001196 return;
1197 }
1198 QuicPathFrameBuffer payload0 = {
1199 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1200 QuicPathFrameBuffer payload1 = {
1201 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1202 QuicPathFrameBuffer payload2 = {
1203 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1204
QUICHE team6987b4a2019-03-15 16:23:04 -07001205 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001206 EncryptionLevel level = static_cast<EncryptionLevel>(i);
1207 creator_.set_encryption_level(level);
1208
1209 QuicDeque<QuicPathFrameBuffer> payloads;
1210 payloads.push_back(payload0);
1211 payloads.push_back(payload1);
1212 payloads.push_back(payload2);
1213
1214 OwningSerializedPacketPointer encrypted(
1215 creator_.SerializePathResponseConnectivityProbingPacket(payloads,
1216 false));
1217 InSequence s;
1218 EXPECT_CALL(framer_visitor_, OnPacket());
1219 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1220 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1221 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1222 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1223 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1224 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1225
1226 server_framer_.ProcessPacket(QuicEncryptedPacket(
1227 encrypted->encrypted_buffer, encrypted->encrypted_length));
1228 }
1229}
1230
1231TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
renjietang4c704c82019-10-07 16:39:11 -07001232 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001233 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001234 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1235 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1236 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1237 } else {
1238 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1239 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1240 }
1241
1242 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1243 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1244 10000 / kDefaultMaxPacketSize);
1245 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1246 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1247
1248 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1249 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1250 10000 / kDefaultMaxPacketSize);
1251 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1252 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1253
1254 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1255 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1256 10000 / kDefaultMaxPacketSize);
1257 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1258 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1259
1260 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1261 UINT64_C(64) * 256 * 256 * 256 * 256);
1262 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1263 10000 / kDefaultMaxPacketSize);
1264 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1265 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1266}
1267
1268TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1269 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001270 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang3ac15c12019-06-14 14:04:51 -07001271 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001272 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1273 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1274 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1275 } else {
1276 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1277 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1278 }
1279
1280 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1281 10000 / kDefaultMaxPacketSize);
1282 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1283 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1284
1285 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1286 10000 * 256 / kDefaultMaxPacketSize);
1287 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1288 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1289
1290 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1291 10000 * 256 * 256 / kDefaultMaxPacketSize);
1292 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1293 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1294
1295 creator_.UpdatePacketNumberLength(
1296 QuicPacketNumber(1),
1297 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1298 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1299 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1300}
1301
fayang4c1c2362019-09-13 07:20:01 -07001302TEST_P(QuicPacketCreatorTest, SkipNPacketNumbers) {
1303 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
renjietang4c704c82019-10-07 16:39:11 -07001304 if (VersionHasIetfInvariantHeader(creator_.transport_version()) &&
fayang4c1c2362019-09-13 07:20:01 -07001305 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1306 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1307 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1308 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1309 } else {
1310 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1311 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1312 }
1313 creator_.SkipNPacketNumbers(63, QuicPacketNumber(2),
1314 10000 / kDefaultMaxPacketSize);
1315 EXPECT_EQ(QuicPacketNumber(64), creator_.packet_number());
1316 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1317 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1318
1319 creator_.SkipNPacketNumbers(64 * 255, QuicPacketNumber(2),
1320 10000 / kDefaultMaxPacketSize);
1321 EXPECT_EQ(QuicPacketNumber(64 * 256), creator_.packet_number());
1322 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1323 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1324
1325 creator_.SkipNPacketNumbers(64 * 256 * 255, QuicPacketNumber(2),
1326 10000 / kDefaultMaxPacketSize);
1327 EXPECT_EQ(QuicPacketNumber(64 * 256 * 256), creator_.packet_number());
1328 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1329 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1330}
1331
QUICHE teama6ef0a62019-03-07 20:34:33 -05001332TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1333 if (!GetParam().version_serialization) {
1334 creator_.StopSendingVersion();
1335 }
nharper55fa6132019-05-07 19:37:21 -07001336 std::string data("test data");
1337 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1338 QuicStreamFrame stream_frame(
1339 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1340 /*fin=*/false, 0u, QuicStringPiece());
1341 frames_.push_back(QuicFrame(stream_frame));
1342 } else {
1343 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1344 frames_.push_back(
1345 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1346 }
1347 SerializedPacket serialized = SerializeAllFrames(frames_);
1348
1349 QuicPacketHeader header;
1350 {
1351 InSequence s;
1352 EXPECT_CALL(framer_visitor_, OnPacket());
1353 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1354 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1355 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1356 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1357 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1358 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1359 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1360 } else {
1361 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1362 }
1363 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1364 }
1365 ProcessPacket(serialized);
1366 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1367 DeleteFrames(&frames_);
1368}
1369
1370TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
1371 if (!GetParam().version_serialization) {
1372 creator_.StopSendingVersion();
1373 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001374 std::string data("a");
1375 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1376 QuicStreamFrame stream_frame(
1377 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1378 /*fin=*/false, 0u, QuicStringPiece());
1379 frames_.push_back(QuicFrame(stream_frame));
1380 } else {
1381 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1382 frames_.push_back(
1383 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1384 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001385 SerializedPacket serialized = SerializeAllFrames(frames_);
1386
1387 QuicPacketHeader header;
1388 {
1389 InSequence s;
1390 EXPECT_CALL(framer_visitor_, OnPacket());
1391 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1392 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1393 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1394 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1395 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001396 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1397 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1398 } else {
1399 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1400 }
nharper55fa6132019-05-07 19:37:21 -07001401 if (client_framer_.version().HasHeaderProtection()) {
1402 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1403 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001404 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1405 }
1406 ProcessPacket(serialized);
1407 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001408 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001409}
1410
1411TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1412 if (!GetParam().version_serialization) {
1413 creator_.StopSendingVersion();
1414 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001415 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001416 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001417 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001418 size_t payload_length = creator_.max_packet_length();
1419 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001420 MakeIOVector(too_long_payload, &iov_);
1421 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1422 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001423 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1424 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001425 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1426 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
1427 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001428 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001429 // The entire payload could not be consumed.
1430 EXPECT_GT(payload_length, consumed);
fayang62b637b2019-09-16 08:40:49 -07001431 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001432 DeleteSerializedPacket();
1433}
1434
1435TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1436 if (!GetParam().version_serialization) {
1437 creator_.StopSendingVersion();
1438 }
1439 const size_t max_plaintext_size =
1440 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1441 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001442 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1443 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1444 client_framer_.transport_version(), Perspective::IS_CLIENT);
1445 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1446 stream_id =
1447 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1448 }
1449 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001450 EXPECT_EQ(max_plaintext_size -
1451 GetPacketHeaderSize(
1452 client_framer_.transport_version(),
1453 creator_.GetDestinationConnectionIdLength(),
1454 creator_.GetSourceConnectionIdLength(),
1455 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1456 !kIncludeDiversificationNonce,
1457 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1458 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1459 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1460 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001461 StrictMock<MockDebugDelegate> debug;
1462 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001463
1464 // Add a variety of frame types and then a padding frame.
1465 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001466 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001467 EXPECT_TRUE(
1468 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1469 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001470 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001471
1472 QuicFrame frame;
1473 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001474 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
fayang62b637b2019-09-16 08:40:49 -07001475 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1476 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1477 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001478 size_t consumed = frame.stream_frame.data_length;
1479 EXPECT_EQ(4u, consumed);
1480 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001481 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001482
1483 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001484 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001485 EXPECT_TRUE(
1486 creator_.AddSavedFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
1487 EXPECT_TRUE(creator_.HasPendingFrames());
1488 EXPECT_EQ(0u, creator_.BytesFree());
1489
1490 // Packet is full. Creator will flush.
1491 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1492 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1493 EXPECT_FALSE(
1494 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
1495
1496 // Ensure the packet is successfully created.
1497 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1498 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1499 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1500 ASSERT_EQ(1u, retransmittable.size());
1501 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1502 EXPECT_TRUE(serialized_packet_.has_ack);
1503 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1504 DeleteSerializedPacket();
1505
1506 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001507 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001508 EXPECT_EQ(max_plaintext_size -
1509 GetPacketHeaderSize(
1510 client_framer_.transport_version(),
1511 creator_.GetDestinationConnectionIdLength(),
1512 creator_.GetSourceConnectionIdLength(),
1513 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1514 !kIncludeDiversificationNonce,
1515 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1516 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1517 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1518 creator_.BytesFree());
1519}
1520
1521TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1522 if (!GetParam().version_serialization) {
1523 creator_.StopSendingVersion();
1524 }
1525 EXPECT_FALSE(creator_.HasPendingFrames());
1526
1527 MakeIOVector("test", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001528 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1529 iov_.iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001530 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1531 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1532 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001533 StrictMock<MockDebugDelegate> debug;
1534 creator_.set_debug_delegate(&debug);
1535 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001536 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001537 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1538 NOT_RETRANSMISSION, &num_bytes_consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001539 EXPECT_EQ(4u, num_bytes_consumed);
1540
1541 // Ensure the packet is successfully created.
1542 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1543 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1544 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1545 ASSERT_EQ(1u, retransmittable.size());
1546 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1547 DeleteSerializedPacket();
1548
1549 EXPECT_FALSE(creator_.HasPendingFrames());
1550}
1551
nharperebabffd2019-06-03 17:34:45 -07001552TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1553 // Regression test to check that CreateAndSerializeStreamFrame uses a
1554 // correctly formatted stream frame header when appending padding.
1555
1556 if (!GetParam().version_serialization) {
1557 creator_.StopSendingVersion();
1558 }
1559 EXPECT_FALSE(creator_.HasPendingFrames());
1560
1561 // Send one byte of stream data.
1562 MakeIOVector("a", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001563 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1564 iov_.iov_len);
nharperebabffd2019-06-03 17:34:45 -07001565 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1566 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1567 size_t num_bytes_consumed;
1568 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001569 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1570 NOT_RETRANSMISSION, &num_bytes_consumed);
nharperebabffd2019-06-03 17:34:45 -07001571 EXPECT_EQ(1u, num_bytes_consumed);
1572
1573 // Check that a packet is created.
1574 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1575 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1576 {
1577 InSequence s;
1578 EXPECT_CALL(framer_visitor_, OnPacket());
1579 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1580 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1581 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1582 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1583 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1584 if (client_framer_.version().HasHeaderProtection()) {
1585 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1586 }
1587 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1588 }
1589 ProcessPacket(serialized_packet_);
1590}
1591
QUICHE teama6ef0a62019-03-07 20:34:33 -05001592TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1593 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1594 if (!IsDefaultTestConfiguration()) {
1595 return;
1596 }
1597
QUICHE team6987b4a2019-03-15 16:23:04 -07001598 creator_.set_encryption_level(ENCRYPTION_INITIAL);
fkastenholz85f18902019-05-28 12:47:00 -07001599 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001600 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1601 /*fin=*/false, 0u, QuicStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001602 EXPECT_QUIC_BUG(
1603 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001604 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1605}
1606
1607TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1608 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1609 if (!IsDefaultTestConfiguration()) {
1610 return;
1611 }
1612
1613 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
fkastenholz85f18902019-05-28 12:47:00 -07001614 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001615 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1616 /*fin=*/false, 0u, QuicStringPiece());
fayang49523232019-05-03 06:28:22 -07001617 EXPECT_QUIC_BUG(
1618 creator_.AddSavedFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
1619 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001620}
1621
1622TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1623 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1624 if (!IsDefaultTestConfiguration()) {
1625 return;
1626 }
1627
QUICHE teamdc41bf12019-03-20 12:58:42 -07001628 // This test only matters when the crypto handshake is sent in stream frames.
1629 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1630 // frames.
1631 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1632 return;
1633 }
1634
QUICHE teama6ef0a62019-03-07 20:34:33 -05001635 CryptoHandshakeMessage message;
1636 message.set_tag(kCHLO);
dschinazi66dea072019-04-09 11:41:06 -07001637 message.set_minimum_size(kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001638 CryptoFramer framer;
1639 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001640 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001641
1642 struct iovec iov;
1643 MakeIOVector(QuicStringPiece(message_data->data(), message_data->length()),
1644 &iov);
1645 QuicFrame frame;
fkastenholz85f18902019-05-28 12:47:00 -07001646 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
fayang62b637b2019-09-16 08:40:49 -07001647 EXPECT_QUIC_BUG(
1648 creator_.ConsumeDataToFillCurrentPacket(
1649 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1650 &iov, 1u, iov.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION,
1651 &frame),
1652 "Client hello won't fit in a single packet.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001653}
1654
1655TEST_P(QuicPacketCreatorTest, PendingPadding) {
1656 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1657 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1658 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1659
1660 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1661 .WillRepeatedly(
1662 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1663 // Flush all paddings.
1664 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001665 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001666 {
1667 InSequence s;
1668 EXPECT_CALL(framer_visitor_, OnPacket());
1669 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1670 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1671 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1672 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1673 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1674 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1675 }
1676 // Packet only contains padding.
1677 ProcessPacket(serialized_packet_);
1678 }
1679 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1680}
1681
1682TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001683 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001684 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1685 QuicFrame frame;
1686 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001687 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1688 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001689 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001690 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001691 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1692 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1693 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001694 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001695 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1696}
1697
QUICHE teama6ef0a62019-03-07 20:34:33 -05001698TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001699 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001700 const QuicByteCount kStreamFramePayloadSize = 100u;
1701 // Set the packet size be enough for one stream frame with 0 stream offset +
1702 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001703 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1704 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001705 size_t length =
1706 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1707 GetEncryptionOverhead() +
1708 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001709 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001710 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1711 kStreamFramePayloadSize + 1;
1712 creator_.SetMaxPacketLength(length);
1713 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1714 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1715 QuicFrame frame;
1716 char buf[kStreamFramePayloadSize + 1] = {};
1717 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1718 .WillRepeatedly(
1719 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1720 // Send stream frame of size kStreamFramePayloadSize.
1721 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001722 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1723 0u, 0u, false, false,
1724 NOT_RETRANSMISSION, &frame);
1725 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001726 // 1 byte padding is sent.
1727 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1728 // Send stream frame of size kStreamFramePayloadSize + 1.
1729 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize + 1), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001730 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1731 0u, kStreamFramePayloadSize, false,
1732 false, NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001733 // No padding is sent.
fayang62b637b2019-09-16 08:40:49 -07001734 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001735 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1736 // Flush all paddings.
1737 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001738 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001739 }
1740 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1741}
1742
1743TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001744 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
dschinazi66dea072019-04-09 11:41:06 -07001745 char external_buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001746 char* expected_buffer = external_buffer;
1747 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1748
1749 QuicFrame frame;
1750 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001751 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1752 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001753 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001754 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001755 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1756
1757 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1758 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1759 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1760 ClearSerializedPacket(serialized_packet);
1761 }));
fayang62b637b2019-09-16 08:40:49 -07001762 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001763}
1764
1765// Test for error found in
1766// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1767// length that crosses an IETF VarInt length boundary would cause a
1768// failure. While this test is not applicable to versions other than version 99,
1769// it should still work. Hence, it is not made version-specific.
1770TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1771 QuicAckFrame ack_frame =
1772 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1773 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1774 frames_.push_back(QuicFrame(&ack_frame));
1775 SerializeAllFrames(frames_);
1776}
1777
1778TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
fayangd4291e42019-05-30 10:31:21 -07001779 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001780 return;
1781 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001782 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001783 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1784 .Times(3)
1785 .WillRepeatedly(
1786 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1787 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1788 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001789 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1790 creator_.GetCurrentLargestMessagePayload()));
1791 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001792 QuicMessageFrame* message_frame =
1793 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001794 EXPECT_TRUE(
1795 creator_.AddSavedFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
1796 EXPECT_TRUE(creator_.HasPendingFrames());
fayang62b637b2019-09-16 08:40:49 -07001797 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001798
wub553a9662019-03-28 20:13:23 -07001799 QuicMessageFrame* frame2 =
1800 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001801 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
1802 EXPECT_TRUE(creator_.HasPendingFrames());
1803 // Verify if a new frame is added, 1 byte message length will be added.
1804 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001805 QuicMessageFrame* frame3 =
1806 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001807 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
1808 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
fayang62b637b2019-09-16 08:40:49 -07001809 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001810
1811 QuicFrame frame;
1812 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001813 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1814 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001815 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1816 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1817 NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001818 QuicMessageFrame* frame4 =
1819 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001820 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
1821 EXPECT_TRUE(creator_.HasPendingFrames());
1822 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001823 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1824 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001825 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001826 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001827 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
1828 EXPECT_FALSE(creator_.HasPendingFrames());
1829}
1830
1831TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
fayangd4291e42019-05-30 10:31:21 -07001832 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001833 return;
1834 }
vasilvvc48c8712019-03-11 13:38:16 -07001835 std::string message_data(kDefaultMaxPacketSize, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001836 QuicStringPiece message_buffer(message_data);
1837 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001838 // Test all possible encryption levels of message frames.
1839 for (EncryptionLevel level :
1840 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1841 creator_.set_encryption_level(level);
1842 // Test all possible sizes of message frames.
1843 for (size_t message_size = 0;
1844 message_size <= creator_.GetCurrentLargestMessagePayload();
1845 ++message_size) {
1846 QuicMessageFrame* frame = new QuicMessageFrame(
1847 0, MakeSpan(&allocator_,
1848 QuicStringPiece(message_buffer.data(), message_size),
1849 &storage));
1850 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(frame), NOT_RETRANSMISSION));
1851 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001852
ianswettb239f862019-04-05 09:15:06 -07001853 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1854 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1855 // Verify BytesFree returns bytes available for the next frame, which
1856 // should subtract the message length.
1857 size_t expected_bytes_free =
1858 creator_.GetCurrentLargestMessagePayload() - message_size <
1859 expansion_bytes
1860 ? 0
1861 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1862 message_size;
1863 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1864 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1865 creator_.GetCurrentLargestMessagePayload());
1866 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1867 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001868 creator_.FlushCurrentPacket();
ianswettb239f862019-04-05 09:15:06 -07001869 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1870 DeleteSerializedPacket();
1871 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001872 }
1873}
1874
nharperd43f1d62019-07-01 15:18:20 -07001875// Regression test for bugfix of GetPacketHeaderSize.
1876TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
renjietang4c704c82019-10-07 16:39:11 -07001877 QuicTransportVersion version = creator_.transport_version();
nharperd43f1d62019-07-01 15:18:20 -07001878 if (!VersionSupportsMessageFrames(version)) {
1879 return;
1880 }
1881 QuicPacketLength expected_largest_payload = 1319;
1882 if (QuicVersionHasLongHeaderLengths(version)) {
1883 expected_largest_payload -= 2;
1884 }
dschinazi48ac9192019-07-31 00:07:26 -07001885 if (GetParam().version.HasLengthPrefixedConnectionIds()) {
1886 expected_largest_payload -= 1;
1887 }
nharperd43f1d62019-07-01 15:18:20 -07001888 EXPECT_EQ(expected_largest_payload,
1889 creator_.GetGuaranteedLargestMessagePayload());
1890}
1891
QUICHE teama6ef0a62019-03-07 20:34:33 -05001892TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001893 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001894
1895 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1896 QuicFrame ack_frame(&temp_ack_frame);
1897 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1898
QUICHE teamdc41bf12019-03-20 12:58:42 -07001899 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1900 client_framer_.transport_version(), Perspective::IS_CLIENT);
1901 QuicFrame stream_frame(QuicStreamFrame(stream_id,
1902 /*fin=*/false, 0u, QuicStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001903 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1904
1905 QuicFrame padding_frame{QuicPaddingFrame()};
1906 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1907
1908 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1909 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1910
1911 EXPECT_TRUE(creator_.AddSavedFrame(ack_frame, LOSS_RETRANSMISSION));
1912 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1913
1914 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame, RTO_RETRANSMISSION));
1915 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1916
1917 EXPECT_TRUE(creator_.AddSavedFrame(padding_frame, TLP_RETRANSMISSION));
fayang62b637b2019-09-16 08:40:49 -07001918 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001919 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1920
fayangcff885a2019-10-22 07:39:04 -07001921 // The last retransmittable frame on packet is a stream frame, the packet's
1922 // transmission type should be the same as the stream frame's.
1923 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001924 DeleteSerializedPacket();
1925}
1926
1927TEST_P(QuicPacketCreatorTest, RetryToken) {
1928 if (!GetParam().version_serialization ||
1929 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1930 return;
1931 }
1932
1933 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1934 9, 10, 11, 12, 13, 14, 15, 16};
1935
1936 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001937 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001938
QUICHE teamdc41bf12019-03-20 12:58:42 -07001939 std::string data("a");
1940 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1941 QuicStreamFrame stream_frame(
1942 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1943 /*fin=*/false, 0u, QuicStringPiece());
1944 frames_.push_back(QuicFrame(stream_frame));
1945 } else {
1946 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1947 frames_.push_back(
1948 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1949 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001950 SerializedPacket serialized = SerializeAllFrames(frames_);
1951
1952 QuicPacketHeader header;
1953 {
1954 InSequence s;
1955 EXPECT_CALL(framer_visitor_, OnPacket());
1956 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1957 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1958 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1959 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1960 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001961 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1962 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1963 } else {
1964 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1965 }
nharper55fa6132019-05-07 19:37:21 -07001966 if (client_framer_.version().HasHeaderProtection()) {
1967 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1968 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001969 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1970 }
1971 ProcessPacket(serialized);
1972 ASSERT_TRUE(header.version_flag);
1973 ASSERT_EQ(header.long_packet_type, INITIAL);
1974 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1975 test::CompareCharArraysWithHexError(
1976 "retry token", header.retry_token.data(), header.retry_token.length(),
1977 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001978 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001979}
1980
QUICHE team2252b702019-05-14 23:55:14 -04001981TEST_P(QuicPacketCreatorTest, GetConnectionId) {
QUICHE team2252b702019-05-14 23:55:14 -04001982 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1983 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1984}
1985
dschinazi346b7ce2019-06-05 01:38:18 -07001986TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
dschinazi346b7ce2019-06-05 01:38:18 -07001987 if (!client_framer_.version().SupportsClientConnectionIds()) {
1988 return;
1989 }
1990 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1991 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1992 creator_.SetClientConnectionId(TestConnectionId(0x33));
1993 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1994 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
1995}
1996
renjietangdbe98342019-10-18 11:00:57 -07001997TEST_P(QuicPacketCreatorTest, CoalesceStreamFrames) {
1998 InSequence s;
1999 if (!GetParam().version_serialization) {
2000 creator_.StopSendingVersion();
2001 }
renjietanga66e4152019-11-11 13:23:33 -08002002 SetQuicRestartFlag(quic_coalesce_stream_frames_2, true);
renjietangdbe98342019-10-18 11:00:57 -07002003 const size_t max_plaintext_size =
2004 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
2005 EXPECT_FALSE(creator_.HasPendingFrames());
2006 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2007 QuicStreamId stream_id1 = QuicUtils::GetFirstBidirectionalStreamId(
2008 client_framer_.transport_version(), Perspective::IS_CLIENT);
2009 QuicStreamId stream_id2 = GetNthClientInitiatedStreamId(1);
2010 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2011 EXPECT_EQ(max_plaintext_size -
2012 GetPacketHeaderSize(
2013 client_framer_.transport_version(),
2014 creator_.GetDestinationConnectionIdLength(),
2015 creator_.GetSourceConnectionIdLength(),
2016 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2017 !kIncludeDiversificationNonce,
2018 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2019 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
2020 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
2021 creator_.BytesFree());
2022 StrictMock<MockDebugDelegate> debug;
2023 creator_.set_debug_delegate(&debug);
2024
2025 MakeIOVector("test", &iov_);
2026 QuicFrame frame;
2027 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2028 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2029 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2030 NOT_RETRANSMISSION, &frame));
2031 EXPECT_TRUE(creator_.HasPendingFrames());
2032 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2033
2034 MakeIOVector("coalesce", &iov_);
2035 // frame will be coalesced with the first frame.
2036 const auto previous_size = creator_.PacketSize();
renjietang2a6ba792019-10-22 10:44:58 -07002037 QuicStreamFrame target(stream_id1, true, 0, 12);
2038 EXPECT_CALL(debug, OnStreamFrameCoalesced(target));
renjietangdbe98342019-10-18 11:00:57 -07002039 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2040 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 4u, true, false,
2041 NOT_RETRANSMISSION, &frame));
2042 EXPECT_EQ(frame.stream_frame.data_length,
2043 creator_.PacketSize() - previous_size);
renjietangdbe98342019-10-18 11:00:57 -07002044
2045 // frame is for another stream, so it won't be coalesced.
2046 const auto length = creator_.BytesFree() - 10u;
renjietang7f46be32019-10-21 16:55:17 -07002047 std::string large_data(length, 'x');
renjietangdbe98342019-10-18 11:00:57 -07002048 MakeIOVector(large_data, &iov_);
2049 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2050 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2051 stream_id2, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2052 NOT_RETRANSMISSION, &frame));
2053 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id2));
2054
2055 // The packet doesn't have enough free bytes for all data, but will still be
2056 // able to consume and coalesce part of them.
2057 EXPECT_CALL(debug, OnStreamFrameCoalesced(_));
2058 MakeIOVector("somerandomdata", &iov_);
2059 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2060 stream_id2, &iov_, 1u, iov_.iov_len, 0u, length, false, false,
2061 NOT_RETRANSMISSION, &frame));
2062
2063 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2064 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2065 creator_.FlushCurrentPacket();
2066 EXPECT_CALL(framer_visitor_, OnPacket());
2067 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2068 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2069 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2070 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2071 // The packet should only have 2 stream frames.
2072 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2073 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2074 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2075 ProcessPacket(serialized_packet_);
2076}
2077
fayang51152fd2019-10-21 06:48:09 -07002078TEST_P(QuicPacketCreatorTest, SaveNonRetransmittableFrames) {
fayang58f71072019-11-05 08:47:02 -08002079 if (!GetQuicReloadableFlag(quic_populate_nonretransmittable_frames) &&
2080 !client_framer_.version().CanSendCoalescedPackets()) {
fayang51152fd2019-10-21 06:48:09 -07002081 return;
2082 }
2083 QuicAckFrame ack_frame(InitAckFrame(1));
2084 frames_.push_back(QuicFrame(&ack_frame));
2085 frames_.push_back(QuicFrame(QuicPaddingFrame(-1)));
2086 SerializedPacket serialized = SerializeAllFrames(frames_);
2087 ASSERT_EQ(2u, serialized.nonretransmittable_frames.size());
2088 EXPECT_EQ(ACK_FRAME, serialized.nonretransmittable_frames[0].type);
2089 EXPECT_EQ(PADDING_FRAME, serialized.nonretransmittable_frames[1].type);
fayangeb268412019-10-21 14:05:38 -07002090 // Verify full padding frame is translated to a padding frame with actual
2091 // bytes of padding.
2092 EXPECT_LT(
2093 0,
2094 serialized.nonretransmittable_frames[1].padding_frame.num_padding_bytes);
fayang51152fd2019-10-21 06:48:09 -07002095 frames_.clear();
2096
2097 // Serialize another packet with the same frames.
2098 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
2099 &creator_, serialized.nonretransmittable_frames, buffer_,
2100 kMaxOutgoingPacketSize);
2101 // Verify the packet length of both packets are equal.
2102 EXPECT_EQ(serialized.encrypted_length, packet.encrypted_length);
2103}
2104
fayang08750832019-10-24 11:25:34 -07002105TEST_P(QuicPacketCreatorTest, SerializeCoalescedPacket) {
2106 if (!GetQuicReloadableFlag(quic_populate_nonretransmittable_frames)) {
2107 return;
2108 }
2109 QuicCoalescedPacket coalesced;
2110 SimpleBufferAllocator allocator;
2111 QuicSocketAddress self_address(QuicIpAddress::Loopback4(), 1);
2112 QuicSocketAddress peer_address(QuicIpAddress::Loopback4(), 2);
2113 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2114 EncryptionLevel level = static_cast<EncryptionLevel>(i);
2115 creator_.set_encryption_level(level);
2116 QuicAckFrame ack_frame(InitAckFrame(1));
2117 frames_.push_back(QuicFrame(&ack_frame));
2118 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
2119 frames_.push_back(
2120 QuicFrame(QuicStreamFrame(1, false, 0u, QuicStringPiece())));
2121 }
2122 SerializedPacket serialized = SerializeAllFrames(frames_);
2123 EXPECT_EQ(level, serialized.encryption_level);
2124 frames_.clear();
2125 ASSERT_TRUE(coalesced.MaybeCoalescePacket(serialized, self_address,
2126 peer_address, &allocator,
2127 creator_.max_packet_length()));
2128 }
2129 char buffer[kMaxOutgoingPacketSize];
2130 size_t coalesced_length = creator_.SerializeCoalescedPacket(
2131 coalesced, buffer, kMaxOutgoingPacketSize);
2132 // Verify packet is padded to full.
2133 ASSERT_EQ(coalesced.max_packet_length(), coalesced_length);
2134 if (!QuicVersionHasLongHeaderLengths(server_framer_.transport_version())) {
2135 return;
2136 }
2137 // Verify packet process.
2138 std::unique_ptr<QuicEncryptedPacket> packets[NUM_ENCRYPTION_LEVELS];
2139 packets[ENCRYPTION_INITIAL] =
bnc40d0fa52019-10-29 11:40:48 -07002140 std::make_unique<QuicEncryptedPacket>(buffer, coalesced_length);
fayang08750832019-10-24 11:25:34 -07002141 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2142 InSequence s;
2143 EXPECT_CALL(framer_visitor_, OnPacket());
2144 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2145 if (i < ENCRYPTION_FORWARD_SECURE) {
2146 // Save coalesced packet.
2147 EXPECT_CALL(framer_visitor_, OnCoalescedPacket(_))
2148 .WillOnce(Invoke([i, &packets](const QuicEncryptedPacket& packet) {
2149 packets[i + 1] = packet.Clone();
2150 }));
2151 }
2152 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2153 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2154 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2155 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _)).WillOnce(Return(true));
2156 EXPECT_CALL(framer_visitor_,
2157 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
2158 .WillOnce(Return(true));
2159 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(_)).WillOnce(Return(true));
2160 if (i == ENCRYPTION_INITIAL) {
2161 // Verify padding is added.
2162 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2163 } else {
2164 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(testing::AtMost(1));
2165 }
2166 if (i != ENCRYPTION_INITIAL && i != ENCRYPTION_HANDSHAKE) {
2167 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2168 }
2169 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2170
2171 server_framer_.ProcessPacket(*packets[i]);
2172 }
2173}
2174
fayang2ab1e852019-11-04 11:24:36 -08002175TEST_P(QuicPacketCreatorTest, SoftMaxPacketLength) {
2176 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2177 QuicByteCount previous_max_packet_length = creator_.max_packet_length();
2178 const size_t overhead =
2179 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2180 QuicPacketCreator::MinPlaintextPacketSize(client_framer_.version()) +
2181 GetEncryptionOverhead();
2182 // Make sure a length which cannot accommodate header (includes header
2183 // protection minimal length) gets rejected.
2184 creator_.SetSoftMaxPacketLength(overhead - 1);
2185 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2186
2187 creator_.SetSoftMaxPacketLength(overhead);
2188 EXPECT_EQ(overhead, creator_.max_packet_length());
2189
2190 // Verify creator has room for stream frame because max_packet_length_ gets
2191 // restored.
vasilvva57bbb32019-11-06 06:19:27 -08002192 ASSERT_TRUE(creator_.HasRoomForStreamFrame(
2193 GetNthClientInitiatedStreamId(1), kMaxIetfVarInt,
2194 std::numeric_limits<uint32_t>::max()));
fayang2ab1e852019-11-04 11:24:36 -08002195 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2196
2197 // Same for message frame.
2198 if (VersionSupportsMessageFrames(client_framer_.transport_version())) {
2199 creator_.SetSoftMaxPacketLength(overhead);
2200 // Verify GetCurrentLargestMessagePayload is based on the actual
2201 // max_packet_length.
2202 EXPECT_LT(1u, creator_.GetCurrentLargestMessagePayload());
2203 EXPECT_EQ(overhead, creator_.max_packet_length());
2204 ASSERT_TRUE(creator_.HasRoomForMessageFrame(
2205 creator_.GetCurrentLargestMessagePayload()));
2206 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2207 }
2208
2209 // Verify creator can consume crypto data because max_packet_length_ gets
2210 // restored.
2211 creator_.SetSoftMaxPacketLength(overhead);
2212 EXPECT_EQ(overhead, creator_.max_packet_length());
2213 std::string data = "crypto data";
2214 MakeIOVector(data, &iov_);
2215 QuicFrame frame;
2216 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
2217 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2218 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
2219 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
2220 &frame));
2221 size_t bytes_consumed = frame.stream_frame.data_length;
2222 EXPECT_LT(0u, bytes_consumed);
2223 } else {
2224 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
2225 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
2226 ENCRYPTION_INITIAL, data.length(), kOffset,
2227 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
2228 size_t bytes_consumed = frame.crypto_frame->data_length;
2229 EXPECT_LT(0u, bytes_consumed);
2230 }
2231 EXPECT_TRUE(creator_.HasPendingFrames());
2232 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2233 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2234 creator_.FlushCurrentPacket();
2235
2236 // Verify ACK frame can be consumed.
2237 creator_.SetSoftMaxPacketLength(overhead);
2238 EXPECT_EQ(overhead, creator_.max_packet_length());
2239 QuicAckFrame ack_frame(InitAckFrame(10u));
2240 EXPECT_TRUE(
2241 creator_.AddSavedFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
2242 EXPECT_TRUE(creator_.HasPendingFrames());
2243}
2244
fayang4245c212019-11-05 13:33:46 -08002245class MockDelegate : public QuicPacketCreator::DelegateInterface {
2246 public:
2247 MockDelegate() {}
2248 MockDelegate(const MockDelegate&) = delete;
2249 MockDelegate& operator=(const MockDelegate&) = delete;
2250 ~MockDelegate() override {}
2251
2252 MOCK_METHOD2(ShouldGeneratePacket,
2253 bool(HasRetransmittableData retransmittable,
2254 IsHandshake handshake));
2255 MOCK_METHOD0(MaybeBundleAckOpportunistically, const QuicFrames());
2256 MOCK_METHOD0(GetPacketBuffer, char*());
2257 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
2258 MOCK_METHOD2(OnUnrecoverableError, void(QuicErrorCode, const std::string&));
2259
2260 void SetCanWriteAnything() {
2261 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
2262 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2263 .WillRepeatedly(Return(true));
2264 }
2265
2266 void SetCanNotWrite() {
2267 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2268 .WillRepeatedly(Return(false));
2269 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2270 .WillRepeatedly(Return(false));
2271 }
2272
2273 // Use this when only ack frames should be allowed to be written.
2274 void SetCanWriteOnlyNonRetransmittable() {
2275 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2276 .WillRepeatedly(Return(false));
2277 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2278 .WillRepeatedly(Return(true));
2279 }
2280};
2281
2282// Simple struct for describing the contents of a packet.
2283// Useful in conjunction with a SimpleQuicFrame for validating that a packet
2284// contains the expected frames.
2285struct PacketContents {
2286 PacketContents()
2287 : num_ack_frames(0),
2288 num_connection_close_frames(0),
2289 num_goaway_frames(0),
2290 num_rst_stream_frames(0),
2291 num_stop_waiting_frames(0),
2292 num_stream_frames(0),
2293 num_crypto_frames(0),
2294 num_ping_frames(0),
2295 num_mtu_discovery_frames(0),
2296 num_padding_frames(0) {}
2297
2298 size_t num_ack_frames;
2299 size_t num_connection_close_frames;
2300 size_t num_goaway_frames;
2301 size_t num_rst_stream_frames;
2302 size_t num_stop_waiting_frames;
2303 size_t num_stream_frames;
2304 size_t num_crypto_frames;
2305 size_t num_ping_frames;
2306 size_t num_mtu_discovery_frames;
2307 size_t num_padding_frames;
2308};
2309
2310class MultiplePacketsTestPacketCreator : public QuicPacketCreator {
2311 public:
2312 MultiplePacketsTestPacketCreator(
2313 QuicConnectionId connection_id,
2314 QuicFramer* framer,
2315 QuicRandom* random_generator,
2316 QuicPacketCreator::DelegateInterface* delegate,
2317 SimpleDataProducer* producer)
2318 : QuicPacketCreator(connection_id, framer, random_generator, delegate),
2319 ack_frame_(InitAckFrame(1)),
2320 delegate_(static_cast<MockDelegate*>(delegate)),
2321 producer_(producer) {}
2322
2323 bool ConsumeRetransmittableControlFrame(const QuicFrame& frame,
2324 bool bundle_ack) {
2325 if (!has_ack()) {
2326 QuicFrames frames;
2327 if (bundle_ack) {
2328 frames.push_back(QuicFrame(&ack_frame_));
2329 }
2330 if (delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2331 NOT_HANDSHAKE)) {
2332 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically())
2333 .WillOnce(Return(frames));
2334 }
2335 }
2336 return QuicPacketCreator::ConsumeRetransmittableControlFrame(frame);
2337 }
2338
2339 QuicConsumedData ConsumeDataFastPath(QuicStreamId id,
2340 const struct iovec* iov,
2341 int iov_count,
2342 size_t total_length,
2343 QuicStreamOffset offset,
2344 bool fin) {
2345 // Save data before data is consumed.
2346 if (total_length > 0) {
2347 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2348 }
2349 return QuicPacketCreator::ConsumeDataFastPath(id, total_length, offset, fin,
2350 0);
2351 }
2352
2353 QuicConsumedData ConsumeData(QuicStreamId id,
2354 const struct iovec* iov,
2355 int iov_count,
2356 size_t total_length,
2357 QuicStreamOffset offset,
2358 StreamSendingState state) {
2359 // Save data before data is consumed.
2360 if (total_length > 0) {
2361 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2362 }
2363 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2364 NOT_HANDSHAKE)) {
2365 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2366 }
2367 return QuicPacketCreator::ConsumeData(id, total_length, offset, state);
2368 }
2369
2370 MessageStatus AddMessageFrame(QuicMessageId message_id,
2371 QuicMemSliceSpan message) {
2372 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2373 NOT_HANDSHAKE)) {
2374 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2375 }
2376 return QuicPacketCreator::AddMessageFrame(message_id, message);
2377 }
2378
2379 size_t ConsumeCryptoData(EncryptionLevel level,
2380 QuicStringPiece data,
2381 QuicStreamOffset offset) {
2382 producer_->SaveCryptoData(level, offset, data);
2383 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2384 NOT_HANDSHAKE)) {
2385 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2386 }
2387 return QuicPacketCreator::ConsumeCryptoData(level, data.length(), offset);
2388 }
2389
2390 QuicAckFrame ack_frame_;
2391 MockDelegate* delegate_;
2392 SimpleDataProducer* producer_;
2393};
2394
2395class QuicPacketCreatorMultiplePacketsTest : public QuicTest {
2396 public:
2397 QuicPacketCreatorMultiplePacketsTest()
2398 : framer_(AllSupportedVersions(),
2399 QuicTime::Zero(),
2400 Perspective::IS_CLIENT,
2401 kQuicDefaultConnectionIdLength),
2402 creator_(TestConnectionId(),
2403 &framer_,
2404 &random_creator_,
2405 &delegate_,
2406 &producer_),
2407 ack_frame_(InitAckFrame(1)) {
2408 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
2409 creator_.SetEncrypter(
2410 ENCRYPTION_FORWARD_SECURE,
2411 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
2412 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2413 framer_.set_data_producer(&producer_);
2414 if (simple_framer_.framer()->version().KnowsWhichDecrypterToUse()) {
2415 simple_framer_.framer()->InstallDecrypter(
2416 ENCRYPTION_FORWARD_SECURE,
2417 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
2418 }
2419 creator_.AttachPacketFlusher();
2420 }
2421
2422 ~QuicPacketCreatorMultiplePacketsTest() override {
2423 for (SerializedPacket& packet : packets_) {
2424 delete[] packet.encrypted_buffer;
2425 ClearSerializedPacket(&packet);
2426 }
2427 }
2428
2429 void SavePacket(SerializedPacket* packet) {
2430 packet->encrypted_buffer = CopyBuffer(*packet);
2431 packets_.push_back(*packet);
2432 packet->encrypted_buffer = nullptr;
2433 packet->retransmittable_frames.clear();
2434 }
2435
2436 protected:
2437 QuicRstStreamFrame* CreateRstStreamFrame() {
2438 return new QuicRstStreamFrame(1, 1, QUIC_STREAM_NO_ERROR, 0);
2439 }
2440
2441 QuicGoAwayFrame* CreateGoAwayFrame() {
2442 return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, std::string());
2443 }
2444
2445 void CheckPacketContains(const PacketContents& contents,
2446 size_t packet_index) {
2447 ASSERT_GT(packets_.size(), packet_index);
2448 const SerializedPacket& packet = packets_[packet_index];
2449 size_t num_retransmittable_frames =
2450 contents.num_connection_close_frames + contents.num_goaway_frames +
2451 contents.num_rst_stream_frames + contents.num_stream_frames +
2452 contents.num_crypto_frames + contents.num_ping_frames;
2453 size_t num_frames =
2454 contents.num_ack_frames + contents.num_stop_waiting_frames +
2455 contents.num_mtu_discovery_frames + contents.num_padding_frames +
2456 num_retransmittable_frames;
2457
2458 if (num_retransmittable_frames == 0) {
2459 ASSERT_TRUE(packet.retransmittable_frames.empty());
2460 } else {
2461 ASSERT_FALSE(packet.retransmittable_frames.empty());
2462 EXPECT_EQ(num_retransmittable_frames,
2463 packet.retransmittable_frames.size());
2464 }
2465
2466 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2467 ASSERT_TRUE(simple_framer_.ProcessPacket(
2468 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2469 size_t num_padding_frames = 0;
2470 if (contents.num_padding_frames == 0) {
2471 num_padding_frames = simple_framer_.padding_frames().size();
2472 }
2473 EXPECT_EQ(num_frames + num_padding_frames, simple_framer_.num_frames());
2474 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
2475 EXPECT_EQ(contents.num_connection_close_frames,
2476 simple_framer_.connection_close_frames().size());
2477 EXPECT_EQ(contents.num_goaway_frames,
2478 simple_framer_.goaway_frames().size());
2479 EXPECT_EQ(contents.num_rst_stream_frames,
2480 simple_framer_.rst_stream_frames().size());
2481 EXPECT_EQ(contents.num_stream_frames,
2482 simple_framer_.stream_frames().size());
2483 EXPECT_EQ(contents.num_crypto_frames,
2484 simple_framer_.crypto_frames().size());
2485 EXPECT_EQ(contents.num_stop_waiting_frames,
2486 simple_framer_.stop_waiting_frames().size());
2487 if (contents.num_padding_frames != 0) {
2488 EXPECT_EQ(contents.num_padding_frames,
2489 simple_framer_.padding_frames().size());
2490 }
2491
2492 // From the receiver's perspective, MTU discovery frames are ping frames.
2493 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames,
2494 simple_framer_.ping_frames().size());
2495 }
2496
2497 void CheckPacketHasSingleStreamFrame(size_t packet_index) {
2498 ASSERT_GT(packets_.size(), packet_index);
2499 const SerializedPacket& packet = packets_[packet_index];
2500 ASSERT_FALSE(packet.retransmittable_frames.empty());
2501 EXPECT_EQ(1u, packet.retransmittable_frames.size());
2502 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2503 ASSERT_TRUE(simple_framer_.ProcessPacket(
2504 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2505 EXPECT_EQ(1u, simple_framer_.num_frames());
2506 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
2507 }
2508
2509 void CheckAllPacketsHaveSingleStreamFrame() {
2510 for (size_t i = 0; i < packets_.size(); i++) {
2511 CheckPacketHasSingleStreamFrame(i);
2512 }
2513 }
2514
2515 void CreateData(size_t len) {
2516 data_array_.reset(new char[len]);
2517 memset(data_array_.get(), '?', len);
2518 iov_.iov_base = data_array_.get();
2519 iov_.iov_len = len;
2520 }
2521
2522 QuicFramer framer_;
2523 MockRandom random_creator_;
2524 StrictMock<MockDelegate> delegate_;
2525 MultiplePacketsTestPacketCreator creator_;
2526 SimpleQuicFramer simple_framer_;
2527 std::vector<SerializedPacket> packets_;
2528 QuicAckFrame ack_frame_;
2529 struct iovec iov_;
2530 SimpleBufferAllocator allocator_;
2531
2532 private:
2533 std::unique_ptr<char[]> data_array_;
2534 SimpleDataProducer producer_;
2535};
2536
2537TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_NotWritable) {
2538 delegate_.SetCanNotWrite();
2539
2540 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2541 const bool consumed =
2542 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2543 /*bundle_ack=*/false);
2544 EXPECT_FALSE(consumed);
2545 EXPECT_FALSE(creator_.HasPendingFrames());
2546 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2547 delete rst_frame;
2548}
2549
2550TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_OnlyAckWritable) {
2551 delegate_.SetCanWriteOnlyNonRetransmittable();
2552
2553 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2554 const bool consumed =
2555 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2556 /*bundle_ack=*/false);
2557 EXPECT_FALSE(consumed);
2558 EXPECT_FALSE(creator_.HasPendingFrames());
2559 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2560 delete rst_frame;
2561}
2562
2563TEST_F(QuicPacketCreatorMultiplePacketsTest,
2564 AddControlFrame_WritableAndShouldNotFlush) {
2565 delegate_.SetCanWriteAnything();
2566
2567 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2568 /*bundle_ack=*/false);
2569 EXPECT_TRUE(creator_.HasPendingFrames());
2570 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2571}
2572
2573TEST_F(QuicPacketCreatorMultiplePacketsTest,
2574 AddControlFrame_NotWritableBatchThenFlush) {
2575 delegate_.SetCanNotWrite();
2576
2577 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2578 const bool consumed =
2579 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2580 /*bundle_ack=*/false);
2581 EXPECT_FALSE(consumed);
2582 EXPECT_FALSE(creator_.HasPendingFrames());
2583 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2584 delete rst_frame;
2585}
2586
2587TEST_F(QuicPacketCreatorMultiplePacketsTest,
2588 AddControlFrame_WritableAndShouldFlush) {
2589 delegate_.SetCanWriteAnything();
2590
2591 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2592 .WillOnce(
2593 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2594
2595 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2596 /*bundle_ack=*/false);
2597 creator_.Flush();
2598 EXPECT_FALSE(creator_.HasPendingFrames());
2599 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2600
2601 PacketContents contents;
2602 contents.num_rst_stream_frames = 1;
2603 CheckPacketContains(contents, 0);
2604}
2605
2606TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeCryptoData) {
2607 delegate_.SetCanWriteAnything();
2608
2609 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2610 .WillOnce(
2611 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2612 std::string data = "crypto data";
2613 size_t consumed_bytes =
2614 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2615 creator_.Flush();
2616 EXPECT_EQ(data.length(), consumed_bytes);
2617 EXPECT_FALSE(creator_.HasPendingFrames());
2618 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2619
2620 PacketContents contents;
2621 contents.num_crypto_frames = 1;
2622 contents.num_padding_frames = 1;
2623 CheckPacketContains(contents, 0);
2624}
2625
2626TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_NotWritable) {
2627 delegate_.SetCanNotWrite();
2628
2629 MakeIOVector("foo", &iov_);
2630 QuicConsumedData consumed = creator_.ConsumeData(
2631 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2632 Perspective::IS_CLIENT),
2633 &iov_, 1u, iov_.iov_len, 0, FIN);
2634 EXPECT_EQ(0u, consumed.bytes_consumed);
2635 EXPECT_FALSE(consumed.fin_consumed);
2636 EXPECT_FALSE(creator_.HasPendingFrames());
2637 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2638}
2639
2640TEST_F(QuicPacketCreatorMultiplePacketsTest,
2641 ConsumeData_WritableAndShouldNotFlush) {
2642 delegate_.SetCanWriteAnything();
2643
2644 MakeIOVector("foo", &iov_);
2645 QuicConsumedData consumed = creator_.ConsumeData(
2646 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2647 Perspective::IS_CLIENT),
2648 &iov_, 1u, iov_.iov_len, 0, FIN);
2649 EXPECT_EQ(3u, consumed.bytes_consumed);
2650 EXPECT_TRUE(consumed.fin_consumed);
2651 EXPECT_TRUE(creator_.HasPendingFrames());
2652 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2653}
2654
2655TEST_F(QuicPacketCreatorMultiplePacketsTest,
2656 ConsumeData_WritableAndShouldFlush) {
2657 delegate_.SetCanWriteAnything();
2658
2659 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2660 .WillOnce(
2661 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2662 MakeIOVector("foo", &iov_);
2663 QuicConsumedData consumed = creator_.ConsumeData(
2664 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2665 Perspective::IS_CLIENT),
2666 &iov_, 1u, iov_.iov_len, 0, FIN);
2667 creator_.Flush();
2668 EXPECT_EQ(3u, consumed.bytes_consumed);
2669 EXPECT_TRUE(consumed.fin_consumed);
2670 EXPECT_FALSE(creator_.HasPendingFrames());
2671 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2672
2673 PacketContents contents;
2674 contents.num_stream_frames = 1;
2675 CheckPacketContains(contents, 0);
2676}
2677
2678// Test the behavior of ConsumeData when the data consumed is for the crypto
2679// handshake stream. Ensure that the packet is always sent and padded even if
2680// the creator operates in batch mode.
2681TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_Handshake) {
2682 delegate_.SetCanWriteAnything();
2683
2684 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2685 .WillOnce(
2686 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2687 std::string data = "foo bar";
2688 MakeIOVector(data, &iov_);
2689 size_t consumed_bytes = 0;
2690 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2691 consumed_bytes = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2692 } else {
2693 consumed_bytes =
2694 creator_
2695 .ConsumeData(
2696 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2697 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2698 .bytes_consumed;
2699 }
2700 EXPECT_EQ(7u, consumed_bytes);
2701 EXPECT_FALSE(creator_.HasPendingFrames());
2702 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2703
2704 PacketContents contents;
2705 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2706 contents.num_crypto_frames = 1;
2707 } else {
2708 contents.num_stream_frames = 1;
2709 }
2710 contents.num_padding_frames = 1;
2711 CheckPacketContains(contents, 0);
2712
2713 ASSERT_EQ(1u, packets_.size());
2714 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2715 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
2716}
2717
2718// Test the behavior of ConsumeData when the data is for the crypto handshake
2719// stream, but padding is disabled.
2720TEST_F(QuicPacketCreatorMultiplePacketsTest,
2721 ConsumeData_Handshake_PaddingDisabled) {
2722 creator_.set_fully_pad_crypto_handshake_packets(false);
2723
2724 delegate_.SetCanWriteAnything();
2725
2726 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2727 .WillOnce(
2728 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2729 std::string data = "foo";
2730 MakeIOVector(data, &iov_);
2731 size_t bytes_consumed = 0;
2732 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2733 bytes_consumed = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2734 } else {
2735 bytes_consumed =
2736 creator_
2737 .ConsumeData(
2738 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2739 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2740 .bytes_consumed;
2741 }
2742 EXPECT_EQ(3u, bytes_consumed);
2743 EXPECT_FALSE(creator_.HasPendingFrames());
2744 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2745
2746 PacketContents contents;
2747 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2748 contents.num_crypto_frames = 1;
2749 } else {
2750 contents.num_stream_frames = 1;
2751 }
2752 contents.num_padding_frames = 0;
2753 CheckPacketContains(contents, 0);
2754
2755 ASSERT_EQ(1u, packets_.size());
2756
2757 // Packet is not fully padded, but we want to future packets to be larger.
2758 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2759 size_t expected_packet_length = 27;
2760 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2761 // The framing of CRYPTO frames is slightly different than that of stream
2762 // frames, so the expected packet length differs slightly.
2763 expected_packet_length = 28;
2764 }
2765 if (framer_.version().HasHeaderProtection()) {
2766 expected_packet_length = 29;
2767 }
2768 EXPECT_EQ(expected_packet_length, packets_[0].encrypted_length);
2769}
2770
2771TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_EmptyData) {
2772 delegate_.SetCanWriteAnything();
2773
2774 EXPECT_QUIC_BUG(creator_.ConsumeData(
2775 QuicUtils::QuicUtils::GetFirstBidirectionalStreamId(
2776 framer_.transport_version(), Perspective::IS_CLIENT),
2777 nullptr, 0, 0, 0, NO_FIN),
2778 "Attempt to consume empty data without FIN.");
2779}
2780
2781TEST_F(QuicPacketCreatorMultiplePacketsTest,
2782 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
2783 delegate_.SetCanWriteAnything();
2784
2785 MakeIOVector("foo", &iov_);
2786 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2787 framer_.transport_version(), Perspective::IS_CLIENT),
2788 &iov_, 1u, iov_.iov_len, 0, FIN);
2789 MakeIOVector("quux", &iov_);
2790 QuicConsumedData consumed =
2791 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 3, NO_FIN);
2792 EXPECT_EQ(4u, consumed.bytes_consumed);
2793 EXPECT_FALSE(consumed.fin_consumed);
2794 EXPECT_TRUE(creator_.HasPendingFrames());
2795 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2796}
2797
2798TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_BatchOperations) {
2799 delegate_.SetCanWriteAnything();
2800
2801 MakeIOVector("foo", &iov_);
2802 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2803 framer_.transport_version(), Perspective::IS_CLIENT),
2804 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2805 MakeIOVector("quux", &iov_);
2806 QuicConsumedData consumed = creator_.ConsumeData(
2807 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2808 Perspective::IS_CLIENT),
2809 &iov_, 1u, iov_.iov_len, 3, FIN);
2810 EXPECT_EQ(4u, consumed.bytes_consumed);
2811 EXPECT_TRUE(consumed.fin_consumed);
2812 EXPECT_TRUE(creator_.HasPendingFrames());
2813 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2814
2815 // Now both frames will be flushed out.
2816 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2817 .WillOnce(
2818 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2819 creator_.Flush();
2820 EXPECT_FALSE(creator_.HasPendingFrames());
2821 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2822
2823 PacketContents contents;
2824 contents.num_stream_frames =
2825 GetQuicReloadableFlag(quic_coalesce_stream_frames) ? 1 : 2;
2826 CheckPacketContains(contents, 0);
2827}
2828
2829TEST_F(QuicPacketCreatorMultiplePacketsTest,
2830 ConsumeData_FramesPreviouslyQueued) {
2831 // Set the packet size be enough for two stream frames with 0 stream offset,
2832 // but not enough for a stream frame of 0 offset and one with non-zero offset.
2833 size_t length =
2834 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
2835 GetPacketHeaderSize(
2836 framer_.transport_version(),
2837 creator_.GetDestinationConnectionIdLength(),
2838 creator_.GetSourceConnectionIdLength(),
2839 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2840 !kIncludeDiversificationNonce,
2841 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2842 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
2843 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
2844 // Add an extra 3 bytes for the payload and 1 byte so
2845 // BytesFree is larger than the GetMinStreamFrameSize.
2846 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0,
2847 false, 3) +
2848 3 +
2849 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0, true,
2850 1) +
2851 1;
2852 creator_.SetMaxPacketLength(length);
2853 delegate_.SetCanWriteAnything();
2854 {
2855 InSequence dummy;
2856 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2857 .WillOnce(
2858 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2859 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2860 .WillOnce(
2861 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2862 }
2863 // Queue enough data to prevent a stream frame with a non-zero offset from
2864 // fitting.
2865 MakeIOVector("foo", &iov_);
2866 QuicConsumedData consumed = creator_.ConsumeData(
2867 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2868 Perspective::IS_CLIENT),
2869 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2870 EXPECT_EQ(3u, consumed.bytes_consumed);
2871 EXPECT_FALSE(consumed.fin_consumed);
2872 EXPECT_TRUE(creator_.HasPendingFrames());
2873 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2874
2875 // This frame will not fit with the existing frame, causing the queued frame
2876 // to be serialized, and it will be added to a new open packet.
2877 MakeIOVector("bar", &iov_);
2878 consumed = creator_.ConsumeData(
2879 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2880 Perspective::IS_CLIENT),
2881 &iov_, 1u, iov_.iov_len, 3, FIN);
2882 EXPECT_EQ(3u, consumed.bytes_consumed);
2883 EXPECT_TRUE(consumed.fin_consumed);
2884 EXPECT_TRUE(creator_.HasPendingFrames());
2885 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2886
2887 creator_.FlushCurrentPacket();
2888 EXPECT_FALSE(creator_.HasPendingFrames());
2889 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2890
2891 PacketContents contents;
2892 contents.num_stream_frames = 1;
2893 CheckPacketContains(contents, 0);
2894 CheckPacketContains(contents, 1);
2895}
2896
2897TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataFastPath) {
2898 delegate_.SetCanWriteAnything();
2899 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
2900
2901 // Create a 10000 byte IOVector.
2902 CreateData(10000);
2903 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2904 .WillRepeatedly(
2905 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2906 QuicConsumedData consumed = creator_.ConsumeDataFastPath(
2907 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2908 Perspective::IS_CLIENT),
2909 &iov_, 1u, iov_.iov_len, 0, true);
2910 EXPECT_EQ(10000u, consumed.bytes_consumed);
2911 EXPECT_TRUE(consumed.fin_consumed);
2912 EXPECT_FALSE(creator_.HasPendingFrames());
2913 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2914
2915 PacketContents contents;
2916 contents.num_stream_frames = 1;
2917 CheckPacketContains(contents, 0);
2918 EXPECT_FALSE(packets_.empty());
2919 SerializedPacket packet = packets_.back();
2920 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2921 EXPECT_EQ(LOSS_RETRANSMISSION, packet.transmission_type);
2922 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2923 const QuicStreamFrame& stream_frame =
2924 packet.retransmittable_frames.front().stream_frame;
2925 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2926}
2927
2928TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLarge) {
2929 delegate_.SetCanWriteAnything();
2930
2931 // Create a 10000 byte IOVector.
2932 CreateData(10000);
2933 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2934 .WillRepeatedly(
2935 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2936 QuicConsumedData consumed = creator_.ConsumeData(
2937 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2938 Perspective::IS_CLIENT),
2939 &iov_, 1u, iov_.iov_len, 0, FIN);
2940 EXPECT_EQ(10000u, consumed.bytes_consumed);
2941 EXPECT_TRUE(consumed.fin_consumed);
2942 EXPECT_FALSE(creator_.HasPendingFrames());
2943 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2944
2945 PacketContents contents;
2946 contents.num_stream_frames = 1;
2947 CheckPacketContains(contents, 0);
2948 EXPECT_FALSE(packets_.empty());
2949 SerializedPacket packet = packets_.back();
2950 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2951 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2952 const QuicStreamFrame& stream_frame =
2953 packet.retransmittable_frames.front().stream_frame;
2954 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2955}
2956
2957TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckFalse) {
2958 delegate_.SetCanNotWrite();
2959
2960 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2961 const bool success =
2962 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2963 /*bundle_ack=*/true);
2964 EXPECT_FALSE(success);
2965 EXPECT_FALSE(creator_.HasPendingFrames());
2966 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2967
2968 delegate_.SetCanWriteAnything();
2969
2970 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2971 /*bundle_ack=*/false);
2972
2973 // Create a 10000 byte IOVector.
2974 CreateData(10000);
2975 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2976 .WillRepeatedly(
2977 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2978 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2979 /*bundle_ack=*/true);
2980 QuicConsumedData consumed = creator_.ConsumeData(
2981 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2982 Perspective::IS_CLIENT),
2983 &iov_, 1u, iov_.iov_len, 0, FIN);
2984 creator_.Flush();
2985
2986 EXPECT_EQ(10000u, consumed.bytes_consumed);
2987 EXPECT_TRUE(consumed.fin_consumed);
2988 EXPECT_FALSE(creator_.HasPendingFrames());
2989 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2990
2991 EXPECT_FALSE(packets_.empty());
2992 SerializedPacket packet = packets_.back();
2993 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2994 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2995 const QuicStreamFrame& stream_frame =
2996 packet.retransmittable_frames.front().stream_frame;
2997 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2998}
2999
3000TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckTrue) {
fayang4245c212019-11-05 13:33:46 -08003001 delegate_.SetCanNotWrite();
3002 delegate_.SetCanWriteAnything();
3003
3004 // Create a 10000 byte IOVector.
3005 CreateData(10000);
3006 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3007 .WillRepeatedly(
3008 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3009 QuicConsumedData consumed = creator_.ConsumeData(
3010 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3011 Perspective::IS_CLIENT),
3012 &iov_, 1u, iov_.iov_len, 0, FIN);
3013 creator_.Flush();
3014
3015 EXPECT_EQ(10000u, consumed.bytes_consumed);
3016 EXPECT_TRUE(consumed.fin_consumed);
3017 EXPECT_FALSE(creator_.HasPendingFrames());
3018 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3019
3020 EXPECT_FALSE(packets_.empty());
3021 SerializedPacket packet = packets_.back();
3022 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3023 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3024 const QuicStreamFrame& stream_frame =
3025 packet.retransmittable_frames.front().stream_frame;
3026 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3027}
3028
3029TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations) {
3030 delegate_.SetCanNotWrite();
3031
3032 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3033 const bool consumed =
3034 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3035 /*bundle_ack=*/true);
3036 EXPECT_FALSE(consumed);
3037 EXPECT_FALSE(creator_.HasPendingFrames());
3038 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3039 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3040
3041 delegate_.SetCanWriteAnything();
3042
3043 EXPECT_TRUE(
3044 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3045 /*bundle_ack=*/false));
3046 // Send some data and a control frame
3047 MakeIOVector("quux", &iov_);
3048 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3049 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3050 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3051 /*bundle_ack=*/false);
3052 }
3053 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(3));
3054
3055 // All five frames will be flushed out in a single packet.
3056 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3057 .WillOnce(
3058 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3059 creator_.Flush();
3060 EXPECT_FALSE(creator_.HasPendingFrames());
3061 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3062 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3063
3064 PacketContents contents;
3065 // ACK will be flushed by connection.
3066 contents.num_ack_frames = 0;
3067 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3068 contents.num_goaway_frames = 1;
3069 } else {
3070 contents.num_goaway_frames = 0;
3071 }
3072 contents.num_rst_stream_frames = 1;
3073 contents.num_stream_frames = 1;
3074 CheckPacketContains(contents, 0);
3075}
3076
3077TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations2) {
3078 delegate_.SetCanNotWrite();
3079
3080 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3081 const bool success =
3082 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3083 /*bundle_ack=*/true);
3084 EXPECT_FALSE(success);
3085 EXPECT_FALSE(creator_.HasPendingFrames());
3086 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3087
3088 delegate_.SetCanWriteAnything();
3089
3090 {
3091 InSequence dummy;
3092 // All five frames will be flushed out in a single packet
3093 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3094 .WillOnce(
3095 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3096 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3097 .WillOnce(
3098 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3099 }
3100 EXPECT_TRUE(
3101 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3102 /*bundle_ack=*/false));
3103 // Send enough data to exceed one packet
3104 size_t data_len = kDefaultMaxPacketSize + 100;
3105 CreateData(data_len);
3106 QuicConsumedData consumed =
3107 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, FIN);
3108 EXPECT_EQ(data_len, consumed.bytes_consumed);
3109 EXPECT_TRUE(consumed.fin_consumed);
3110 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3111 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3112 /*bundle_ack=*/false);
3113 }
3114
3115 creator_.Flush();
3116 EXPECT_FALSE(creator_.HasPendingFrames());
3117 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3118
3119 // The first packet should have the queued data and part of the stream data.
3120 PacketContents contents;
3121 // ACK will be sent by connection.
3122 contents.num_ack_frames = 0;
3123 contents.num_rst_stream_frames = 1;
3124 contents.num_stream_frames = 1;
3125 CheckPacketContains(contents, 0);
3126
3127 // The second should have the remainder of the stream data.
3128 PacketContents contents2;
3129 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3130 contents2.num_goaway_frames = 1;
3131 } else {
3132 contents2.num_goaway_frames = 0;
3133 }
3134 contents2.num_stream_frames = 1;
3135 CheckPacketContains(contents2, 1);
3136}
3137
3138// Regression test of b/120493795.
3139TEST_F(QuicPacketCreatorMultiplePacketsTest, PacketTransmissionType) {
3140 delegate_.SetCanWriteAnything();
3141
3142 // The first ConsumeData will fill the packet without flush.
3143 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
3144
3145 size_t data_len = 1324;
3146 CreateData(data_len);
3147 QuicStreamId stream1_id = QuicUtils::GetFirstBidirectionalStreamId(
3148 framer_.transport_version(), Perspective::IS_CLIENT);
3149 QuicConsumedData consumed =
3150 creator_.ConsumeData(stream1_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3151 EXPECT_EQ(data_len, consumed.bytes_consumed);
3152 ASSERT_EQ(0u, creator_.BytesFree())
3153 << "Test setup failed: Please increase data_len to "
3154 << data_len + creator_.BytesFree() << " bytes.";
3155
3156 // The second ConsumeData can not be added to the packet and will flush.
3157 creator_.SetTransmissionType(NOT_RETRANSMISSION);
3158
3159 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3160 .WillOnce(
3161 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3162
3163 QuicStreamId stream2_id = stream1_id + 4;
3164
3165 consumed =
3166 creator_.ConsumeData(stream2_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3167 EXPECT_EQ(data_len, consumed.bytes_consumed);
3168
3169 // Ensure the packet is successfully created.
3170 ASSERT_EQ(1u, packets_.size());
3171 ASSERT_TRUE(packets_[0].encrypted_buffer);
3172 ASSERT_EQ(1u, packets_[0].retransmittable_frames.size());
3173 EXPECT_EQ(stream1_id,
3174 packets_[0].retransmittable_frames[0].stream_frame.stream_id);
3175
3176 // Since the second frame was not added, the packet's transmission type
3177 // should be the first frame's type.
3178 EXPECT_EQ(packets_[0].transmission_type, LOSS_RETRANSMISSION);
3179}
3180
3181TEST_F(QuicPacketCreatorMultiplePacketsTest, TestConnectionIdLength) {
3182 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
3183 creator_.SetServerConnectionIdLength(0);
3184 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3185 creator_.GetDestinationConnectionIdLength());
3186
3187 for (size_t i = 1; i < 10; i++) {
3188 creator_.SetServerConnectionIdLength(i);
3189 if (VersionHasIetfInvariantHeader(framer_.transport_version())) {
3190 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3191 creator_.GetDestinationConnectionIdLength());
3192 } else {
3193 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID,
3194 creator_.GetDestinationConnectionIdLength());
3195 }
3196 }
3197}
3198
3199// Test whether SetMaxPacketLength() works in the situation when the queue is
3200// empty, and we send three packets worth of data.
3201TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Initial) {
3202 delegate_.SetCanWriteAnything();
3203
3204 // Send enough data for three packets.
3205 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
3206 size_t packet_len = kDefaultMaxPacketSize + 100;
3207 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3208 creator_.SetMaxPacketLength(packet_len);
3209 EXPECT_EQ(packet_len, creator_.max_packet_length());
3210
3211 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3212 .Times(3)
3213 .WillRepeatedly(
3214 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3215 CreateData(data_len);
3216 QuicConsumedData consumed = creator_.ConsumeData(
3217 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3218 Perspective::IS_CLIENT),
3219 &iov_, 1u, iov_.iov_len,
3220 /*offset=*/0, FIN);
3221 EXPECT_EQ(data_len, consumed.bytes_consumed);
3222 EXPECT_TRUE(consumed.fin_consumed);
3223 EXPECT_FALSE(creator_.HasPendingFrames());
3224 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3225
3226 // We expect three packets, and first two of them have to be of packet_len
3227 // size. We check multiple packets (instead of just one) because we want to
3228 // ensure that |max_packet_length_| does not get changed incorrectly by the
3229 // creator after first packet is serialized.
3230 ASSERT_EQ(3u, packets_.size());
3231 EXPECT_EQ(packet_len, packets_[0].encrypted_length);
3232 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3233 CheckAllPacketsHaveSingleStreamFrame();
3234}
3235
3236// Test whether SetMaxPacketLength() works in the situation when we first write
3237// data, then change packet size, then write data again.
3238TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Middle) {
3239 delegate_.SetCanWriteAnything();
3240
3241 // We send enough data to overflow default packet length, but not the altered
3242 // one.
3243 size_t data_len = kDefaultMaxPacketSize;
3244 size_t packet_len = kDefaultMaxPacketSize + 100;
3245 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3246
3247 // We expect to see three packets in total.
3248 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3249 .Times(3)
3250 .WillRepeatedly(
3251 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3252
3253 // Send two packets before packet size change.
3254 CreateData(data_len);
3255 QuicConsumedData consumed = creator_.ConsumeData(
3256 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3257 Perspective::IS_CLIENT),
3258 &iov_, 1u, iov_.iov_len,
3259 /*offset=*/0, NO_FIN);
3260 creator_.Flush();
3261 EXPECT_EQ(data_len, consumed.bytes_consumed);
3262 EXPECT_FALSE(consumed.fin_consumed);
3263 EXPECT_FALSE(creator_.HasPendingFrames());
3264 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3265
3266 // Make sure we already have two packets.
3267 ASSERT_EQ(2u, packets_.size());
3268
3269 // Increase packet size.
3270 creator_.SetMaxPacketLength(packet_len);
3271 EXPECT_EQ(packet_len, creator_.max_packet_length());
3272
3273 // Send a packet after packet size change.
3274 CreateData(data_len);
3275 creator_.AttachPacketFlusher();
3276 consumed = creator_.ConsumeData(
3277 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3278 Perspective::IS_CLIENT),
3279 &iov_, 1u, iov_.iov_len, data_len, FIN);
3280 creator_.Flush();
3281 EXPECT_EQ(data_len, consumed.bytes_consumed);
3282 EXPECT_TRUE(consumed.fin_consumed);
3283 EXPECT_FALSE(creator_.HasPendingFrames());
3284 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3285
3286 // We expect first data chunk to get fragmented, but the second one to fit
3287 // into a single packet.
3288 ASSERT_EQ(3u, packets_.size());
3289 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3290 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length);
3291 CheckAllPacketsHaveSingleStreamFrame();
3292}
3293
3294// Test whether SetMaxPacketLength() works correctly when we force the change of
3295// the packet size in the middle of the batched packet.
3296TEST_F(QuicPacketCreatorMultiplePacketsTest,
3297 SetMaxPacketLength_MidpacketFlush) {
3298 delegate_.SetCanWriteAnything();
3299
3300 size_t first_write_len = kDefaultMaxPacketSize / 2;
3301 size_t packet_len = kDefaultMaxPacketSize + 100;
3302 size_t second_write_len = packet_len + 1;
3303 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3304
3305 // First send half of the packet worth of data. We are in the batch mode, so
3306 // should not cause packet serialization.
3307 CreateData(first_write_len);
3308 QuicConsumedData consumed = creator_.ConsumeData(
3309 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3310 Perspective::IS_CLIENT),
3311 &iov_, 1u, iov_.iov_len,
3312 /*offset=*/0, NO_FIN);
3313 EXPECT_EQ(first_write_len, consumed.bytes_consumed);
3314 EXPECT_FALSE(consumed.fin_consumed);
3315 EXPECT_TRUE(creator_.HasPendingFrames());
3316 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3317
3318 // Make sure we have no packets so far.
3319 ASSERT_EQ(0u, packets_.size());
3320
3321 // Expect a packet to be flushed.
3322 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3323 .WillOnce(
3324 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3325
3326 // Increase packet size after flushing all frames.
3327 // Ensure it's immediately enacted.
3328 creator_.FlushCurrentPacket();
3329 creator_.SetMaxPacketLength(packet_len);
3330 EXPECT_EQ(packet_len, creator_.max_packet_length());
3331 EXPECT_FALSE(creator_.HasPendingFrames());
3332 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3333
3334 // We expect to see exactly one packet serialized after that, because we send
3335 // a value somewhat exceeding new max packet size, and the tail data does not
3336 // get serialized because we are still in the batch mode.
3337 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3338 .WillOnce(
3339 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3340
3341 // Send a more than a packet worth of data to the same stream. This should
3342 // trigger serialization of one packet, and queue another one.
3343 CreateData(second_write_len);
3344 consumed = creator_.ConsumeData(
3345 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3346 Perspective::IS_CLIENT),
3347 &iov_, 1u, iov_.iov_len,
3348 /*offset=*/first_write_len, FIN);
3349 EXPECT_EQ(second_write_len, consumed.bytes_consumed);
3350 EXPECT_TRUE(consumed.fin_consumed);
3351 EXPECT_TRUE(creator_.HasPendingFrames());
3352 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3353
3354 // We expect the first packet to be underfilled, and the second packet be up
3355 // to the new max packet size.
3356 ASSERT_EQ(2u, packets_.size());
3357 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3358 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3359
3360 CheckAllPacketsHaveSingleStreamFrame();
3361}
3362
3363// Test sending a connectivity probing packet.
3364TEST_F(QuicPacketCreatorMultiplePacketsTest,
3365 GenerateConnectivityProbingPacket) {
3366 delegate_.SetCanWriteAnything();
3367
3368 OwningSerializedPacketPointer probing_packet;
3369 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3370 QuicPathFrameBuffer payload = {
3371 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
3372 probing_packet =
3373 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
3374 } else {
3375 probing_packet = creator_.SerializeConnectivityProbingPacket();
3376 }
3377
3378 ASSERT_TRUE(simple_framer_.ProcessPacket(QuicEncryptedPacket(
3379 probing_packet->encrypted_buffer, probing_packet->encrypted_length)));
3380
3381 EXPECT_EQ(2u, simple_framer_.num_frames());
3382 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3383 EXPECT_EQ(1u, simple_framer_.path_challenge_frames().size());
3384 } else {
3385 EXPECT_EQ(1u, simple_framer_.ping_frames().size());
3386 }
3387 EXPECT_EQ(1u, simple_framer_.padding_frames().size());
3388}
3389
3390// Test sending an MTU probe, without any surrounding data.
3391TEST_F(QuicPacketCreatorMultiplePacketsTest,
3392 GenerateMtuDiscoveryPacket_Simple) {
3393 delegate_.SetCanWriteAnything();
3394
3395 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3396 static_assert(target_mtu < kMaxOutgoingPacketSize,
3397 "The MTU probe used by the test exceeds maximum packet size");
3398
3399 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3400 .WillOnce(
3401 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3402
3403 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3404
3405 EXPECT_FALSE(creator_.HasPendingFrames());
3406 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3407 ASSERT_EQ(1u, packets_.size());
3408 EXPECT_EQ(target_mtu, packets_[0].encrypted_length);
3409
3410 PacketContents contents;
3411 contents.num_mtu_discovery_frames = 1;
3412 contents.num_padding_frames = 1;
3413 CheckPacketContains(contents, 0);
3414}
3415
3416// Test sending an MTU probe. Surround it with data, to ensure that it resets
3417// the MTU to the value before the probe was sent.
3418TEST_F(QuicPacketCreatorMultiplePacketsTest,
3419 GenerateMtuDiscoveryPacket_SurroundedByData) {
3420 delegate_.SetCanWriteAnything();
3421
3422 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3423 static_assert(target_mtu < kMaxOutgoingPacketSize,
3424 "The MTU probe used by the test exceeds maximum packet size");
3425
3426 // Send enough data so it would always cause two packets to be sent.
3427 const size_t data_len = target_mtu + 1;
3428
3429 // Send a total of five packets: two packets before the probe, the probe
3430 // itself, and two packets after the probe.
3431 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3432 .Times(5)
3433 .WillRepeatedly(
3434 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3435
3436 // Send data before the MTU probe.
3437 CreateData(data_len);
3438 QuicConsumedData consumed = creator_.ConsumeData(
3439 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3440 Perspective::IS_CLIENT),
3441 &iov_, 1u, iov_.iov_len,
3442 /*offset=*/0, NO_FIN);
3443 creator_.Flush();
3444 EXPECT_EQ(data_len, consumed.bytes_consumed);
3445 EXPECT_FALSE(consumed.fin_consumed);
3446 EXPECT_FALSE(creator_.HasPendingFrames());
3447 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3448
3449 // Send the MTU probe.
3450 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3451 EXPECT_FALSE(creator_.HasPendingFrames());
3452 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3453
3454 // Send data after the MTU probe.
3455 CreateData(data_len);
3456 creator_.AttachPacketFlusher();
3457 consumed = creator_.ConsumeData(
3458 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3459 Perspective::IS_CLIENT),
3460 &iov_, 1u, iov_.iov_len,
3461 /*offset=*/data_len, FIN);
3462 creator_.Flush();
3463 EXPECT_EQ(data_len, consumed.bytes_consumed);
3464 EXPECT_TRUE(consumed.fin_consumed);
3465 EXPECT_FALSE(creator_.HasPendingFrames());
3466 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3467
3468 ASSERT_EQ(5u, packets_.size());
3469 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3470 EXPECT_EQ(target_mtu, packets_[2].encrypted_length);
3471 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length);
3472
3473 PacketContents probe_contents;
3474 probe_contents.num_mtu_discovery_frames = 1;
3475 probe_contents.num_padding_frames = 1;
3476
3477 CheckPacketHasSingleStreamFrame(0);
3478 CheckPacketHasSingleStreamFrame(1);
3479 CheckPacketContains(probe_contents, 2);
3480 CheckPacketHasSingleStreamFrame(3);
3481 CheckPacketHasSingleStreamFrame(4);
3482}
3483
3484TEST_F(QuicPacketCreatorMultiplePacketsTest, DontCrashOnInvalidStopWaiting) {
3485 if (VersionSupportsMessageFrames(framer_.transport_version())) {
3486 return;
3487 }
3488 // Test added to ensure the creator does not crash when an invalid frame is
3489 // added. Because this is an indication of internal programming errors,
3490 // DFATALs are expected.
3491 // A 1 byte packet number length can't encode a gap of 1000.
3492 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1000);
3493
3494 delegate_.SetCanNotWrite();
3495 delegate_.SetCanWriteAnything();
3496
3497 // This will not serialize any packets, because of the invalid frame.
3498 EXPECT_CALL(delegate_,
3499 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _));
3500 EXPECT_QUIC_BUG(creator_.Flush(),
3501 "packet_number_length 1 is too small "
3502 "for least_unacked_delta: 1001");
3503}
3504
3505// Regression test for b/31486443.
3506TEST_F(QuicPacketCreatorMultiplePacketsTest,
3507 ConnectionCloseFrameLargerThanPacketSize) {
3508 delegate_.SetCanWriteAnything();
3509 char buf[2000] = {};
3510 QuicStringPiece error_details(buf, 2000);
3511 const QuicErrorCode kQuicErrorCode = QUIC_PACKET_WRITE_ERROR;
3512
3513 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
3514 framer_.transport_version(), kQuicErrorCode, std::string(error_details),
3515 /*transport_close_frame_type=*/0);
3516 creator_.ConsumeRetransmittableControlFrame(QuicFrame(frame),
3517 /*bundle_ack=*/false);
3518 EXPECT_TRUE(creator_.HasPendingFrames());
3519 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3520}
3521
3522TEST_F(QuicPacketCreatorMultiplePacketsTest,
3523 RandomPaddingAfterFinSingleStreamSinglePacket) {
3524 const QuicByteCount kStreamFramePayloadSize = 100u;
3525 char buf[kStreamFramePayloadSize] = {};
3526 const QuicStreamId kDataStreamId = 5;
3527 // Set the packet size be enough for one stream frame with 0 stream offset and
3528 // max size of random padding.
3529 size_t length =
3530 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3531 GetPacketHeaderSize(
3532 framer_.transport_version(),
3533 creator_.GetDestinationConnectionIdLength(),
3534 creator_.GetSourceConnectionIdLength(),
3535 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3536 !kIncludeDiversificationNonce,
3537 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3538 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3539 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3540 QuicFramer::GetMinStreamFrameSize(
3541 framer_.transport_version(), kDataStreamId, 0,
3542 /*last_frame_in_packet=*/false,
3543 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes) +
3544 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes;
3545 creator_.SetMaxPacketLength(length);
3546 delegate_.SetCanWriteAnything();
3547 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3548 .WillOnce(
3549 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3550 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
3551 QuicConsumedData consumed = creator_.ConsumeData(
3552 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3553 creator_.Flush();
3554 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3555 EXPECT_FALSE(creator_.HasPendingFrames());
3556 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3557
3558 EXPECT_EQ(1u, packets_.size());
3559 PacketContents contents;
3560 // The packet has both stream and padding frames.
3561 contents.num_padding_frames = 1;
3562 contents.num_stream_frames = 1;
3563 CheckPacketContains(contents, 0);
3564}
3565
3566TEST_F(QuicPacketCreatorMultiplePacketsTest,
3567 RandomPaddingAfterFinSingleStreamMultiplePackets) {
3568 const QuicByteCount kStreamFramePayloadSize = 100u;
3569 char buf[kStreamFramePayloadSize] = {};
3570 const QuicStreamId kDataStreamId = 5;
3571 // Set the packet size be enough for one stream frame with 0 stream offset +
3572 // 1. One or more packets will accommodate.
3573 size_t length =
3574 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3575 GetPacketHeaderSize(
3576 framer_.transport_version(),
3577 creator_.GetDestinationConnectionIdLength(),
3578 creator_.GetSourceConnectionIdLength(),
3579 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3580 !kIncludeDiversificationNonce,
3581 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3582 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3583 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3584 QuicFramer::GetMinStreamFrameSize(
3585 framer_.transport_version(), kDataStreamId, 0,
3586 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
3587 kStreamFramePayloadSize + 1;
3588 creator_.SetMaxPacketLength(length);
3589 delegate_.SetCanWriteAnything();
3590 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3591 .WillRepeatedly(
3592 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3593 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
3594 QuicConsumedData consumed = creator_.ConsumeData(
3595 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3596 creator_.Flush();
3597 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3598 EXPECT_FALSE(creator_.HasPendingFrames());
3599 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3600
3601 EXPECT_LE(1u, packets_.size());
3602 PacketContents contents;
3603 // The first packet has both stream and padding frames.
3604 contents.num_stream_frames = 1;
3605 contents.num_padding_frames = 1;
3606 CheckPacketContains(contents, 0);
3607
3608 for (size_t i = 1; i < packets_.size(); ++i) {
3609 // Following packets only have paddings.
3610 contents.num_stream_frames = 0;
3611 contents.num_padding_frames = 1;
3612 CheckPacketContains(contents, i);
3613 }
3614}
3615
3616TEST_F(QuicPacketCreatorMultiplePacketsTest,
3617 RandomPaddingAfterFinMultipleStreamsMultiplePackets) {
3618 const QuicByteCount kStreamFramePayloadSize = 100u;
3619 char buf[kStreamFramePayloadSize] = {};
3620 const QuicStreamId kDataStreamId1 = 5;
3621 const QuicStreamId kDataStreamId2 = 6;
3622 // Set the packet size be enough for first frame with 0 stream offset + second
3623 // frame + 1 byte payload. two or more packets will accommodate.
3624 size_t length =
3625 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3626 GetPacketHeaderSize(
3627 framer_.transport_version(),
3628 creator_.GetDestinationConnectionIdLength(),
3629 creator_.GetSourceConnectionIdLength(),
3630 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3631 !kIncludeDiversificationNonce,
3632 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3633 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3634 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3635 QuicFramer::GetMinStreamFrameSize(
3636 framer_.transport_version(), kDataStreamId1, 0,
3637 /*last_frame_in_packet=*/false, kStreamFramePayloadSize) +
3638 kStreamFramePayloadSize +
3639 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(),
3640 kDataStreamId1, 0,
3641 /*last_frame_in_packet=*/false, 1) +
3642 1;
3643 creator_.SetMaxPacketLength(length);
3644 delegate_.SetCanWriteAnything();
3645 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3646 .WillRepeatedly(
3647 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3648 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
3649 QuicConsumedData consumed = creator_.ConsumeData(
3650 kDataStreamId1, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3651 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3652 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
3653 consumed = creator_.ConsumeData(kDataStreamId2, &iov_, 1u, iov_.iov_len, 0,
3654 FIN_AND_PADDING);
3655 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3656 creator_.Flush();
3657 EXPECT_FALSE(creator_.HasPendingFrames());
3658 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3659
3660 EXPECT_LE(2u, packets_.size());
3661 PacketContents contents;
3662 // The first packet has two stream frames.
3663 contents.num_stream_frames = 2;
3664 CheckPacketContains(contents, 0);
3665
3666 // The second packet has one stream frame and padding frames.
3667 contents.num_stream_frames = 1;
3668 contents.num_padding_frames = 1;
3669 CheckPacketContains(contents, 1);
3670
3671 for (size_t i = 2; i < packets_.size(); ++i) {
3672 // Following packets only have paddings.
3673 contents.num_stream_frames = 0;
3674 contents.num_padding_frames = 1;
3675 CheckPacketContains(contents, i);
3676 }
3677}
3678
3679TEST_F(QuicPacketCreatorMultiplePacketsTest, AddMessageFrame) {
3680 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
3681 return;
3682 }
3683 quic::QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
3684 delegate_.SetCanWriteAnything();
3685 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3686 .WillOnce(
3687 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3688
3689 MakeIOVector("foo", &iov_);
3690 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3691 framer_.transport_version(), Perspective::IS_CLIENT),
3692 &iov_, 1u, iov_.iov_len, 0, FIN);
3693 EXPECT_EQ(
3694 MESSAGE_STATUS_SUCCESS,
3695 creator_.AddMessageFrame(1, MakeSpan(&allocator_, "message", &storage)));
3696 EXPECT_TRUE(creator_.HasPendingFrames());
3697 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3698
3699 // Add a message which causes the flush of current packet.
3700 EXPECT_EQ(
3701 MESSAGE_STATUS_SUCCESS,
3702 creator_.AddMessageFrame(
3703 2,
3704 MakeSpan(&allocator_,
3705 std::string(creator_.GetCurrentLargestMessagePayload(), 'a'),
3706 &storage)));
3707 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3708
3709 // Failed to send messages which cannot fit into one packet.
3710 EXPECT_EQ(
3711 MESSAGE_STATUS_TOO_LARGE,
3712 creator_.AddMessageFrame(
3713 3, MakeSpan(&allocator_,
3714 std::string(
3715 creator_.GetCurrentLargestMessagePayload() + 10, 'a'),
3716 &storage)));
3717}
3718
3719TEST_F(QuicPacketCreatorMultiplePacketsTest, ConnectionId) {
3720 creator_.SetServerConnectionId(TestConnectionId(0x1337));
3721 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3722 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
3723 if (!framer_.version().SupportsClientConnectionIds()) {
3724 return;
3725 }
3726 creator_.SetClientConnectionId(TestConnectionId(0x33));
3727 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3728 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
3729}
3730
QUICHE teama6ef0a62019-03-07 20:34:33 -05003731} // namespace
3732} // namespace test
3733} // namespace quic