blob: 6ca369cd5ecba1a81498d3d8f5bbd760fe74239b [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];
QUICHE team173c48f2019-11-19 16:34:44 -0800232 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, quiche::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())));
renjietang6beb5112019-11-11 14:43:19 -0800316 if (!GetQuicRestartFlag(quic_coalesce_stream_frames_2)) {
renjietangdbe98342019-10-18 11:00:57 -0700317 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(_));
renjietang6beb5112019-11-11 14:43:19 -0800342 if (!GetQuicRestartFlag(quic_coalesce_stream_frames_2)) {
renjietangdbe98342019-10-18 11:00:57 -0700343 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(_));
renjietangb63005e2019-11-19 23:08:53 -08001467 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001468 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001469 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001470
1471 QuicFrame frame;
1472 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001473 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
fayang62b637b2019-09-16 08:40:49 -07001474 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1475 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1476 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001477 size_t consumed = frame.stream_frame.data_length;
1478 EXPECT_EQ(4u, consumed);
1479 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001480 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001481
1482 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001483 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
renjietangb63005e2019-11-19 23:08:53 -08001484 EXPECT_TRUE(creator_.AddFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001485 EXPECT_TRUE(creator_.HasPendingFrames());
1486 EXPECT_EQ(0u, creator_.BytesFree());
1487
1488 // Packet is full. Creator will flush.
1489 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1490 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
renjietangb63005e2019-11-19 23:08:53 -08001491 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001492
1493 // Ensure the packet is successfully created.
1494 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1495 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1496 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1497 ASSERT_EQ(1u, retransmittable.size());
1498 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1499 EXPECT_TRUE(serialized_packet_.has_ack);
1500 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_.largest_acked);
1501 DeleteSerializedPacket();
1502
1503 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001504 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001505 EXPECT_EQ(max_plaintext_size -
1506 GetPacketHeaderSize(
1507 client_framer_.transport_version(),
1508 creator_.GetDestinationConnectionIdLength(),
1509 creator_.GetSourceConnectionIdLength(),
1510 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1511 !kIncludeDiversificationNonce,
1512 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1513 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1514 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1515 creator_.BytesFree());
1516}
1517
1518TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
1519 if (!GetParam().version_serialization) {
1520 creator_.StopSendingVersion();
1521 }
1522 EXPECT_FALSE(creator_.HasPendingFrames());
1523
1524 MakeIOVector("test", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001525 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1526 iov_.iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001527 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1528 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1529 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001530 StrictMock<MockDebugDelegate> debug;
1531 creator_.set_debug_delegate(&debug);
1532 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001533 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001534 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1535 NOT_RETRANSMISSION, &num_bytes_consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001536 EXPECT_EQ(4u, num_bytes_consumed);
1537
1538 // Ensure the packet is successfully created.
1539 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1540 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1541 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames;
1542 ASSERT_EQ(1u, retransmittable.size());
1543 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1544 DeleteSerializedPacket();
1545
1546 EXPECT_FALSE(creator_.HasPendingFrames());
1547}
1548
nharperebabffd2019-06-03 17:34:45 -07001549TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1550 // Regression test to check that CreateAndSerializeStreamFrame uses a
1551 // correctly formatted stream frame header when appending padding.
1552
1553 if (!GetParam().version_serialization) {
1554 creator_.StopSendingVersion();
1555 }
1556 EXPECT_FALSE(creator_.HasPendingFrames());
1557
1558 // Send one byte of stream data.
1559 MakeIOVector("a", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001560 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1561 iov_.iov_len);
nharperebabffd2019-06-03 17:34:45 -07001562 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1563 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1564 size_t num_bytes_consumed;
1565 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001566 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1567 NOT_RETRANSMISSION, &num_bytes_consumed);
nharperebabffd2019-06-03 17:34:45 -07001568 EXPECT_EQ(1u, num_bytes_consumed);
1569
1570 // Check that a packet is created.
1571 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1572 ASSERT_FALSE(serialized_packet_.retransmittable_frames.empty());
1573 {
1574 InSequence s;
1575 EXPECT_CALL(framer_visitor_, OnPacket());
1576 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1577 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1578 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1579 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1580 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1581 if (client_framer_.version().HasHeaderProtection()) {
1582 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1583 }
1584 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1585 }
1586 ProcessPacket(serialized_packet_);
1587}
1588
QUICHE teama6ef0a62019-03-07 20:34:33 -05001589TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1590 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1591 if (!IsDefaultTestConfiguration()) {
1592 return;
1593 }
1594
QUICHE team6987b4a2019-03-15 16:23:04 -07001595 creator_.set_encryption_level(ENCRYPTION_INITIAL);
fkastenholz85f18902019-05-28 12:47:00 -07001596 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001597 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1598 /*fin=*/false, 0u, QuicStringPiece());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001599 EXPECT_QUIC_BUG(
renjietangb63005e2019-11-19 23:08:53 -08001600 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001601 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1602}
1603
1604TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1605 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1606 if (!IsDefaultTestConfiguration()) {
1607 return;
1608 }
1609
1610 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
fkastenholz85f18902019-05-28 12:47:00 -07001611 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001612 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
1613 /*fin=*/false, 0u, QuicStringPiece());
fayang49523232019-05-03 06:28:22 -07001614 EXPECT_QUIC_BUG(
renjietangb63005e2019-11-19 23:08:53 -08001615 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001616 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001617}
1618
1619TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1620 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1621 if (!IsDefaultTestConfiguration()) {
1622 return;
1623 }
1624
QUICHE teamdc41bf12019-03-20 12:58:42 -07001625 // This test only matters when the crypto handshake is sent in stream frames.
1626 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1627 // frames.
1628 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1629 return;
1630 }
1631
QUICHE teama6ef0a62019-03-07 20:34:33 -05001632 CryptoHandshakeMessage message;
1633 message.set_tag(kCHLO);
dschinazi66dea072019-04-09 11:41:06 -07001634 message.set_minimum_size(kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001635 CryptoFramer framer;
1636 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001637 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001638
1639 struct iovec iov;
1640 MakeIOVector(QuicStringPiece(message_data->data(), message_data->length()),
1641 &iov);
1642 QuicFrame frame;
fkastenholz85f18902019-05-28 12:47:00 -07001643 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
fayang62b637b2019-09-16 08:40:49 -07001644 EXPECT_QUIC_BUG(
1645 creator_.ConsumeDataToFillCurrentPacket(
1646 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1647 &iov, 1u, iov.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION,
1648 &frame),
1649 "Client hello won't fit in a single packet.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001650}
1651
1652TEST_P(QuicPacketCreatorTest, PendingPadding) {
1653 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1654 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1655 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1656
1657 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1658 .WillRepeatedly(
1659 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1660 // Flush all paddings.
1661 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001662 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001663 {
1664 InSequence s;
1665 EXPECT_CALL(framer_visitor_, OnPacket());
1666 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1667 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1668 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1669 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1670 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1671 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1672 }
1673 // Packet only contains padding.
1674 ProcessPacket(serialized_packet_);
1675 }
1676 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1677}
1678
1679TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001680 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001681 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1682 QuicFrame frame;
1683 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001684 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1685 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001686 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001687 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001688 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1689 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1690 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001691 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001692 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1693}
1694
QUICHE teama6ef0a62019-03-07 20:34:33 -05001695TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001696 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001697 const QuicByteCount kStreamFramePayloadSize = 100u;
1698 // Set the packet size be enough for one stream frame with 0 stream offset +
1699 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001700 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1701 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001702 size_t length =
1703 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1704 GetEncryptionOverhead() +
1705 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001706 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001707 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1708 kStreamFramePayloadSize + 1;
1709 creator_.SetMaxPacketLength(length);
1710 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1711 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1712 QuicFrame frame;
1713 char buf[kStreamFramePayloadSize + 1] = {};
1714 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1715 .WillRepeatedly(
1716 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1717 // Send stream frame of size kStreamFramePayloadSize.
1718 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001719 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1720 0u, 0u, false, false,
1721 NOT_RETRANSMISSION, &frame);
1722 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001723 // 1 byte padding is sent.
1724 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1725 // Send stream frame of size kStreamFramePayloadSize + 1.
1726 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize + 1), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001727 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1728 0u, kStreamFramePayloadSize, false,
1729 false, NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001730 // No padding is sent.
fayang62b637b2019-09-16 08:40:49 -07001731 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001732 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1733 // Flush all paddings.
1734 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001735 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001736 }
1737 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1738}
1739
1740TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001741 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
dschinazi66dea072019-04-09 11:41:06 -07001742 char external_buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001743 char* expected_buffer = external_buffer;
1744 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(expected_buffer));
1745
1746 QuicFrame frame;
1747 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001748 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1749 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001750 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001751 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001752 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1753
1754 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1755 .WillOnce(Invoke([expected_buffer](SerializedPacket* serialized_packet) {
1756 EXPECT_EQ(expected_buffer, serialized_packet->encrypted_buffer);
1757 ClearSerializedPacket(serialized_packet);
1758 }));
fayang62b637b2019-09-16 08:40:49 -07001759 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001760}
1761
1762// Test for error found in
1763// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1764// length that crosses an IETF VarInt length boundary would cause a
1765// failure. While this test is not applicable to versions other than version 99,
1766// it should still work. Hence, it is not made version-specific.
1767TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1768 QuicAckFrame ack_frame =
1769 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1770 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1771 frames_.push_back(QuicFrame(&ack_frame));
1772 SerializeAllFrames(frames_);
1773}
1774
1775TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
fayangd4291e42019-05-30 10:31:21 -07001776 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001777 return;
1778 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001779 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001780 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1781 .Times(3)
1782 .WillRepeatedly(
1783 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1784 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1785 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001786 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1787 creator_.GetCurrentLargestMessagePayload()));
1788 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001789 QuicMessageFrame* message_frame =
1790 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
renjietangb63005e2019-11-19 23:08:53 -08001791 EXPECT_TRUE(creator_.AddFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001792 EXPECT_TRUE(creator_.HasPendingFrames());
fayang62b637b2019-09-16 08:40:49 -07001793 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001794
wub553a9662019-03-28 20:13:23 -07001795 QuicMessageFrame* frame2 =
1796 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001797 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001798 EXPECT_TRUE(creator_.HasPendingFrames());
1799 // Verify if a new frame is added, 1 byte message length will be added.
1800 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001801 QuicMessageFrame* frame3 =
1802 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001803 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001804 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
fayang62b637b2019-09-16 08:40:49 -07001805 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001806
1807 QuicFrame frame;
1808 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001809 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1810 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001811 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1812 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1813 NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001814 QuicMessageFrame* frame4 =
1815 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001816 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001817 EXPECT_TRUE(creator_.HasPendingFrames());
1818 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001819 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1820 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001821 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001822 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
renjietangb63005e2019-11-19 23:08:53 -08001823 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001824 EXPECT_FALSE(creator_.HasPendingFrames());
1825}
1826
1827TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
fayangd4291e42019-05-30 10:31:21 -07001828 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001829 return;
1830 }
vasilvvc48c8712019-03-11 13:38:16 -07001831 std::string message_data(kDefaultMaxPacketSize, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001832 QuicStringPiece message_buffer(message_data);
1833 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001834 // Test all possible encryption levels of message frames.
1835 for (EncryptionLevel level :
1836 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1837 creator_.set_encryption_level(level);
1838 // Test all possible sizes of message frames.
1839 for (size_t message_size = 0;
1840 message_size <= creator_.GetCurrentLargestMessagePayload();
1841 ++message_size) {
1842 QuicMessageFrame* frame = new QuicMessageFrame(
1843 0, MakeSpan(&allocator_,
1844 QuicStringPiece(message_buffer.data(), message_size),
1845 &storage));
renjietangb63005e2019-11-19 23:08:53 -08001846 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame), NOT_RETRANSMISSION));
ianswettb239f862019-04-05 09:15:06 -07001847 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001848
ianswettb239f862019-04-05 09:15:06 -07001849 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1850 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1851 // Verify BytesFree returns bytes available for the next frame, which
1852 // should subtract the message length.
1853 size_t expected_bytes_free =
1854 creator_.GetCurrentLargestMessagePayload() - message_size <
1855 expansion_bytes
1856 ? 0
1857 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1858 message_size;
1859 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1860 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1861 creator_.GetCurrentLargestMessagePayload());
1862 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1863 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001864 creator_.FlushCurrentPacket();
ianswettb239f862019-04-05 09:15:06 -07001865 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1866 DeleteSerializedPacket();
1867 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001868 }
1869}
1870
nharperd43f1d62019-07-01 15:18:20 -07001871// Regression test for bugfix of GetPacketHeaderSize.
1872TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
renjietang4c704c82019-10-07 16:39:11 -07001873 QuicTransportVersion version = creator_.transport_version();
nharperd43f1d62019-07-01 15:18:20 -07001874 if (!VersionSupportsMessageFrames(version)) {
1875 return;
1876 }
1877 QuicPacketLength expected_largest_payload = 1319;
1878 if (QuicVersionHasLongHeaderLengths(version)) {
1879 expected_largest_payload -= 2;
1880 }
dschinazi48ac9192019-07-31 00:07:26 -07001881 if (GetParam().version.HasLengthPrefixedConnectionIds()) {
1882 expected_largest_payload -= 1;
1883 }
nharperd43f1d62019-07-01 15:18:20 -07001884 EXPECT_EQ(expected_largest_payload,
1885 creator_.GetGuaranteedLargestMessagePayload());
1886}
1887
QUICHE teama6ef0a62019-03-07 20:34:33 -05001888TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001889 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001890
1891 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1892 QuicFrame ack_frame(&temp_ack_frame);
1893 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1894
QUICHE teamdc41bf12019-03-20 12:58:42 -07001895 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1896 client_framer_.transport_version(), Perspective::IS_CLIENT);
1897 QuicFrame stream_frame(QuicStreamFrame(stream_id,
1898 /*fin=*/false, 0u, QuicStringPiece()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001899 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1900
1901 QuicFrame padding_frame{QuicPaddingFrame()};
1902 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1903
1904 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1905 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1906
renjietangb63005e2019-11-19 23:08:53 -08001907 EXPECT_TRUE(creator_.AddFrame(ack_frame, LOSS_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001908 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1909
renjietangb63005e2019-11-19 23:08:53 -08001910 EXPECT_TRUE(creator_.AddFrame(stream_frame, RTO_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001911 ASSERT_FALSE(serialized_packet_.encrypted_buffer);
1912
renjietangb63005e2019-11-19 23:08:53 -08001913 EXPECT_TRUE(creator_.AddFrame(padding_frame, TLP_RETRANSMISSION));
fayang62b637b2019-09-16 08:40:49 -07001914 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001915 ASSERT_TRUE(serialized_packet_.encrypted_buffer);
1916
fayangcff885a2019-10-22 07:39:04 -07001917 // The last retransmittable frame on packet is a stream frame, the packet's
1918 // transmission type should be the same as the stream frame's.
1919 EXPECT_EQ(serialized_packet_.transmission_type, RTO_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001920 DeleteSerializedPacket();
1921}
1922
1923TEST_P(QuicPacketCreatorTest, RetryToken) {
1924 if (!GetParam().version_serialization ||
1925 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1926 return;
1927 }
1928
1929 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1930 9, 10, 11, 12, 13, 14, 15, 16};
1931
1932 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001933 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001934
QUICHE teamdc41bf12019-03-20 12:58:42 -07001935 std::string data("a");
1936 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1937 QuicStreamFrame stream_frame(
1938 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1939 /*fin=*/false, 0u, QuicStringPiece());
1940 frames_.push_back(QuicFrame(stream_frame));
1941 } else {
1942 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1943 frames_.push_back(
1944 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1945 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001946 SerializedPacket serialized = SerializeAllFrames(frames_);
1947
1948 QuicPacketHeader header;
1949 {
1950 InSequence s;
1951 EXPECT_CALL(framer_visitor_, OnPacket());
1952 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1953 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
1954 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
1955 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1956 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001957 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1958 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1959 } else {
1960 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1961 }
nharper55fa6132019-05-07 19:37:21 -07001962 if (client_framer_.version().HasHeaderProtection()) {
1963 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1964 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001965 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1966 }
1967 ProcessPacket(serialized);
1968 ASSERT_TRUE(header.version_flag);
1969 ASSERT_EQ(header.long_packet_type, INITIAL);
1970 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
1971 test::CompareCharArraysWithHexError(
1972 "retry token", header.retry_token.data(), header.retry_token.length(),
1973 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001974 DeleteFrames(&frames_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001975}
1976
QUICHE team2252b702019-05-14 23:55:14 -04001977TEST_P(QuicPacketCreatorTest, GetConnectionId) {
QUICHE team2252b702019-05-14 23:55:14 -04001978 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1979 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1980}
1981
dschinazi346b7ce2019-06-05 01:38:18 -07001982TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
dschinazi346b7ce2019-06-05 01:38:18 -07001983 if (!client_framer_.version().SupportsClientConnectionIds()) {
1984 return;
1985 }
1986 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1987 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1988 creator_.SetClientConnectionId(TestConnectionId(0x33));
1989 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1990 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
1991}
1992
renjietangdbe98342019-10-18 11:00:57 -07001993TEST_P(QuicPacketCreatorTest, CoalesceStreamFrames) {
1994 InSequence s;
1995 if (!GetParam().version_serialization) {
1996 creator_.StopSendingVersion();
1997 }
renjietanga66e4152019-11-11 13:23:33 -08001998 SetQuicRestartFlag(quic_coalesce_stream_frames_2, true);
renjietangdbe98342019-10-18 11:00:57 -07001999 const size_t max_plaintext_size =
2000 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
2001 EXPECT_FALSE(creator_.HasPendingFrames());
2002 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2003 QuicStreamId stream_id1 = QuicUtils::GetFirstBidirectionalStreamId(
2004 client_framer_.transport_version(), Perspective::IS_CLIENT);
2005 QuicStreamId stream_id2 = GetNthClientInitiatedStreamId(1);
2006 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2007 EXPECT_EQ(max_plaintext_size -
2008 GetPacketHeaderSize(
2009 client_framer_.transport_version(),
2010 creator_.GetDestinationConnectionIdLength(),
2011 creator_.GetSourceConnectionIdLength(),
2012 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2013 !kIncludeDiversificationNonce,
2014 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2015 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
2016 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
2017 creator_.BytesFree());
2018 StrictMock<MockDebugDelegate> debug;
2019 creator_.set_debug_delegate(&debug);
2020
2021 MakeIOVector("test", &iov_);
2022 QuicFrame frame;
2023 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2024 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2025 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2026 NOT_RETRANSMISSION, &frame));
2027 EXPECT_TRUE(creator_.HasPendingFrames());
2028 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2029
2030 MakeIOVector("coalesce", &iov_);
2031 // frame will be coalesced with the first frame.
2032 const auto previous_size = creator_.PacketSize();
renjietang2a6ba792019-10-22 10:44:58 -07002033 QuicStreamFrame target(stream_id1, true, 0, 12);
2034 EXPECT_CALL(debug, OnStreamFrameCoalesced(target));
renjietangdbe98342019-10-18 11:00:57 -07002035 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2036 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 4u, true, false,
2037 NOT_RETRANSMISSION, &frame));
2038 EXPECT_EQ(frame.stream_frame.data_length,
2039 creator_.PacketSize() - previous_size);
renjietangdbe98342019-10-18 11:00:57 -07002040
2041 // frame is for another stream, so it won't be coalesced.
2042 const auto length = creator_.BytesFree() - 10u;
renjietang7f46be32019-10-21 16:55:17 -07002043 std::string large_data(length, 'x');
renjietangdbe98342019-10-18 11:00:57 -07002044 MakeIOVector(large_data, &iov_);
2045 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2046 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2047 stream_id2, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2048 NOT_RETRANSMISSION, &frame));
2049 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id2));
2050
2051 // The packet doesn't have enough free bytes for all data, but will still be
2052 // able to consume and coalesce part of them.
2053 EXPECT_CALL(debug, OnStreamFrameCoalesced(_));
2054 MakeIOVector("somerandomdata", &iov_);
2055 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2056 stream_id2, &iov_, 1u, iov_.iov_len, 0u, length, false, false,
2057 NOT_RETRANSMISSION, &frame));
2058
2059 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2060 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2061 creator_.FlushCurrentPacket();
2062 EXPECT_CALL(framer_visitor_, OnPacket());
2063 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2064 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2065 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2066 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2067 // The packet should only have 2 stream frames.
2068 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2069 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2070 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2071 ProcessPacket(serialized_packet_);
2072}
2073
fayang51152fd2019-10-21 06:48:09 -07002074TEST_P(QuicPacketCreatorTest, SaveNonRetransmittableFrames) {
fayang51152fd2019-10-21 06:48:09 -07002075 QuicAckFrame ack_frame(InitAckFrame(1));
2076 frames_.push_back(QuicFrame(&ack_frame));
2077 frames_.push_back(QuicFrame(QuicPaddingFrame(-1)));
2078 SerializedPacket serialized = SerializeAllFrames(frames_);
2079 ASSERT_EQ(2u, serialized.nonretransmittable_frames.size());
2080 EXPECT_EQ(ACK_FRAME, serialized.nonretransmittable_frames[0].type);
2081 EXPECT_EQ(PADDING_FRAME, serialized.nonretransmittable_frames[1].type);
fayangeb268412019-10-21 14:05:38 -07002082 // Verify full padding frame is translated to a padding frame with actual
2083 // bytes of padding.
2084 EXPECT_LT(
2085 0,
2086 serialized.nonretransmittable_frames[1].padding_frame.num_padding_bytes);
fayang51152fd2019-10-21 06:48:09 -07002087 frames_.clear();
2088
2089 // Serialize another packet with the same frames.
2090 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
2091 &creator_, serialized.nonretransmittable_frames, buffer_,
2092 kMaxOutgoingPacketSize);
2093 // Verify the packet length of both packets are equal.
2094 EXPECT_EQ(serialized.encrypted_length, packet.encrypted_length);
2095}
2096
fayang08750832019-10-24 11:25:34 -07002097TEST_P(QuicPacketCreatorTest, SerializeCoalescedPacket) {
fayang08750832019-10-24 11:25:34 -07002098 QuicCoalescedPacket coalesced;
2099 SimpleBufferAllocator allocator;
2100 QuicSocketAddress self_address(QuicIpAddress::Loopback4(), 1);
2101 QuicSocketAddress peer_address(QuicIpAddress::Loopback4(), 2);
2102 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2103 EncryptionLevel level = static_cast<EncryptionLevel>(i);
2104 creator_.set_encryption_level(level);
2105 QuicAckFrame ack_frame(InitAckFrame(1));
2106 frames_.push_back(QuicFrame(&ack_frame));
2107 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
2108 frames_.push_back(
2109 QuicFrame(QuicStreamFrame(1, false, 0u, QuicStringPiece())));
2110 }
2111 SerializedPacket serialized = SerializeAllFrames(frames_);
2112 EXPECT_EQ(level, serialized.encryption_level);
2113 frames_.clear();
2114 ASSERT_TRUE(coalesced.MaybeCoalescePacket(serialized, self_address,
2115 peer_address, &allocator,
2116 creator_.max_packet_length()));
2117 }
2118 char buffer[kMaxOutgoingPacketSize];
2119 size_t coalesced_length = creator_.SerializeCoalescedPacket(
2120 coalesced, buffer, kMaxOutgoingPacketSize);
2121 // Verify packet is padded to full.
2122 ASSERT_EQ(coalesced.max_packet_length(), coalesced_length);
2123 if (!QuicVersionHasLongHeaderLengths(server_framer_.transport_version())) {
2124 return;
2125 }
2126 // Verify packet process.
2127 std::unique_ptr<QuicEncryptedPacket> packets[NUM_ENCRYPTION_LEVELS];
2128 packets[ENCRYPTION_INITIAL] =
bnc40d0fa52019-10-29 11:40:48 -07002129 std::make_unique<QuicEncryptedPacket>(buffer, coalesced_length);
fayang08750832019-10-24 11:25:34 -07002130 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2131 InSequence s;
2132 EXPECT_CALL(framer_visitor_, OnPacket());
2133 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2134 if (i < ENCRYPTION_FORWARD_SECURE) {
2135 // Save coalesced packet.
2136 EXPECT_CALL(framer_visitor_, OnCoalescedPacket(_))
2137 .WillOnce(Invoke([i, &packets](const QuicEncryptedPacket& packet) {
2138 packets[i + 1] = packet.Clone();
2139 }));
2140 }
2141 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
2142 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
2143 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2144 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _)).WillOnce(Return(true));
2145 EXPECT_CALL(framer_visitor_,
2146 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
2147 .WillOnce(Return(true));
2148 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(_)).WillOnce(Return(true));
2149 if (i == ENCRYPTION_INITIAL) {
2150 // Verify padding is added.
2151 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2152 } else {
2153 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(testing::AtMost(1));
2154 }
2155 if (i != ENCRYPTION_INITIAL && i != ENCRYPTION_HANDSHAKE) {
2156 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2157 }
2158 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2159
2160 server_framer_.ProcessPacket(*packets[i]);
2161 }
2162}
2163
fayang2ab1e852019-11-04 11:24:36 -08002164TEST_P(QuicPacketCreatorTest, SoftMaxPacketLength) {
2165 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2166 QuicByteCount previous_max_packet_length = creator_.max_packet_length();
2167 const size_t overhead =
2168 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2169 QuicPacketCreator::MinPlaintextPacketSize(client_framer_.version()) +
2170 GetEncryptionOverhead();
2171 // Make sure a length which cannot accommodate header (includes header
2172 // protection minimal length) gets rejected.
2173 creator_.SetSoftMaxPacketLength(overhead - 1);
2174 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2175
2176 creator_.SetSoftMaxPacketLength(overhead);
2177 EXPECT_EQ(overhead, creator_.max_packet_length());
2178
2179 // Verify creator has room for stream frame because max_packet_length_ gets
2180 // restored.
vasilvva57bbb32019-11-06 06:19:27 -08002181 ASSERT_TRUE(creator_.HasRoomForStreamFrame(
2182 GetNthClientInitiatedStreamId(1), kMaxIetfVarInt,
2183 std::numeric_limits<uint32_t>::max()));
fayang2ab1e852019-11-04 11:24:36 -08002184 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2185
2186 // Same for message frame.
2187 if (VersionSupportsMessageFrames(client_framer_.transport_version())) {
2188 creator_.SetSoftMaxPacketLength(overhead);
2189 // Verify GetCurrentLargestMessagePayload is based on the actual
2190 // max_packet_length.
2191 EXPECT_LT(1u, creator_.GetCurrentLargestMessagePayload());
2192 EXPECT_EQ(overhead, creator_.max_packet_length());
2193 ASSERT_TRUE(creator_.HasRoomForMessageFrame(
2194 creator_.GetCurrentLargestMessagePayload()));
2195 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2196 }
2197
2198 // Verify creator can consume crypto data because max_packet_length_ gets
2199 // restored.
2200 creator_.SetSoftMaxPacketLength(overhead);
2201 EXPECT_EQ(overhead, creator_.max_packet_length());
2202 std::string data = "crypto data";
2203 MakeIOVector(data, &iov_);
2204 QuicFrame frame;
2205 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
2206 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2207 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
2208 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
2209 &frame));
2210 size_t bytes_consumed = frame.stream_frame.data_length;
2211 EXPECT_LT(0u, bytes_consumed);
2212 } else {
2213 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
2214 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
2215 ENCRYPTION_INITIAL, data.length(), kOffset,
2216 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
2217 size_t bytes_consumed = frame.crypto_frame->data_length;
2218 EXPECT_LT(0u, bytes_consumed);
2219 }
2220 EXPECT_TRUE(creator_.HasPendingFrames());
2221 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2222 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2223 creator_.FlushCurrentPacket();
2224
2225 // Verify ACK frame can be consumed.
2226 creator_.SetSoftMaxPacketLength(overhead);
2227 EXPECT_EQ(overhead, creator_.max_packet_length());
2228 QuicAckFrame ack_frame(InitAckFrame(10u));
renjietangb63005e2019-11-19 23:08:53 -08002229 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
fayang2ab1e852019-11-04 11:24:36 -08002230 EXPECT_TRUE(creator_.HasPendingFrames());
2231}
2232
fayang4245c212019-11-05 13:33:46 -08002233class MockDelegate : public QuicPacketCreator::DelegateInterface {
2234 public:
2235 MockDelegate() {}
2236 MockDelegate(const MockDelegate&) = delete;
2237 MockDelegate& operator=(const MockDelegate&) = delete;
2238 ~MockDelegate() override {}
2239
2240 MOCK_METHOD2(ShouldGeneratePacket,
2241 bool(HasRetransmittableData retransmittable,
2242 IsHandshake handshake));
2243 MOCK_METHOD0(MaybeBundleAckOpportunistically, const QuicFrames());
2244 MOCK_METHOD0(GetPacketBuffer, char*());
2245 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
2246 MOCK_METHOD2(OnUnrecoverableError, void(QuicErrorCode, const std::string&));
2247
2248 void SetCanWriteAnything() {
2249 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
2250 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2251 .WillRepeatedly(Return(true));
2252 }
2253
2254 void SetCanNotWrite() {
2255 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2256 .WillRepeatedly(Return(false));
2257 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2258 .WillRepeatedly(Return(false));
2259 }
2260
2261 // Use this when only ack frames should be allowed to be written.
2262 void SetCanWriteOnlyNonRetransmittable() {
2263 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2264 .WillRepeatedly(Return(false));
2265 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2266 .WillRepeatedly(Return(true));
2267 }
2268};
2269
2270// Simple struct for describing the contents of a packet.
2271// Useful in conjunction with a SimpleQuicFrame for validating that a packet
2272// contains the expected frames.
2273struct PacketContents {
2274 PacketContents()
2275 : num_ack_frames(0),
2276 num_connection_close_frames(0),
2277 num_goaway_frames(0),
2278 num_rst_stream_frames(0),
2279 num_stop_waiting_frames(0),
2280 num_stream_frames(0),
2281 num_crypto_frames(0),
2282 num_ping_frames(0),
2283 num_mtu_discovery_frames(0),
2284 num_padding_frames(0) {}
2285
2286 size_t num_ack_frames;
2287 size_t num_connection_close_frames;
2288 size_t num_goaway_frames;
2289 size_t num_rst_stream_frames;
2290 size_t num_stop_waiting_frames;
2291 size_t num_stream_frames;
2292 size_t num_crypto_frames;
2293 size_t num_ping_frames;
2294 size_t num_mtu_discovery_frames;
2295 size_t num_padding_frames;
2296};
2297
2298class MultiplePacketsTestPacketCreator : public QuicPacketCreator {
2299 public:
2300 MultiplePacketsTestPacketCreator(
2301 QuicConnectionId connection_id,
2302 QuicFramer* framer,
2303 QuicRandom* random_generator,
2304 QuicPacketCreator::DelegateInterface* delegate,
2305 SimpleDataProducer* producer)
2306 : QuicPacketCreator(connection_id, framer, random_generator, delegate),
2307 ack_frame_(InitAckFrame(1)),
2308 delegate_(static_cast<MockDelegate*>(delegate)),
2309 producer_(producer) {}
2310
2311 bool ConsumeRetransmittableControlFrame(const QuicFrame& frame,
2312 bool bundle_ack) {
2313 if (!has_ack()) {
2314 QuicFrames frames;
2315 if (bundle_ack) {
2316 frames.push_back(QuicFrame(&ack_frame_));
2317 }
2318 if (delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2319 NOT_HANDSHAKE)) {
2320 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically())
2321 .WillOnce(Return(frames));
2322 }
2323 }
2324 return QuicPacketCreator::ConsumeRetransmittableControlFrame(frame);
2325 }
2326
2327 QuicConsumedData ConsumeDataFastPath(QuicStreamId id,
2328 const struct iovec* iov,
2329 int iov_count,
2330 size_t total_length,
2331 QuicStreamOffset offset,
2332 bool fin) {
2333 // Save data before data is consumed.
2334 if (total_length > 0) {
2335 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2336 }
2337 return QuicPacketCreator::ConsumeDataFastPath(id, total_length, offset, fin,
2338 0);
2339 }
2340
2341 QuicConsumedData ConsumeData(QuicStreamId id,
2342 const struct iovec* iov,
2343 int iov_count,
2344 size_t total_length,
2345 QuicStreamOffset offset,
2346 StreamSendingState state) {
2347 // Save data before data is consumed.
2348 if (total_length > 0) {
2349 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2350 }
2351 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2352 NOT_HANDSHAKE)) {
2353 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2354 }
2355 return QuicPacketCreator::ConsumeData(id, total_length, offset, state);
2356 }
2357
2358 MessageStatus AddMessageFrame(QuicMessageId message_id,
2359 QuicMemSliceSpan message) {
2360 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2361 NOT_HANDSHAKE)) {
2362 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2363 }
2364 return QuicPacketCreator::AddMessageFrame(message_id, message);
2365 }
2366
2367 size_t ConsumeCryptoData(EncryptionLevel level,
2368 QuicStringPiece data,
2369 QuicStreamOffset offset) {
2370 producer_->SaveCryptoData(level, offset, data);
2371 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2372 NOT_HANDSHAKE)) {
2373 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2374 }
2375 return QuicPacketCreator::ConsumeCryptoData(level, data.length(), offset);
2376 }
2377
2378 QuicAckFrame ack_frame_;
2379 MockDelegate* delegate_;
2380 SimpleDataProducer* producer_;
2381};
2382
2383class QuicPacketCreatorMultiplePacketsTest : public QuicTest {
2384 public:
2385 QuicPacketCreatorMultiplePacketsTest()
2386 : framer_(AllSupportedVersions(),
2387 QuicTime::Zero(),
2388 Perspective::IS_CLIENT,
2389 kQuicDefaultConnectionIdLength),
2390 creator_(TestConnectionId(),
2391 &framer_,
2392 &random_creator_,
2393 &delegate_,
2394 &producer_),
2395 ack_frame_(InitAckFrame(1)) {
2396 EXPECT_CALL(delegate_, GetPacketBuffer()).WillRepeatedly(Return(nullptr));
2397 creator_.SetEncrypter(
2398 ENCRYPTION_FORWARD_SECURE,
2399 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
2400 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2401 framer_.set_data_producer(&producer_);
2402 if (simple_framer_.framer()->version().KnowsWhichDecrypterToUse()) {
2403 simple_framer_.framer()->InstallDecrypter(
2404 ENCRYPTION_FORWARD_SECURE,
2405 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
2406 }
2407 creator_.AttachPacketFlusher();
2408 }
2409
2410 ~QuicPacketCreatorMultiplePacketsTest() override {
2411 for (SerializedPacket& packet : packets_) {
2412 delete[] packet.encrypted_buffer;
2413 ClearSerializedPacket(&packet);
2414 }
2415 }
2416
2417 void SavePacket(SerializedPacket* packet) {
2418 packet->encrypted_buffer = CopyBuffer(*packet);
2419 packets_.push_back(*packet);
2420 packet->encrypted_buffer = nullptr;
2421 packet->retransmittable_frames.clear();
2422 }
2423
2424 protected:
2425 QuicRstStreamFrame* CreateRstStreamFrame() {
2426 return new QuicRstStreamFrame(1, 1, QUIC_STREAM_NO_ERROR, 0);
2427 }
2428
2429 QuicGoAwayFrame* CreateGoAwayFrame() {
2430 return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, std::string());
2431 }
2432
2433 void CheckPacketContains(const PacketContents& contents,
2434 size_t packet_index) {
2435 ASSERT_GT(packets_.size(), packet_index);
2436 const SerializedPacket& packet = packets_[packet_index];
2437 size_t num_retransmittable_frames =
2438 contents.num_connection_close_frames + contents.num_goaway_frames +
2439 contents.num_rst_stream_frames + contents.num_stream_frames +
2440 contents.num_crypto_frames + contents.num_ping_frames;
2441 size_t num_frames =
2442 contents.num_ack_frames + contents.num_stop_waiting_frames +
2443 contents.num_mtu_discovery_frames + contents.num_padding_frames +
2444 num_retransmittable_frames;
2445
2446 if (num_retransmittable_frames == 0) {
2447 ASSERT_TRUE(packet.retransmittable_frames.empty());
2448 } else {
2449 ASSERT_FALSE(packet.retransmittable_frames.empty());
2450 EXPECT_EQ(num_retransmittable_frames,
2451 packet.retransmittable_frames.size());
2452 }
2453
2454 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2455 ASSERT_TRUE(simple_framer_.ProcessPacket(
2456 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2457 size_t num_padding_frames = 0;
2458 if (contents.num_padding_frames == 0) {
2459 num_padding_frames = simple_framer_.padding_frames().size();
2460 }
2461 EXPECT_EQ(num_frames + num_padding_frames, simple_framer_.num_frames());
2462 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
2463 EXPECT_EQ(contents.num_connection_close_frames,
2464 simple_framer_.connection_close_frames().size());
2465 EXPECT_EQ(contents.num_goaway_frames,
2466 simple_framer_.goaway_frames().size());
2467 EXPECT_EQ(contents.num_rst_stream_frames,
2468 simple_framer_.rst_stream_frames().size());
2469 EXPECT_EQ(contents.num_stream_frames,
2470 simple_framer_.stream_frames().size());
2471 EXPECT_EQ(contents.num_crypto_frames,
2472 simple_framer_.crypto_frames().size());
2473 EXPECT_EQ(contents.num_stop_waiting_frames,
2474 simple_framer_.stop_waiting_frames().size());
2475 if (contents.num_padding_frames != 0) {
2476 EXPECT_EQ(contents.num_padding_frames,
2477 simple_framer_.padding_frames().size());
2478 }
2479
2480 // From the receiver's perspective, MTU discovery frames are ping frames.
2481 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames,
2482 simple_framer_.ping_frames().size());
2483 }
2484
2485 void CheckPacketHasSingleStreamFrame(size_t packet_index) {
2486 ASSERT_GT(packets_.size(), packet_index);
2487 const SerializedPacket& packet = packets_[packet_index];
2488 ASSERT_FALSE(packet.retransmittable_frames.empty());
2489 EXPECT_EQ(1u, packet.retransmittable_frames.size());
2490 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2491 ASSERT_TRUE(simple_framer_.ProcessPacket(
2492 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2493 EXPECT_EQ(1u, simple_framer_.num_frames());
2494 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
2495 }
2496
2497 void CheckAllPacketsHaveSingleStreamFrame() {
2498 for (size_t i = 0; i < packets_.size(); i++) {
2499 CheckPacketHasSingleStreamFrame(i);
2500 }
2501 }
2502
2503 void CreateData(size_t len) {
2504 data_array_.reset(new char[len]);
2505 memset(data_array_.get(), '?', len);
2506 iov_.iov_base = data_array_.get();
2507 iov_.iov_len = len;
2508 }
2509
2510 QuicFramer framer_;
2511 MockRandom random_creator_;
2512 StrictMock<MockDelegate> delegate_;
2513 MultiplePacketsTestPacketCreator creator_;
2514 SimpleQuicFramer simple_framer_;
2515 std::vector<SerializedPacket> packets_;
2516 QuicAckFrame ack_frame_;
2517 struct iovec iov_;
2518 SimpleBufferAllocator allocator_;
2519
2520 private:
2521 std::unique_ptr<char[]> data_array_;
2522 SimpleDataProducer producer_;
2523};
2524
2525TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_NotWritable) {
2526 delegate_.SetCanNotWrite();
2527
2528 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2529 const bool consumed =
2530 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2531 /*bundle_ack=*/false);
2532 EXPECT_FALSE(consumed);
2533 EXPECT_FALSE(creator_.HasPendingFrames());
2534 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2535 delete rst_frame;
2536}
2537
2538TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_OnlyAckWritable) {
2539 delegate_.SetCanWriteOnlyNonRetransmittable();
2540
2541 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2542 const bool consumed =
2543 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2544 /*bundle_ack=*/false);
2545 EXPECT_FALSE(consumed);
2546 EXPECT_FALSE(creator_.HasPendingFrames());
2547 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2548 delete rst_frame;
2549}
2550
2551TEST_F(QuicPacketCreatorMultiplePacketsTest,
2552 AddControlFrame_WritableAndShouldNotFlush) {
2553 delegate_.SetCanWriteAnything();
2554
2555 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2556 /*bundle_ack=*/false);
2557 EXPECT_TRUE(creator_.HasPendingFrames());
2558 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2559}
2560
2561TEST_F(QuicPacketCreatorMultiplePacketsTest,
2562 AddControlFrame_NotWritableBatchThenFlush) {
2563 delegate_.SetCanNotWrite();
2564
2565 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2566 const bool consumed =
2567 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2568 /*bundle_ack=*/false);
2569 EXPECT_FALSE(consumed);
2570 EXPECT_FALSE(creator_.HasPendingFrames());
2571 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2572 delete rst_frame;
2573}
2574
2575TEST_F(QuicPacketCreatorMultiplePacketsTest,
2576 AddControlFrame_WritableAndShouldFlush) {
2577 delegate_.SetCanWriteAnything();
2578
2579 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2580 .WillOnce(
2581 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2582
2583 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2584 /*bundle_ack=*/false);
2585 creator_.Flush();
2586 EXPECT_FALSE(creator_.HasPendingFrames());
2587 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2588
2589 PacketContents contents;
2590 contents.num_rst_stream_frames = 1;
2591 CheckPacketContains(contents, 0);
2592}
2593
2594TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeCryptoData) {
2595 delegate_.SetCanWriteAnything();
2596
2597 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2598 .WillOnce(
2599 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2600 std::string data = "crypto data";
2601 size_t consumed_bytes =
2602 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2603 creator_.Flush();
2604 EXPECT_EQ(data.length(), consumed_bytes);
2605 EXPECT_FALSE(creator_.HasPendingFrames());
2606 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2607
2608 PacketContents contents;
2609 contents.num_crypto_frames = 1;
2610 contents.num_padding_frames = 1;
2611 CheckPacketContains(contents, 0);
2612}
2613
2614TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_NotWritable) {
2615 delegate_.SetCanNotWrite();
2616
2617 MakeIOVector("foo", &iov_);
2618 QuicConsumedData consumed = creator_.ConsumeData(
2619 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2620 Perspective::IS_CLIENT),
2621 &iov_, 1u, iov_.iov_len, 0, FIN);
2622 EXPECT_EQ(0u, consumed.bytes_consumed);
2623 EXPECT_FALSE(consumed.fin_consumed);
2624 EXPECT_FALSE(creator_.HasPendingFrames());
2625 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2626}
2627
2628TEST_F(QuicPacketCreatorMultiplePacketsTest,
2629 ConsumeData_WritableAndShouldNotFlush) {
2630 delegate_.SetCanWriteAnything();
2631
2632 MakeIOVector("foo", &iov_);
2633 QuicConsumedData consumed = creator_.ConsumeData(
2634 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2635 Perspective::IS_CLIENT),
2636 &iov_, 1u, iov_.iov_len, 0, FIN);
2637 EXPECT_EQ(3u, consumed.bytes_consumed);
2638 EXPECT_TRUE(consumed.fin_consumed);
2639 EXPECT_TRUE(creator_.HasPendingFrames());
2640 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2641}
2642
2643TEST_F(QuicPacketCreatorMultiplePacketsTest,
2644 ConsumeData_WritableAndShouldFlush) {
2645 delegate_.SetCanWriteAnything();
2646
2647 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2648 .WillOnce(
2649 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2650 MakeIOVector("foo", &iov_);
2651 QuicConsumedData consumed = creator_.ConsumeData(
2652 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2653 Perspective::IS_CLIENT),
2654 &iov_, 1u, iov_.iov_len, 0, FIN);
2655 creator_.Flush();
2656 EXPECT_EQ(3u, consumed.bytes_consumed);
2657 EXPECT_TRUE(consumed.fin_consumed);
2658 EXPECT_FALSE(creator_.HasPendingFrames());
2659 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2660
2661 PacketContents contents;
2662 contents.num_stream_frames = 1;
2663 CheckPacketContains(contents, 0);
2664}
2665
2666// Test the behavior of ConsumeData when the data consumed is for the crypto
2667// handshake stream. Ensure that the packet is always sent and padded even if
2668// the creator operates in batch mode.
2669TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_Handshake) {
2670 delegate_.SetCanWriteAnything();
2671
2672 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2673 .WillOnce(
2674 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2675 std::string data = "foo bar";
2676 MakeIOVector(data, &iov_);
2677 size_t consumed_bytes = 0;
2678 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2679 consumed_bytes = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2680 } else {
2681 consumed_bytes =
2682 creator_
2683 .ConsumeData(
2684 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2685 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2686 .bytes_consumed;
2687 }
2688 EXPECT_EQ(7u, consumed_bytes);
2689 EXPECT_FALSE(creator_.HasPendingFrames());
2690 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2691
2692 PacketContents contents;
2693 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2694 contents.num_crypto_frames = 1;
2695 } else {
2696 contents.num_stream_frames = 1;
2697 }
2698 contents.num_padding_frames = 1;
2699 CheckPacketContains(contents, 0);
2700
2701 ASSERT_EQ(1u, packets_.size());
2702 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2703 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
2704}
2705
2706// Test the behavior of ConsumeData when the data is for the crypto handshake
2707// stream, but padding is disabled.
2708TEST_F(QuicPacketCreatorMultiplePacketsTest,
2709 ConsumeData_Handshake_PaddingDisabled) {
2710 creator_.set_fully_pad_crypto_handshake_packets(false);
2711
2712 delegate_.SetCanWriteAnything();
2713
2714 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2715 .WillOnce(
2716 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2717 std::string data = "foo";
2718 MakeIOVector(data, &iov_);
2719 size_t bytes_consumed = 0;
2720 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2721 bytes_consumed = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2722 } else {
2723 bytes_consumed =
2724 creator_
2725 .ConsumeData(
2726 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2727 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2728 .bytes_consumed;
2729 }
2730 EXPECT_EQ(3u, bytes_consumed);
2731 EXPECT_FALSE(creator_.HasPendingFrames());
2732 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2733
2734 PacketContents contents;
2735 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2736 contents.num_crypto_frames = 1;
2737 } else {
2738 contents.num_stream_frames = 1;
2739 }
2740 contents.num_padding_frames = 0;
2741 CheckPacketContains(contents, 0);
2742
2743 ASSERT_EQ(1u, packets_.size());
2744
2745 // Packet is not fully padded, but we want to future packets to be larger.
2746 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2747 size_t expected_packet_length = 27;
2748 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2749 // The framing of CRYPTO frames is slightly different than that of stream
2750 // frames, so the expected packet length differs slightly.
2751 expected_packet_length = 28;
2752 }
2753 if (framer_.version().HasHeaderProtection()) {
2754 expected_packet_length = 29;
2755 }
2756 EXPECT_EQ(expected_packet_length, packets_[0].encrypted_length);
2757}
2758
2759TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_EmptyData) {
2760 delegate_.SetCanWriteAnything();
2761
2762 EXPECT_QUIC_BUG(creator_.ConsumeData(
2763 QuicUtils::QuicUtils::GetFirstBidirectionalStreamId(
2764 framer_.transport_version(), Perspective::IS_CLIENT),
2765 nullptr, 0, 0, 0, NO_FIN),
2766 "Attempt to consume empty data without FIN.");
2767}
2768
2769TEST_F(QuicPacketCreatorMultiplePacketsTest,
2770 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
2771 delegate_.SetCanWriteAnything();
2772
2773 MakeIOVector("foo", &iov_);
2774 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2775 framer_.transport_version(), Perspective::IS_CLIENT),
2776 &iov_, 1u, iov_.iov_len, 0, FIN);
2777 MakeIOVector("quux", &iov_);
2778 QuicConsumedData consumed =
2779 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 3, NO_FIN);
2780 EXPECT_EQ(4u, consumed.bytes_consumed);
2781 EXPECT_FALSE(consumed.fin_consumed);
2782 EXPECT_TRUE(creator_.HasPendingFrames());
2783 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2784}
2785
2786TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_BatchOperations) {
2787 delegate_.SetCanWriteAnything();
2788
2789 MakeIOVector("foo", &iov_);
2790 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2791 framer_.transport_version(), Perspective::IS_CLIENT),
2792 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2793 MakeIOVector("quux", &iov_);
2794 QuicConsumedData consumed = creator_.ConsumeData(
2795 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2796 Perspective::IS_CLIENT),
2797 &iov_, 1u, iov_.iov_len, 3, FIN);
2798 EXPECT_EQ(4u, consumed.bytes_consumed);
2799 EXPECT_TRUE(consumed.fin_consumed);
2800 EXPECT_TRUE(creator_.HasPendingFrames());
2801 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2802
2803 // Now both frames will be flushed out.
2804 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2805 .WillOnce(
2806 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2807 creator_.Flush();
2808 EXPECT_FALSE(creator_.HasPendingFrames());
2809 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2810
2811 PacketContents contents;
2812 contents.num_stream_frames =
renjietang6beb5112019-11-11 14:43:19 -08002813 GetQuicRestartFlag(quic_coalesce_stream_frames_2) ? 1 : 2;
fayang4245c212019-11-05 13:33:46 -08002814 CheckPacketContains(contents, 0);
2815}
2816
2817TEST_F(QuicPacketCreatorMultiplePacketsTest,
2818 ConsumeData_FramesPreviouslyQueued) {
2819 // Set the packet size be enough for two stream frames with 0 stream offset,
2820 // but not enough for a stream frame of 0 offset and one with non-zero offset.
2821 size_t length =
2822 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
2823 GetPacketHeaderSize(
2824 framer_.transport_version(),
2825 creator_.GetDestinationConnectionIdLength(),
2826 creator_.GetSourceConnectionIdLength(),
2827 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2828 !kIncludeDiversificationNonce,
2829 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2830 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
2831 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
2832 // Add an extra 3 bytes for the payload and 1 byte so
2833 // BytesFree is larger than the GetMinStreamFrameSize.
2834 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0,
2835 false, 3) +
2836 3 +
2837 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0, true,
2838 1) +
2839 1;
2840 creator_.SetMaxPacketLength(length);
2841 delegate_.SetCanWriteAnything();
2842 {
2843 InSequence dummy;
2844 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2845 .WillOnce(
2846 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2847 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2848 .WillOnce(
2849 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2850 }
2851 // Queue enough data to prevent a stream frame with a non-zero offset from
2852 // fitting.
2853 MakeIOVector("foo", &iov_);
2854 QuicConsumedData consumed = creator_.ConsumeData(
2855 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2856 Perspective::IS_CLIENT),
2857 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2858 EXPECT_EQ(3u, consumed.bytes_consumed);
2859 EXPECT_FALSE(consumed.fin_consumed);
2860 EXPECT_TRUE(creator_.HasPendingFrames());
2861 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2862
2863 // This frame will not fit with the existing frame, causing the queued frame
2864 // to be serialized, and it will be added to a new open packet.
2865 MakeIOVector("bar", &iov_);
2866 consumed = creator_.ConsumeData(
2867 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2868 Perspective::IS_CLIENT),
2869 &iov_, 1u, iov_.iov_len, 3, FIN);
2870 EXPECT_EQ(3u, consumed.bytes_consumed);
2871 EXPECT_TRUE(consumed.fin_consumed);
2872 EXPECT_TRUE(creator_.HasPendingFrames());
2873 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2874
2875 creator_.FlushCurrentPacket();
2876 EXPECT_FALSE(creator_.HasPendingFrames());
2877 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2878
2879 PacketContents contents;
2880 contents.num_stream_frames = 1;
2881 CheckPacketContains(contents, 0);
2882 CheckPacketContains(contents, 1);
2883}
2884
2885TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataFastPath) {
2886 delegate_.SetCanWriteAnything();
2887 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
2888
2889 // Create a 10000 byte IOVector.
2890 CreateData(10000);
2891 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2892 .WillRepeatedly(
2893 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2894 QuicConsumedData consumed = creator_.ConsumeDataFastPath(
2895 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2896 Perspective::IS_CLIENT),
2897 &iov_, 1u, iov_.iov_len, 0, true);
2898 EXPECT_EQ(10000u, consumed.bytes_consumed);
2899 EXPECT_TRUE(consumed.fin_consumed);
2900 EXPECT_FALSE(creator_.HasPendingFrames());
2901 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2902
2903 PacketContents contents;
2904 contents.num_stream_frames = 1;
2905 CheckPacketContains(contents, 0);
2906 EXPECT_FALSE(packets_.empty());
2907 SerializedPacket packet = packets_.back();
2908 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2909 EXPECT_EQ(LOSS_RETRANSMISSION, packet.transmission_type);
2910 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2911 const QuicStreamFrame& stream_frame =
2912 packet.retransmittable_frames.front().stream_frame;
2913 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2914}
2915
2916TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLarge) {
2917 delegate_.SetCanWriteAnything();
2918
2919 // Create a 10000 byte IOVector.
2920 CreateData(10000);
2921 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2922 .WillRepeatedly(
2923 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2924 QuicConsumedData consumed = creator_.ConsumeData(
2925 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2926 Perspective::IS_CLIENT),
2927 &iov_, 1u, iov_.iov_len, 0, FIN);
2928 EXPECT_EQ(10000u, consumed.bytes_consumed);
2929 EXPECT_TRUE(consumed.fin_consumed);
2930 EXPECT_FALSE(creator_.HasPendingFrames());
2931 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2932
2933 PacketContents contents;
2934 contents.num_stream_frames = 1;
2935 CheckPacketContains(contents, 0);
2936 EXPECT_FALSE(packets_.empty());
2937 SerializedPacket packet = packets_.back();
2938 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2939 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2940 const QuicStreamFrame& stream_frame =
2941 packet.retransmittable_frames.front().stream_frame;
2942 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2943}
2944
2945TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckFalse) {
2946 delegate_.SetCanNotWrite();
2947
2948 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2949 const bool success =
2950 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2951 /*bundle_ack=*/true);
2952 EXPECT_FALSE(success);
2953 EXPECT_FALSE(creator_.HasPendingFrames());
2954 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2955
2956 delegate_.SetCanWriteAnything();
2957
2958 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2959 /*bundle_ack=*/false);
2960
2961 // Create a 10000 byte IOVector.
2962 CreateData(10000);
2963 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2964 .WillRepeatedly(
2965 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2966 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2967 /*bundle_ack=*/true);
2968 QuicConsumedData consumed = creator_.ConsumeData(
2969 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2970 Perspective::IS_CLIENT),
2971 &iov_, 1u, iov_.iov_len, 0, FIN);
2972 creator_.Flush();
2973
2974 EXPECT_EQ(10000u, consumed.bytes_consumed);
2975 EXPECT_TRUE(consumed.fin_consumed);
2976 EXPECT_FALSE(creator_.HasPendingFrames());
2977 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2978
2979 EXPECT_FALSE(packets_.empty());
2980 SerializedPacket packet = packets_.back();
2981 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2982 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2983 const QuicStreamFrame& stream_frame =
2984 packet.retransmittable_frames.front().stream_frame;
2985 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2986}
2987
2988TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckTrue) {
fayang4245c212019-11-05 13:33:46 -08002989 delegate_.SetCanNotWrite();
2990 delegate_.SetCanWriteAnything();
2991
2992 // Create a 10000 byte IOVector.
2993 CreateData(10000);
2994 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2995 .WillRepeatedly(
2996 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2997 QuicConsumedData consumed = creator_.ConsumeData(
2998 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2999 Perspective::IS_CLIENT),
3000 &iov_, 1u, iov_.iov_len, 0, FIN);
3001 creator_.Flush();
3002
3003 EXPECT_EQ(10000u, consumed.bytes_consumed);
3004 EXPECT_TRUE(consumed.fin_consumed);
3005 EXPECT_FALSE(creator_.HasPendingFrames());
3006 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3007
3008 EXPECT_FALSE(packets_.empty());
3009 SerializedPacket packet = packets_.back();
3010 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3011 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3012 const QuicStreamFrame& stream_frame =
3013 packet.retransmittable_frames.front().stream_frame;
3014 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3015}
3016
3017TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations) {
3018 delegate_.SetCanNotWrite();
3019
3020 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3021 const bool consumed =
3022 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3023 /*bundle_ack=*/true);
3024 EXPECT_FALSE(consumed);
3025 EXPECT_FALSE(creator_.HasPendingFrames());
3026 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3027 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3028
3029 delegate_.SetCanWriteAnything();
3030
3031 EXPECT_TRUE(
3032 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3033 /*bundle_ack=*/false));
3034 // Send some data and a control frame
3035 MakeIOVector("quux", &iov_);
3036 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3037 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3038 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3039 /*bundle_ack=*/false);
3040 }
3041 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(3));
3042
3043 // All five frames will be flushed out in a single packet.
3044 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3045 .WillOnce(
3046 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3047 creator_.Flush();
3048 EXPECT_FALSE(creator_.HasPendingFrames());
3049 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3050 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3051
3052 PacketContents contents;
3053 // ACK will be flushed by connection.
3054 contents.num_ack_frames = 0;
3055 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3056 contents.num_goaway_frames = 1;
3057 } else {
3058 contents.num_goaway_frames = 0;
3059 }
3060 contents.num_rst_stream_frames = 1;
3061 contents.num_stream_frames = 1;
3062 CheckPacketContains(contents, 0);
3063}
3064
3065TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations2) {
3066 delegate_.SetCanNotWrite();
3067
3068 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3069 const bool success =
3070 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3071 /*bundle_ack=*/true);
3072 EXPECT_FALSE(success);
3073 EXPECT_FALSE(creator_.HasPendingFrames());
3074 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3075
3076 delegate_.SetCanWriteAnything();
3077
3078 {
3079 InSequence dummy;
3080 // All five frames will be flushed out in a single packet
3081 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3082 .WillOnce(
3083 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3084 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3085 .WillOnce(
3086 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3087 }
3088 EXPECT_TRUE(
3089 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3090 /*bundle_ack=*/false));
3091 // Send enough data to exceed one packet
3092 size_t data_len = kDefaultMaxPacketSize + 100;
3093 CreateData(data_len);
3094 QuicConsumedData consumed =
3095 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, FIN);
3096 EXPECT_EQ(data_len, consumed.bytes_consumed);
3097 EXPECT_TRUE(consumed.fin_consumed);
3098 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3099 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3100 /*bundle_ack=*/false);
3101 }
3102
3103 creator_.Flush();
3104 EXPECT_FALSE(creator_.HasPendingFrames());
3105 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3106
3107 // The first packet should have the queued data and part of the stream data.
3108 PacketContents contents;
3109 // ACK will be sent by connection.
3110 contents.num_ack_frames = 0;
3111 contents.num_rst_stream_frames = 1;
3112 contents.num_stream_frames = 1;
3113 CheckPacketContains(contents, 0);
3114
3115 // The second should have the remainder of the stream data.
3116 PacketContents contents2;
3117 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3118 contents2.num_goaway_frames = 1;
3119 } else {
3120 contents2.num_goaway_frames = 0;
3121 }
3122 contents2.num_stream_frames = 1;
3123 CheckPacketContains(contents2, 1);
3124}
3125
3126// Regression test of b/120493795.
3127TEST_F(QuicPacketCreatorMultiplePacketsTest, PacketTransmissionType) {
3128 delegate_.SetCanWriteAnything();
3129
3130 // The first ConsumeData will fill the packet without flush.
3131 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
3132
3133 size_t data_len = 1324;
3134 CreateData(data_len);
3135 QuicStreamId stream1_id = QuicUtils::GetFirstBidirectionalStreamId(
3136 framer_.transport_version(), Perspective::IS_CLIENT);
3137 QuicConsumedData consumed =
3138 creator_.ConsumeData(stream1_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3139 EXPECT_EQ(data_len, consumed.bytes_consumed);
3140 ASSERT_EQ(0u, creator_.BytesFree())
3141 << "Test setup failed: Please increase data_len to "
3142 << data_len + creator_.BytesFree() << " bytes.";
3143
3144 // The second ConsumeData can not be added to the packet and will flush.
3145 creator_.SetTransmissionType(NOT_RETRANSMISSION);
3146
3147 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3148 .WillOnce(
3149 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3150
3151 QuicStreamId stream2_id = stream1_id + 4;
3152
3153 consumed =
3154 creator_.ConsumeData(stream2_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3155 EXPECT_EQ(data_len, consumed.bytes_consumed);
3156
3157 // Ensure the packet is successfully created.
3158 ASSERT_EQ(1u, packets_.size());
3159 ASSERT_TRUE(packets_[0].encrypted_buffer);
3160 ASSERT_EQ(1u, packets_[0].retransmittable_frames.size());
3161 EXPECT_EQ(stream1_id,
3162 packets_[0].retransmittable_frames[0].stream_frame.stream_id);
3163
3164 // Since the second frame was not added, the packet's transmission type
3165 // should be the first frame's type.
3166 EXPECT_EQ(packets_[0].transmission_type, LOSS_RETRANSMISSION);
3167}
3168
3169TEST_F(QuicPacketCreatorMultiplePacketsTest, TestConnectionIdLength) {
3170 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
3171 creator_.SetServerConnectionIdLength(0);
3172 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3173 creator_.GetDestinationConnectionIdLength());
3174
3175 for (size_t i = 1; i < 10; i++) {
3176 creator_.SetServerConnectionIdLength(i);
3177 if (VersionHasIetfInvariantHeader(framer_.transport_version())) {
3178 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3179 creator_.GetDestinationConnectionIdLength());
3180 } else {
3181 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID,
3182 creator_.GetDestinationConnectionIdLength());
3183 }
3184 }
3185}
3186
3187// Test whether SetMaxPacketLength() works in the situation when the queue is
3188// empty, and we send three packets worth of data.
3189TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Initial) {
3190 delegate_.SetCanWriteAnything();
3191
3192 // Send enough data for three packets.
3193 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
3194 size_t packet_len = kDefaultMaxPacketSize + 100;
3195 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3196 creator_.SetMaxPacketLength(packet_len);
3197 EXPECT_EQ(packet_len, creator_.max_packet_length());
3198
3199 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3200 .Times(3)
3201 .WillRepeatedly(
3202 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3203 CreateData(data_len);
3204 QuicConsumedData consumed = creator_.ConsumeData(
3205 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3206 Perspective::IS_CLIENT),
3207 &iov_, 1u, iov_.iov_len,
3208 /*offset=*/0, FIN);
3209 EXPECT_EQ(data_len, consumed.bytes_consumed);
3210 EXPECT_TRUE(consumed.fin_consumed);
3211 EXPECT_FALSE(creator_.HasPendingFrames());
3212 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3213
3214 // We expect three packets, and first two of them have to be of packet_len
3215 // size. We check multiple packets (instead of just one) because we want to
3216 // ensure that |max_packet_length_| does not get changed incorrectly by the
3217 // creator after first packet is serialized.
3218 ASSERT_EQ(3u, packets_.size());
3219 EXPECT_EQ(packet_len, packets_[0].encrypted_length);
3220 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3221 CheckAllPacketsHaveSingleStreamFrame();
3222}
3223
3224// Test whether SetMaxPacketLength() works in the situation when we first write
3225// data, then change packet size, then write data again.
3226TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Middle) {
3227 delegate_.SetCanWriteAnything();
3228
3229 // We send enough data to overflow default packet length, but not the altered
3230 // one.
3231 size_t data_len = kDefaultMaxPacketSize;
3232 size_t packet_len = kDefaultMaxPacketSize + 100;
3233 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3234
3235 // We expect to see three packets in total.
3236 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3237 .Times(3)
3238 .WillRepeatedly(
3239 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3240
3241 // Send two packets before packet size change.
3242 CreateData(data_len);
3243 QuicConsumedData consumed = creator_.ConsumeData(
3244 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3245 Perspective::IS_CLIENT),
3246 &iov_, 1u, iov_.iov_len,
3247 /*offset=*/0, NO_FIN);
3248 creator_.Flush();
3249 EXPECT_EQ(data_len, consumed.bytes_consumed);
3250 EXPECT_FALSE(consumed.fin_consumed);
3251 EXPECT_FALSE(creator_.HasPendingFrames());
3252 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3253
3254 // Make sure we already have two packets.
3255 ASSERT_EQ(2u, packets_.size());
3256
3257 // Increase packet size.
3258 creator_.SetMaxPacketLength(packet_len);
3259 EXPECT_EQ(packet_len, creator_.max_packet_length());
3260
3261 // Send a packet after packet size change.
3262 CreateData(data_len);
3263 creator_.AttachPacketFlusher();
3264 consumed = creator_.ConsumeData(
3265 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3266 Perspective::IS_CLIENT),
3267 &iov_, 1u, iov_.iov_len, data_len, FIN);
3268 creator_.Flush();
3269 EXPECT_EQ(data_len, consumed.bytes_consumed);
3270 EXPECT_TRUE(consumed.fin_consumed);
3271 EXPECT_FALSE(creator_.HasPendingFrames());
3272 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3273
3274 // We expect first data chunk to get fragmented, but the second one to fit
3275 // into a single packet.
3276 ASSERT_EQ(3u, packets_.size());
3277 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3278 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length);
3279 CheckAllPacketsHaveSingleStreamFrame();
3280}
3281
3282// Test whether SetMaxPacketLength() works correctly when we force the change of
3283// the packet size in the middle of the batched packet.
3284TEST_F(QuicPacketCreatorMultiplePacketsTest,
3285 SetMaxPacketLength_MidpacketFlush) {
3286 delegate_.SetCanWriteAnything();
3287
3288 size_t first_write_len = kDefaultMaxPacketSize / 2;
3289 size_t packet_len = kDefaultMaxPacketSize + 100;
3290 size_t second_write_len = packet_len + 1;
3291 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3292
3293 // First send half of the packet worth of data. We are in the batch mode, so
3294 // should not cause packet serialization.
3295 CreateData(first_write_len);
3296 QuicConsumedData consumed = creator_.ConsumeData(
3297 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3298 Perspective::IS_CLIENT),
3299 &iov_, 1u, iov_.iov_len,
3300 /*offset=*/0, NO_FIN);
3301 EXPECT_EQ(first_write_len, consumed.bytes_consumed);
3302 EXPECT_FALSE(consumed.fin_consumed);
3303 EXPECT_TRUE(creator_.HasPendingFrames());
3304 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3305
3306 // Make sure we have no packets so far.
3307 ASSERT_EQ(0u, packets_.size());
3308
3309 // Expect a packet to be flushed.
3310 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3311 .WillOnce(
3312 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3313
3314 // Increase packet size after flushing all frames.
3315 // Ensure it's immediately enacted.
3316 creator_.FlushCurrentPacket();
3317 creator_.SetMaxPacketLength(packet_len);
3318 EXPECT_EQ(packet_len, creator_.max_packet_length());
3319 EXPECT_FALSE(creator_.HasPendingFrames());
3320 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3321
3322 // We expect to see exactly one packet serialized after that, because we send
3323 // a value somewhat exceeding new max packet size, and the tail data does not
3324 // get serialized because we are still in the batch mode.
3325 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3326 .WillOnce(
3327 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3328
3329 // Send a more than a packet worth of data to the same stream. This should
3330 // trigger serialization of one packet, and queue another one.
3331 CreateData(second_write_len);
3332 consumed = creator_.ConsumeData(
3333 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3334 Perspective::IS_CLIENT),
3335 &iov_, 1u, iov_.iov_len,
3336 /*offset=*/first_write_len, FIN);
3337 EXPECT_EQ(second_write_len, consumed.bytes_consumed);
3338 EXPECT_TRUE(consumed.fin_consumed);
3339 EXPECT_TRUE(creator_.HasPendingFrames());
3340 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3341
3342 // We expect the first packet to be underfilled, and the second packet be up
3343 // to the new max packet size.
3344 ASSERT_EQ(2u, packets_.size());
3345 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3346 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3347
3348 CheckAllPacketsHaveSingleStreamFrame();
3349}
3350
3351// Test sending a connectivity probing packet.
3352TEST_F(QuicPacketCreatorMultiplePacketsTest,
3353 GenerateConnectivityProbingPacket) {
3354 delegate_.SetCanWriteAnything();
3355
3356 OwningSerializedPacketPointer probing_packet;
3357 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3358 QuicPathFrameBuffer payload = {
3359 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
3360 probing_packet =
3361 creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
3362 } else {
3363 probing_packet = creator_.SerializeConnectivityProbingPacket();
3364 }
3365
3366 ASSERT_TRUE(simple_framer_.ProcessPacket(QuicEncryptedPacket(
3367 probing_packet->encrypted_buffer, probing_packet->encrypted_length)));
3368
3369 EXPECT_EQ(2u, simple_framer_.num_frames());
3370 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3371 EXPECT_EQ(1u, simple_framer_.path_challenge_frames().size());
3372 } else {
3373 EXPECT_EQ(1u, simple_framer_.ping_frames().size());
3374 }
3375 EXPECT_EQ(1u, simple_framer_.padding_frames().size());
3376}
3377
3378// Test sending an MTU probe, without any surrounding data.
3379TEST_F(QuicPacketCreatorMultiplePacketsTest,
3380 GenerateMtuDiscoveryPacket_Simple) {
3381 delegate_.SetCanWriteAnything();
3382
3383 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3384 static_assert(target_mtu < kMaxOutgoingPacketSize,
3385 "The MTU probe used by the test exceeds maximum packet size");
3386
3387 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3388 .WillOnce(
3389 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3390
3391 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3392
3393 EXPECT_FALSE(creator_.HasPendingFrames());
3394 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3395 ASSERT_EQ(1u, packets_.size());
3396 EXPECT_EQ(target_mtu, packets_[0].encrypted_length);
3397
3398 PacketContents contents;
3399 contents.num_mtu_discovery_frames = 1;
3400 contents.num_padding_frames = 1;
3401 CheckPacketContains(contents, 0);
3402}
3403
3404// Test sending an MTU probe. Surround it with data, to ensure that it resets
3405// the MTU to the value before the probe was sent.
3406TEST_F(QuicPacketCreatorMultiplePacketsTest,
3407 GenerateMtuDiscoveryPacket_SurroundedByData) {
3408 delegate_.SetCanWriteAnything();
3409
3410 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3411 static_assert(target_mtu < kMaxOutgoingPacketSize,
3412 "The MTU probe used by the test exceeds maximum packet size");
3413
3414 // Send enough data so it would always cause two packets to be sent.
3415 const size_t data_len = target_mtu + 1;
3416
3417 // Send a total of five packets: two packets before the probe, the probe
3418 // itself, and two packets after the probe.
3419 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3420 .Times(5)
3421 .WillRepeatedly(
3422 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3423
3424 // Send data before the MTU probe.
3425 CreateData(data_len);
3426 QuicConsumedData consumed = creator_.ConsumeData(
3427 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3428 Perspective::IS_CLIENT),
3429 &iov_, 1u, iov_.iov_len,
3430 /*offset=*/0, NO_FIN);
3431 creator_.Flush();
3432 EXPECT_EQ(data_len, consumed.bytes_consumed);
3433 EXPECT_FALSE(consumed.fin_consumed);
3434 EXPECT_FALSE(creator_.HasPendingFrames());
3435 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3436
3437 // Send the MTU probe.
3438 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3439 EXPECT_FALSE(creator_.HasPendingFrames());
3440 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3441
3442 // Send data after the MTU probe.
3443 CreateData(data_len);
3444 creator_.AttachPacketFlusher();
3445 consumed = creator_.ConsumeData(
3446 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3447 Perspective::IS_CLIENT),
3448 &iov_, 1u, iov_.iov_len,
3449 /*offset=*/data_len, FIN);
3450 creator_.Flush();
3451 EXPECT_EQ(data_len, consumed.bytes_consumed);
3452 EXPECT_TRUE(consumed.fin_consumed);
3453 EXPECT_FALSE(creator_.HasPendingFrames());
3454 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3455
3456 ASSERT_EQ(5u, packets_.size());
3457 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3458 EXPECT_EQ(target_mtu, packets_[2].encrypted_length);
3459 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length);
3460
3461 PacketContents probe_contents;
3462 probe_contents.num_mtu_discovery_frames = 1;
3463 probe_contents.num_padding_frames = 1;
3464
3465 CheckPacketHasSingleStreamFrame(0);
3466 CheckPacketHasSingleStreamFrame(1);
3467 CheckPacketContains(probe_contents, 2);
3468 CheckPacketHasSingleStreamFrame(3);
3469 CheckPacketHasSingleStreamFrame(4);
3470}
3471
3472TEST_F(QuicPacketCreatorMultiplePacketsTest, DontCrashOnInvalidStopWaiting) {
3473 if (VersionSupportsMessageFrames(framer_.transport_version())) {
3474 return;
3475 }
3476 // Test added to ensure the creator does not crash when an invalid frame is
3477 // added. Because this is an indication of internal programming errors,
3478 // DFATALs are expected.
3479 // A 1 byte packet number length can't encode a gap of 1000.
3480 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1000);
3481
3482 delegate_.SetCanNotWrite();
3483 delegate_.SetCanWriteAnything();
3484
3485 // This will not serialize any packets, because of the invalid frame.
3486 EXPECT_CALL(delegate_,
3487 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _));
3488 EXPECT_QUIC_BUG(creator_.Flush(),
3489 "packet_number_length 1 is too small "
3490 "for least_unacked_delta: 1001");
3491}
3492
3493// Regression test for b/31486443.
3494TEST_F(QuicPacketCreatorMultiplePacketsTest,
3495 ConnectionCloseFrameLargerThanPacketSize) {
3496 delegate_.SetCanWriteAnything();
3497 char buf[2000] = {};
3498 QuicStringPiece error_details(buf, 2000);
3499 const QuicErrorCode kQuicErrorCode = QUIC_PACKET_WRITE_ERROR;
3500
3501 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
3502 framer_.transport_version(), kQuicErrorCode, std::string(error_details),
3503 /*transport_close_frame_type=*/0);
3504 creator_.ConsumeRetransmittableControlFrame(QuicFrame(frame),
3505 /*bundle_ack=*/false);
3506 EXPECT_TRUE(creator_.HasPendingFrames());
3507 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3508}
3509
3510TEST_F(QuicPacketCreatorMultiplePacketsTest,
3511 RandomPaddingAfterFinSingleStreamSinglePacket) {
3512 const QuicByteCount kStreamFramePayloadSize = 100u;
3513 char buf[kStreamFramePayloadSize] = {};
3514 const QuicStreamId kDataStreamId = 5;
3515 // Set the packet size be enough for one stream frame with 0 stream offset and
3516 // max size of random padding.
3517 size_t length =
3518 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3519 GetPacketHeaderSize(
3520 framer_.transport_version(),
3521 creator_.GetDestinationConnectionIdLength(),
3522 creator_.GetSourceConnectionIdLength(),
3523 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3524 !kIncludeDiversificationNonce,
3525 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3526 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3527 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3528 QuicFramer::GetMinStreamFrameSize(
3529 framer_.transport_version(), kDataStreamId, 0,
3530 /*last_frame_in_packet=*/false,
3531 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes) +
3532 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes;
3533 creator_.SetMaxPacketLength(length);
3534 delegate_.SetCanWriteAnything();
3535 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3536 .WillOnce(
3537 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3538 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
3539 QuicConsumedData consumed = creator_.ConsumeData(
3540 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3541 creator_.Flush();
3542 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3543 EXPECT_FALSE(creator_.HasPendingFrames());
3544 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3545
3546 EXPECT_EQ(1u, packets_.size());
3547 PacketContents contents;
3548 // The packet has both stream and padding frames.
3549 contents.num_padding_frames = 1;
3550 contents.num_stream_frames = 1;
3551 CheckPacketContains(contents, 0);
3552}
3553
3554TEST_F(QuicPacketCreatorMultiplePacketsTest,
3555 RandomPaddingAfterFinSingleStreamMultiplePackets) {
3556 const QuicByteCount kStreamFramePayloadSize = 100u;
3557 char buf[kStreamFramePayloadSize] = {};
3558 const QuicStreamId kDataStreamId = 5;
3559 // Set the packet size be enough for one stream frame with 0 stream offset +
3560 // 1. One or more packets will accommodate.
3561 size_t length =
3562 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3563 GetPacketHeaderSize(
3564 framer_.transport_version(),
3565 creator_.GetDestinationConnectionIdLength(),
3566 creator_.GetSourceConnectionIdLength(),
3567 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3568 !kIncludeDiversificationNonce,
3569 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3570 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3571 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3572 QuicFramer::GetMinStreamFrameSize(
3573 framer_.transport_version(), kDataStreamId, 0,
3574 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
3575 kStreamFramePayloadSize + 1;
3576 creator_.SetMaxPacketLength(length);
3577 delegate_.SetCanWriteAnything();
3578 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3579 .WillRepeatedly(
3580 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3581 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
3582 QuicConsumedData consumed = creator_.ConsumeData(
3583 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3584 creator_.Flush();
3585 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3586 EXPECT_FALSE(creator_.HasPendingFrames());
3587 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3588
3589 EXPECT_LE(1u, packets_.size());
3590 PacketContents contents;
3591 // The first packet has both stream and padding frames.
3592 contents.num_stream_frames = 1;
3593 contents.num_padding_frames = 1;
3594 CheckPacketContains(contents, 0);
3595
3596 for (size_t i = 1; i < packets_.size(); ++i) {
3597 // Following packets only have paddings.
3598 contents.num_stream_frames = 0;
3599 contents.num_padding_frames = 1;
3600 CheckPacketContains(contents, i);
3601 }
3602}
3603
3604TEST_F(QuicPacketCreatorMultiplePacketsTest,
3605 RandomPaddingAfterFinMultipleStreamsMultiplePackets) {
3606 const QuicByteCount kStreamFramePayloadSize = 100u;
3607 char buf[kStreamFramePayloadSize] = {};
3608 const QuicStreamId kDataStreamId1 = 5;
3609 const QuicStreamId kDataStreamId2 = 6;
3610 // Set the packet size be enough for first frame with 0 stream offset + second
3611 // frame + 1 byte payload. two or more packets will accommodate.
3612 size_t length =
3613 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3614 GetPacketHeaderSize(
3615 framer_.transport_version(),
3616 creator_.GetDestinationConnectionIdLength(),
3617 creator_.GetSourceConnectionIdLength(),
3618 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3619 !kIncludeDiversificationNonce,
3620 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3621 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3622 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3623 QuicFramer::GetMinStreamFrameSize(
3624 framer_.transport_version(), kDataStreamId1, 0,
3625 /*last_frame_in_packet=*/false, kStreamFramePayloadSize) +
3626 kStreamFramePayloadSize +
3627 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(),
3628 kDataStreamId1, 0,
3629 /*last_frame_in_packet=*/false, 1) +
3630 1;
3631 creator_.SetMaxPacketLength(length);
3632 delegate_.SetCanWriteAnything();
3633 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3634 .WillRepeatedly(
3635 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3636 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
3637 QuicConsumedData consumed = creator_.ConsumeData(
3638 kDataStreamId1, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3639 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3640 MakeIOVector(QuicStringPiece(buf, kStreamFramePayloadSize), &iov_);
3641 consumed = creator_.ConsumeData(kDataStreamId2, &iov_, 1u, iov_.iov_len, 0,
3642 FIN_AND_PADDING);
3643 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3644 creator_.Flush();
3645 EXPECT_FALSE(creator_.HasPendingFrames());
3646 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3647
3648 EXPECT_LE(2u, packets_.size());
3649 PacketContents contents;
3650 // The first packet has two stream frames.
3651 contents.num_stream_frames = 2;
3652 CheckPacketContains(contents, 0);
3653
3654 // The second packet has one stream frame and padding frames.
3655 contents.num_stream_frames = 1;
3656 contents.num_padding_frames = 1;
3657 CheckPacketContains(contents, 1);
3658
3659 for (size_t i = 2; i < packets_.size(); ++i) {
3660 // Following packets only have paddings.
3661 contents.num_stream_frames = 0;
3662 contents.num_padding_frames = 1;
3663 CheckPacketContains(contents, i);
3664 }
3665}
3666
3667TEST_F(QuicPacketCreatorMultiplePacketsTest, AddMessageFrame) {
3668 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
3669 return;
3670 }
3671 quic::QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
3672 delegate_.SetCanWriteAnything();
3673 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3674 .WillOnce(
3675 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3676
3677 MakeIOVector("foo", &iov_);
3678 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3679 framer_.transport_version(), Perspective::IS_CLIENT),
3680 &iov_, 1u, iov_.iov_len, 0, FIN);
3681 EXPECT_EQ(
3682 MESSAGE_STATUS_SUCCESS,
3683 creator_.AddMessageFrame(1, MakeSpan(&allocator_, "message", &storage)));
3684 EXPECT_TRUE(creator_.HasPendingFrames());
3685 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3686
3687 // Add a message which causes the flush of current packet.
3688 EXPECT_EQ(
3689 MESSAGE_STATUS_SUCCESS,
3690 creator_.AddMessageFrame(
3691 2,
3692 MakeSpan(&allocator_,
3693 std::string(creator_.GetCurrentLargestMessagePayload(), 'a'),
3694 &storage)));
3695 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3696
3697 // Failed to send messages which cannot fit into one packet.
3698 EXPECT_EQ(
3699 MESSAGE_STATUS_TOO_LARGE,
3700 creator_.AddMessageFrame(
3701 3, MakeSpan(&allocator_,
3702 std::string(
3703 creator_.GetCurrentLargestMessagePayload() + 10, 'a'),
3704 &storage)));
3705}
3706
3707TEST_F(QuicPacketCreatorMultiplePacketsTest, ConnectionId) {
3708 creator_.SetServerConnectionId(TestConnectionId(0x1337));
3709 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3710 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
3711 if (!framer_.version().SupportsClientConnectionIds()) {
3712 return;
3713 }
3714 creator_.SetClientConnectionId(TestConnectionId(0x33));
3715 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3716 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
3717}
3718
QUICHE teama6ef0a62019-03-07 20:34:33 -05003719} // namespace
3720} // namespace test
3721} // namespace quic