blob: d56795276f4d7498801f6035d3a2b288c3310f3e [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
vasilvvbed67c62020-10-20 06:38:43 -070014#include "absl/base/macros.h"
vasilvv9edb31e2020-12-03 19:32:58 -080015#include "absl/strings/str_cat.h"
vasilvvc872ee42020-10-07 19:50:22 -070016#include "absl/strings/string_view.h"
zhongyi546cc452019-04-12 15:27:49 -070017#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050018#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
19#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
20#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
renjietangdbe98342019-10-18 11:00:57 -070021#include "net/third_party/quiche/src/quic/core/frames/quic_stream_frame.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050022#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050023#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
24#include "net/third_party/quiche/src/quic/core/quic_types.h"
25#include "net/third_party/quiche/src/quic/core/quic_utils.h"
26#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
renjietangdbe98342019-10-18 11:00:57 -070027#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
fayang08750832019-10-24 11:25:34 -070028#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050029#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050030#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
31#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
32#include "net/third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h"
33#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
34#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
fayang4245c212019-11-05 13:33:46 -080035#include "net/third_party/quiche/src/quic/test_tools/simple_quic_framer.h"
dmcardle8f7df532020-01-07 13:28:57 -080036#include "net/third_party/quiche/src/common/test_tools/quiche_test_utils.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050037
38using testing::_;
39using testing::DoAll;
40using testing::InSequence;
41using testing::Invoke;
42using testing::Return;
43using testing::SaveArg;
44using testing::StrictMock;
45
46namespace quic {
47namespace test {
48namespace {
49
renjietang4c704c82019-10-07 16:39:11 -070050const QuicPacketNumber kPacketNumber = QuicPacketNumber(UINT64_C(0x12345678));
51// Use fields in which each byte is distinct to ensure that every byte is
52// framed correctly. The values are otherwise arbitrary.
dschinazi423adc72019-10-23 09:58:55 -070053QuicConnectionId CreateTestConnectionId() {
54 return TestConnectionId(UINT64_C(0xFEDCBA9876543210));
55}
renjietang4c704c82019-10-07 16:39:11 -070056
QUICHE teama6ef0a62019-03-07 20:34:33 -050057// Run tests with combinations of {ParsedQuicVersion,
58// ToggleVersionSerialization}.
59struct TestParams {
60 TestParams(ParsedQuicVersion version, bool version_serialization)
61 : version(version), version_serialization(version_serialization) {}
62
QUICHE teama6ef0a62019-03-07 20:34:33 -050063 ParsedQuicVersion version;
64 bool version_serialization;
65};
66
dschinazi142051a2019-09-18 18:17:29 -070067// Used by ::testing::PrintToStringParamName().
68std::string PrintToString(const TestParams& p) {
vasilvv9edb31e2020-12-03 19:32:58 -080069 return absl::StrCat(ParsedQuicVersionToString(p.version), "_",
70 (p.version_serialization ? "Include" : "No"), "Version");
dschinazi142051a2019-09-18 18:17:29 -070071}
72
QUICHE teama6ef0a62019-03-07 20:34:33 -050073// Constructs various test permutations.
74std::vector<TestParams> GetTestParams() {
75 std::vector<TestParams> params;
76 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
77 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
78 params.push_back(TestParams(all_supported_versions[i], true));
79 params.push_back(TestParams(all_supported_versions[i], false));
80 }
81 return params;
82}
83
rchc76cd742019-03-26 16:00:03 -070084class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
85 public:
86 ~MockDebugDelegate() override = default;
87
wub713afae2020-04-27 07:48:31 -070088 MOCK_METHOD(void, OnFrameAddedToPacket, (const QuicFrame& frame), (override));
renjietangdbe98342019-10-18 11:00:57 -070089
wub713afae2020-04-27 07:48:31 -070090 MOCK_METHOD(void,
91 OnStreamFrameCoalesced,
92 (const QuicStreamFrame& frame),
93 (override));
rchc76cd742019-03-26 16:00:03 -070094};
95
QUICHE teama6ef0a62019-03-07 20:34:33 -050096class TestPacketCreator : public QuicPacketCreator {
97 public:
98 TestPacketCreator(QuicConnectionId connection_id,
99 QuicFramer* framer,
100 DelegateInterface* delegate,
101 SimpleDataProducer* producer)
102 : QuicPacketCreator(connection_id, framer, delegate),
103 producer_(producer),
dschinazicc7d40d2020-12-02 11:28:18 -0800104 version_(framer->version()) {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105
fayang62b637b2019-09-16 08:40:49 -0700106 bool ConsumeDataToFillCurrentPacket(QuicStreamId id,
107 const struct iovec* iov,
108 int iov_count,
109 size_t total_length,
110 size_t iov_offset,
111 QuicStreamOffset offset,
112 bool fin,
113 bool needs_full_padding,
114 TransmissionType transmission_type,
115 QuicFrame* frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500116 // Save data before data is consumed.
117 QuicByteCount data_length = total_length - iov_offset;
118 if (data_length > 0) {
119 producer_->SaveStreamData(id, iov, iov_count, iov_offset, data_length);
120 }
fayang62b637b2019-09-16 08:40:49 -0700121 return QuicPacketCreator::ConsumeDataToFillCurrentPacket(
122 id, data_length - iov_offset, offset, fin, needs_full_padding,
123 transmission_type, frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500124 }
125
126 void StopSendingVersion() {
dschinazicc7d40d2020-12-02 11:28:18 -0800127 if (version_.HasIetfInvariantHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500128 set_encryption_level(ENCRYPTION_FORWARD_SECURE);
129 return;
130 }
131 QuicPacketCreator::StopSendingVersion();
132 }
133
134 SimpleDataProducer* producer_;
dschinazicc7d40d2020-12-02 11:28:18 -0800135 ParsedQuicVersion version_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500136};
137
138class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
139 public:
wub8a5dafa2020-05-13 12:30:17 -0700140 void ClearSerializedPacketForTests(SerializedPacket /*serialized_packet*/) {
141 // serialized packet self-clears on destruction.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500142 }
143
wub8a5dafa2020-05-13 12:30:17 -0700144 void SaveSerializedPacket(SerializedPacket serialized_packet) {
145 serialized_packet_.reset(CopySerializedPacket(
146 serialized_packet, &allocator_, /*copy_buffer=*/true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500147 }
148
wub8a5dafa2020-05-13 12:30:17 -0700149 void DeleteSerializedPacket() { serialized_packet_ = nullptr; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500150
151 protected:
152 QuicPacketCreatorTest()
153 : connection_id_(TestConnectionId(2)),
154 server_framer_(SupportedVersions(GetParam().version),
155 QuicTime::Zero(),
156 Perspective::IS_SERVER,
157 connection_id_.length()),
158 client_framer_(SupportedVersions(GetParam().version),
159 QuicTime::Zero(),
160 Perspective::IS_CLIENT,
161 connection_id_.length()),
162 data_("foo"),
wub8a5dafa2020-05-13 12:30:17 -0700163 creator_(connection_id_, &client_framer_, &delegate_, &producer_) {
wub50d4c712020-05-19 15:48:28 -0700164 EXPECT_CALL(delegate_, GetPacketBuffer())
165 .WillRepeatedly(Return(QuicPacketBuffer()));
fayangfe77c032020-08-24 18:21:32 -0700166 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
167 .WillRepeatedly(Return(SEND_TO_WRITER));
nharperc6b99512019-09-19 11:13:48 -0700168 creator_.SetEncrypter(ENCRYPTION_INITIAL, std::make_unique<NullEncrypter>(
169 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700170 creator_.SetEncrypter(ENCRYPTION_HANDSHAKE, std::make_unique<NullEncrypter>(
QUICHE team88ea0082019-03-15 10:05:26 -0700171 Perspective::IS_CLIENT));
vasilvv0fc587f2019-09-06 13:33:08 -0700172 creator_.SetEncrypter(ENCRYPTION_ZERO_RTT, std::make_unique<NullEncrypter>(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500173 Perspective::IS_CLIENT));
174 creator_.SetEncrypter(
175 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700176 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500177 client_framer_.set_visitor(&framer_visitor_);
178 server_framer_.set_visitor(&framer_visitor_);
179 client_framer_.set_data_producer(&producer_);
zhongyi546cc452019-04-12 15:27:49 -0700180 if (server_framer_.version().KnowsWhichDecrypterToUse()) {
181 server_framer_.InstallDecrypter(
nharperc6b99512019-09-19 11:13:48 -0700182 ENCRYPTION_INITIAL,
183 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
184 server_framer_.InstallDecrypter(
zhongyi546cc452019-04-12 15:27:49 -0700185 ENCRYPTION_ZERO_RTT,
vasilvv0fc587f2019-09-06 13:33:08 -0700186 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700187 server_framer_.InstallDecrypter(
188 ENCRYPTION_HANDSHAKE,
vasilvv0fc587f2019-09-06 13:33:08 -0700189 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700190 server_framer_.InstallDecrypter(
191 ENCRYPTION_FORWARD_SECURE,
vasilvv0fc587f2019-09-06 13:33:08 -0700192 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
nharperc6b99512019-09-19 11:13:48 -0700193 } else {
194 server_framer_.SetDecrypter(
195 ENCRYPTION_INITIAL,
196 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
zhongyi546cc452019-04-12 15:27:49 -0700197 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500198 }
199
wub8a5dafa2020-05-13 12:30:17 -0700200 ~QuicPacketCreatorTest() override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500201
202 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
203 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
dschinazi66dea072019-04-09 11:41:06 -0700204 &creator_, frames, buffer_, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500205 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
206 packet.encryption_level);
207 return packet;
208 }
209
210 void ProcessPacket(const SerializedPacket& packet) {
211 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
212 packet.encrypted_length);
213 server_framer_.ProcessPacket(encrypted_packet);
214 }
215
216 void CheckStreamFrame(const QuicFrame& frame,
217 QuicStreamId stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700218 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500219 QuicStreamOffset offset,
220 bool fin) {
221 EXPECT_EQ(STREAM_FRAME, frame.type);
222 EXPECT_EQ(stream_id, frame.stream_frame.stream_id);
dschinazi66dea072019-04-09 11:41:06 -0700223 char buf[kMaxOutgoingPacketSize];
QUICHE team173c48f2019-11-19 16:34:44 -0800224 QuicDataWriter writer(kMaxOutgoingPacketSize, buf, quiche::HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500225 if (frame.stream_frame.data_length > 0) {
226 producer_.WriteStreamData(stream_id, frame.stream_frame.offset,
227 frame.stream_frame.data_length, &writer);
228 }
vasilvvc872ee42020-10-07 19:50:22 -0700229 EXPECT_EQ(data, absl::string_view(buf, frame.stream_frame.data_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500230 EXPECT_EQ(offset, frame.stream_frame.offset);
231 EXPECT_EQ(fin, frame.stream_frame.fin);
232 }
233
234 // Returns the number of bytes consumed by the header of packet, including
235 // the version.
236 size_t GetPacketHeaderOverhead(QuicTransportVersion version) {
237 return GetPacketHeaderSize(
238 version, creator_.GetDestinationConnectionIdLength(),
239 creator_.GetSourceConnectionIdLength(),
240 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
241 !kIncludeDiversificationNonce,
242 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
243 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
244 QuicPacketCreatorPeer::GetLengthLength(&creator_));
245 }
246
247 // Returns the number of bytes of overhead that will be added to a packet
248 // of maximum length.
249 size_t GetEncryptionOverhead() {
250 return creator_.max_packet_length() -
251 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
252 }
253
254 // Returns the number of bytes consumed by the non-data fields of a stream
255 // frame, assuming it is the last frame in the packet
256 size_t GetStreamFrameOverhead(QuicTransportVersion version) {
257 return QuicFramer::GetMinStreamFrameSize(
258 version, GetNthClientInitiatedStreamId(1), kOffset, true,
259 /* data_length= */ 0);
260 }
261
QUICHE teama6ef0a62019-03-07 20:34:33 -0500262 bool IsDefaultTestConfiguration() {
263 TestParams p = GetParam();
264 return p.version == AllSupportedVersions()[0] && p.version_serialization;
265 }
266
267 QuicStreamId GetNthClientInitiatedStreamId(int n) const {
dschinazi552accc2019-06-17 17:07:34 -0700268 return QuicUtils::GetFirstBidirectionalStreamId(
269 creator_.transport_version(), Perspective::IS_CLIENT) +
270 n * 2;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500271 }
272
QUICHE team897763c2020-04-14 08:15:58 -0700273 static constexpr QuicStreamOffset kOffset = 0u;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500274
dschinazi66dea072019-04-09 11:41:06 -0700275 char buffer_[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500276 QuicConnectionId connection_id_;
277 QuicFrames frames_;
278 QuicFramer server_framer_;
279 QuicFramer client_framer_;
280 StrictMock<MockFramerVisitor> framer_visitor_;
281 StrictMock<MockPacketCreatorDelegate> delegate_;
vasilvvc48c8712019-03-11 13:38:16 -0700282 std::string data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500283 struct iovec iov_;
284 TestPacketCreator creator_;
wub8a5dafa2020-05-13 12:30:17 -0700285 std::unique_ptr<SerializedPacket> serialized_packet_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500286 SimpleDataProducer producer_;
287 SimpleBufferAllocator allocator_;
288};
289
290// Run all packet creator tests with all supported versions of QUIC, and with
291// and without version in the packet header, as well as doing a run for each
292// length of truncated connection id.
293INSTANTIATE_TEST_SUITE_P(QuicPacketCreatorTests,
294 QuicPacketCreatorTest,
dschinazi142051a2019-09-18 18:17:29 -0700295 ::testing::ValuesIn(GetTestParams()),
296 ::testing::PrintToStringParamName());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500297
298TEST_P(QuicPacketCreatorTest, SerializeFrames) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700299 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500300 EncryptionLevel level = static_cast<EncryptionLevel>(i);
301 creator_.set_encryption_level(level);
302 frames_.push_back(QuicFrame(new QuicAckFrame(InitAckFrame(1))));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700303 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
304 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang49523232019-05-03 06:28:22 -0700305 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800306 frames_.push_back(QuicFrame(
vasilvvc872ee42020-10-07 19:50:22 -0700307 QuicStreamFrame(stream_id, false, 0u, absl::string_view())));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700308 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500309 SerializedPacket serialized = SerializeAllFrames(frames_);
310 EXPECT_EQ(level, serialized.encryption_level);
311 delete frames_[0].ack_frame;
312 frames_.clear();
313
314 {
315 InSequence s;
316 EXPECT_CALL(framer_visitor_, OnPacket());
317 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
318 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -0800319 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500320 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
321 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _))
322 .WillOnce(Return(true));
323 EXPECT_CALL(framer_visitor_,
324 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
325 .WillOnce(Return(true));
326 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(QuicPacketNumber(1)))
327 .WillOnce(Return(true));
fayang49523232019-05-03 06:28:22 -0700328 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700329 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700330 }
nharperc32d8ab2019-10-09 11:09:06 -0700331 if (client_framer_.version().HasHeaderProtection()) {
332 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_))
333 .Times(testing::AnyNumber());
334 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500335 EXPECT_CALL(framer_visitor_, OnPacketComplete());
336 }
337 ProcessPacket(serialized);
338 }
339}
340
QUICHE teama6ef0a62019-03-07 20:34:33 -0500341TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
wub8a5dafa2020-05-13 12:30:17 -0700342 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
343 creator_.transport_version(), QUIC_NO_ERROR, "error",
344 /*transport_close_frame_type=*/0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500345
346 QuicFrames frames;
wub8a5dafa2020-05-13 12:30:17 -0700347 frames.push_back(QuicFrame(frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500348 SerializedPacket serialized = SerializeAllFrames(frames);
QUICHE team6987b4a2019-03-15 16:23:04 -0700349 EXPECT_EQ(ENCRYPTION_INITIAL, serialized.encryption_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500350 ASSERT_EQ(QuicPacketNumber(1u), serialized.packet_number);
351 ASSERT_EQ(QuicPacketNumber(1u), creator_.packet_number());
352
353 InSequence s;
354 EXPECT_CALL(framer_visitor_, OnPacket());
355 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
356 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -0800357 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500358 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
359 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
360 EXPECT_CALL(framer_visitor_, OnPacketComplete());
361
362 ProcessPacket(serialized);
363}
364
fayang62b637b2019-09-16 08:40:49 -0700365TEST_P(QuicPacketCreatorTest, ConsumeCryptoDataToFillCurrentPacket) {
vasilvvc48c8712019-03-11 13:38:16 -0700366 std::string data = "crypto data";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500367 QuicFrame frame;
fayang62b637b2019-09-16 08:40:49 -0700368 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
369 ENCRYPTION_INITIAL, data.length(), 0,
370 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500371 EXPECT_EQ(frame.crypto_frame->data_length, data.length());
372 EXPECT_TRUE(creator_.HasPendingFrames());
373}
374
fayang62b637b2019-09-16 08:40:49 -0700375TEST_P(QuicPacketCreatorTest, ConsumeDataToFillCurrentPacket) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700376 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500377 QuicFrame frame;
378 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700379 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
380 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700381 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
382 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
383 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500384 size_t consumed = frame.stream_frame.data_length;
385 EXPECT_EQ(4u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700386 CheckStreamFrame(frame, stream_id, "test", 0u, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500387 EXPECT_TRUE(creator_.HasPendingFrames());
388}
389
390TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
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, true, 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, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 EXPECT_TRUE(creator_.HasPendingFrames());
403}
404
405TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
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;
QUICHE teamdc41bf12019-03-20 12:58:42 -0700408 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
409 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -0700410 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
411 stream_id, nullptr, 0u, 0u, 0u, 0u, true, false, NOT_RETRANSMISSION,
412 &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500413 size_t consumed = frame.stream_frame.data_length;
414 EXPECT_EQ(0u, consumed);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700415 CheckStreamFrame(frame, stream_id, std::string(), 0u, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500416 EXPECT_TRUE(creator_.HasPendingFrames());
417}
418
419TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
420 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
421 const size_t overhead =
422 GetPacketHeaderOverhead(client_framer_.transport_version()) +
423 GetEncryptionOverhead();
QUICHE team2252b702019-05-14 23:55:14 -0400424 for (size_t i = overhead + QuicPacketCreator::MinPlaintextPacketSize(
425 client_framer_.version());
nharper55fa6132019-05-07 19:37:21 -0700426 i < overhead + 100; ++i) {
427 SCOPED_TRACE(i);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500428 creator_.SetMaxPacketLength(i);
429 const bool should_have_room =
430 i >
431 overhead + GetStreamFrameOverhead(client_framer_.transport_version());
432 ASSERT_EQ(should_have_room,
433 creator_.HasRoomForStreamFrame(GetNthClientInitiatedStreamId(1),
434 kOffset, /* data_size=*/0xffff));
435 if (should_have_room) {
436 QuicFrame frame;
437 MakeIOVector("testdata", &iov_);
438 EXPECT_CALL(delegate_, OnSerializedPacket(_))
439 .WillRepeatedly(Invoke(
440 this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
fayang62b637b2019-09-16 08:40:49 -0700441 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
442 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u,
443 kOffset, false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500444 size_t bytes_consumed = frame.stream_frame.data_length;
445 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700446 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500447 }
448 }
449}
450
451TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
452 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
453 // Compute the total overhead for a single frame in packet.
454 const size_t overhead =
455 GetPacketHeaderOverhead(client_framer_.transport_version()) +
456 GetEncryptionOverhead() +
457 GetStreamFrameOverhead(client_framer_.transport_version());
458 size_t capacity = kDefaultMaxPacketSize - overhead;
459 // Now, test various sizes around this size.
460 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700461 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500462 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
463 QuicFrame frame;
464 MakeIOVector(data, &iov_);
fayang62b637b2019-09-16 08:40:49 -0700465 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
466 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
467 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500468
469 // BytesFree() returns bytes available for the next frame, which will
470 // be two bytes smaller since the stream frame would need to be grown.
471 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
472 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
473 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
474 EXPECT_CALL(delegate_, OnSerializedPacket(_))
475 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700476 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -0700477 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500478 DeleteSerializedPacket();
479 }
480}
481
482TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
ianswette28f0222019-04-04 13:31:22 -0700483 // This test serializes crypto payloads slightly larger than a packet, which
484 // Causes the multi-packet ClientHello check to fail.
danzh88e3e052019-06-13 11:47:18 -0700485 SetQuicFlag(FLAGS_quic_enforce_single_packet_chlo, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500486 // Compute the total overhead for a single frame in packet.
QUICHE teamdc41bf12019-03-20 12:58:42 -0700487 size_t overhead =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500488 GetPacketHeaderOverhead(client_framer_.transport_version()) +
QUICHE teamdc41bf12019-03-20 12:58:42 -0700489 GetEncryptionOverhead();
490 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
dschinazi66dea072019-04-09 11:41:06 -0700491 overhead +=
492 QuicFramer::GetMinCryptoFrameSize(kOffset, kMaxOutgoingPacketSize);
QUICHE teamdc41bf12019-03-20 12:58:42 -0700493 } else {
494 overhead += GetStreamFrameOverhead(client_framer_.transport_version());
495 }
dschinazi66dea072019-04-09 11:41:06 -0700496 ASSERT_GT(kMaxOutgoingPacketSize, overhead);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500497 size_t capacity = kDefaultMaxPacketSize - overhead;
498 // Now, test various sizes around this size.
499 for (int delta = -5; delta <= 5; ++delta) {
QUICHE teamdc41bf12019-03-20 12:58:42 -0700500 SCOPED_TRACE(delta);
vasilvvc48c8712019-03-11 13:38:16 -0700501 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500502 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
503
504 QuicFrame frame;
505 MakeIOVector(data, &iov_);
506 EXPECT_CALL(delegate_, OnSerializedPacket(_))
507 .WillRepeatedly(
508 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayangfe77c032020-08-24 18:21:32 -0700509 if (client_framer_.version().CanSendCoalescedPackets()) {
fayang15042962020-07-01 12:14:29 -0700510 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
511 .WillRepeatedly(Return(COALESCE));
512 }
QUICHE teamdc41bf12019-03-20 12:58:42 -0700513 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
fayang62b637b2019-09-16 08:40:49 -0700514 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -0700515 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
516 &iov_, 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
517 &frame));
518 size_t bytes_consumed = frame.stream_frame.data_length;
519 EXPECT_LT(0u, bytes_consumed);
520 } else {
521 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
fayang62b637b2019-09-16 08:40:49 -0700522 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
nharper51961cf2019-05-13 13:23:24 -0700523 ENCRYPTION_INITIAL, data.length(), kOffset,
524 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
QUICHE teamdc41bf12019-03-20 12:58:42 -0700525 size_t bytes_consumed = frame.crypto_frame->data_length;
526 EXPECT_LT(0u, bytes_consumed);
527 }
fayang62b637b2019-09-16 08:40:49 -0700528 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -0700529 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500530 // If there is not enough space in the packet to fit a padding frame
531 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
532 // will not be padded.
fayang58f71072019-11-05 08:47:02 -0800533 // Padding is skipped when we try to send coalesced packets.
534 if ((bytes_free < 3 &&
535 !QuicVersionUsesCryptoFrames(client_framer_.transport_version())) ||
536 client_framer_.version().CanSendCoalescedPackets()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500537 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
wub8a5dafa2020-05-13 12:30:17 -0700538 serialized_packet_->encrypted_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500539 } else {
wub8a5dafa2020-05-13 12:30:17 -0700540 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_->encrypted_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500541 }
542 DeleteSerializedPacket();
543 }
544}
545
546TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
547 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
548 // Compute the total overhead for a single frame in packet.
549 const size_t overhead =
550 GetPacketHeaderOverhead(client_framer_.transport_version()) +
551 GetEncryptionOverhead() +
552 GetStreamFrameOverhead(client_framer_.transport_version());
553 ASSERT_GT(kDefaultMaxPacketSize, overhead);
554 size_t capacity = kDefaultMaxPacketSize - overhead;
555 // Now, test various sizes around this size.
556 for (int delta = -5; delta <= 5; ++delta) {
vasilvvc48c8712019-03-11 13:38:16 -0700557 std::string data(capacity + delta, 'A');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500558 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
559
560 QuicFrame frame;
561 MakeIOVector(data, &iov_);
562 EXPECT_CALL(delegate_, OnSerializedPacket(_))
563 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -0700564 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
565 GetNthClientInitiatedStreamId(1), &iov_, 1u, iov_.iov_len, 0u, kOffset,
566 false, false, NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500567 size_t bytes_consumed = frame.stream_frame.data_length;
568 EXPECT_LT(0u, bytes_consumed);
fayang62b637b2019-09-16 08:40:49 -0700569 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -0700570 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500571 if (bytes_free > 0) {
572 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
wub8a5dafa2020-05-13 12:30:17 -0700573 serialized_packet_->encrypted_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500574 } else {
wub8a5dafa2020-05-13 12:30:17 -0700575 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_->encrypted_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500576 }
577 DeleteSerializedPacket();
578 }
579}
580
renjietang4c704c82019-10-07 16:39:11 -0700581// Test that the path challenge connectivity probing packet is serialized
582// correctly as a padded PATH CHALLENGE packet.
583TEST_P(QuicPacketCreatorTest, BuildPathChallengePacket) {
584 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
585 // This frame is only for IETF QUIC.
586 return;
587 }
588
589 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700590 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700591 header.reset_flag = false;
592 header.version_flag = false;
593 header.packet_number = kPacketNumber;
danzh28ba4722020-11-12 11:55:39 -0800594 MockRandom randomizer;
renjietang4c704c82019-10-07 16:39:11 -0700595 QuicPathFrameBuffer payload;
danzh28ba4722020-11-12 11:55:39 -0800596 randomizer.RandBytes(payload.data(), payload.size());
renjietang4c704c82019-10-07 16:39:11 -0700597
598 // clang-format off
599 unsigned char packet[] = {
600 // type (short header, 4 byte packet number)
601 0x43,
602 // connection_id
603 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
604 // packet number
605 0x12, 0x34, 0x56, 0x78,
606
607 // Path Challenge Frame type (IETF_PATH_CHALLENGE)
608 0x1a,
609 // 8 "random" bytes, MockRandom makes lots of r's
610 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r',
611 // frame type (padding frame)
612 0x00,
613 0x00, 0x00, 0x00, 0x00
614 };
615 // clang-format on
616
617 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
renjietang4c704c82019-10-07 16:39:11 -0700618
619 size_t length = creator_.BuildPaddedPathChallengePacket(
danzh28ba4722020-11-12 11:55:39 -0800620 header, buffer.get(), ABSL_ARRAYSIZE(packet), payload,
renjietang4c704c82019-10-07 16:39:11 -0700621 ENCRYPTION_INITIAL);
vasilvvbed67c62020-10-20 06:38:43 -0700622 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700623
624 // Payload has the random bytes that were generated. Copy them into packet,
625 // above, before checking that the generated packet is correct.
626 EXPECT_EQ(kQuicPathFrameBufferSize, payload.size());
627
628 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
629 header);
630
dmcardle8f7df532020-01-07 13:28:57 -0800631 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700632 "constructed packet", data.data(), data.length(),
vasilvvbed67c62020-10-20 06:38:43 -0700633 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700634}
635
636TEST_P(QuicPacketCreatorTest, BuildConnectivityProbingPacket) {
637 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700638 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700639 header.reset_flag = false;
640 header.version_flag = false;
641 header.packet_number = kPacketNumber;
642
643 // clang-format off
644 unsigned char packet[] = {
645 // public flags (8 byte connection_id)
646 0x2C,
647 // connection_id
648 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
649 // packet number
650 0x12, 0x34, 0x56, 0x78,
651
652 // frame type (ping frame)
653 0x07,
654 // frame type (padding frame)
655 0x00,
656 0x00, 0x00, 0x00, 0x00
657 };
658
659 unsigned char packet46[] = {
660 // type (short header, 4 byte packet number)
661 0x43,
662 // connection_id
663 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
664 // packet number
665 0x12, 0x34, 0x56, 0x78,
666
667 // frame type
668 0x07,
669 // frame type (padding frame)
670 0x00,
671 0x00, 0x00, 0x00, 0x00
672 };
673
674 unsigned char packet99[] = {
675 // type (short header, 4 byte packet number)
676 0x43,
677 // connection_id
678 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
679 // packet number
680 0x12, 0x34, 0x56, 0x78,
681
682 // frame type (IETF_PING frame)
683 0x01,
684 // frame type (padding frame)
685 0x00,
686 0x00, 0x00, 0x00, 0x00
687 };
688 // clang-format on
689
690 unsigned char* p = packet;
vasilvvbed67c62020-10-20 06:38:43 -0700691 size_t packet_size = ABSL_ARRAYSIZE(packet);
dschinazi5c1d7d82020-07-29 16:42:50 -0700692 if (creator_.version().HasIetfQuicFrames()) {
renjietang4c704c82019-10-07 16:39:11 -0700693 p = packet99;
vasilvvbed67c62020-10-20 06:38:43 -0700694 packet_size = ABSL_ARRAYSIZE(packet99);
dschinazi5c1d7d82020-07-29 16:42:50 -0700695 } else if (creator_.version().HasIetfInvariantHeader()) {
renjietang4c704c82019-10-07 16:39:11 -0700696 p = packet46;
vasilvvbed67c62020-10-20 06:38:43 -0700697 packet_size = ABSL_ARRAYSIZE(packet46);
renjietang4c704c82019-10-07 16:39:11 -0700698 }
699
700 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
701
702 size_t length = creator_.BuildConnectivityProbingPacket(
703 header, buffer.get(), packet_size, ENCRYPTION_INITIAL);
704
705 EXPECT_NE(0u, length);
706 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
707 header);
708
dmcardle8f7df532020-01-07 13:28:57 -0800709 quiche::test::CompareCharArraysWithHexError(
710 "constructed packet", data.data(), data.length(),
711 reinterpret_cast<char*>(p), packet_size);
renjietang4c704c82019-10-07 16:39:11 -0700712}
713
714// Several tests that the path response connectivity probing packet is
715// serialized correctly as either a padded and unpadded PATH RESPONSE
716// packet. Also generates packets with 1 and 3 PATH_RESPONSES in them to
717// exercised the single- and multiple- payload cases.
718TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponseUnpadded) {
719 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
720 // This frame is only for IETF QUIC.
721 return;
722 }
723
724 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700725 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700726 header.reset_flag = false;
727 header.version_flag = false;
728 header.packet_number = kPacketNumber;
729 QuicPathFrameBuffer payload0 = {
730 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
731
732 // Build 1 PATH RESPONSE, not padded
733 // clang-format off
734 unsigned char packet[] = {
735 // type (short header, 4 byte packet number)
736 0x43,
737 // connection_id
738 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
739 // packet number
740 0x12, 0x34, 0x56, 0x78,
741
742 // Path Response Frame type (IETF_PATH_RESPONSE)
743 0x1b,
744 // 8 "random" bytes
745 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
746 };
747 // clang-format on
748 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
wuba750aab2020-02-10 06:43:15 -0800749 QuicCircularDeque<QuicPathFrameBuffer> payloads;
renjietang4c704c82019-10-07 16:39:11 -0700750 payloads.push_back(payload0);
751 size_t length = creator_.BuildPathResponsePacket(
vasilvvbed67c62020-10-20 06:38:43 -0700752 header, buffer.get(), ABSL_ARRAYSIZE(packet), payloads,
renjietang4c704c82019-10-07 16:39:11 -0700753 /*is_padded=*/false, ENCRYPTION_INITIAL);
vasilvvbed67c62020-10-20 06:38:43 -0700754 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700755 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
756 header);
757
dmcardle8f7df532020-01-07 13:28:57 -0800758 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700759 "constructed packet", data.data(), data.length(),
vasilvvbed67c62020-10-20 06:38:43 -0700760 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700761}
762
763TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket1ResponsePadded) {
764 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
765 // This frame is only for IETF QUIC.
766 return;
767 }
768
769 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700770 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700771 header.reset_flag = false;
772 header.version_flag = false;
773 header.packet_number = kPacketNumber;
774 QuicPathFrameBuffer payload0 = {
775 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
776
777 // Build 1 PATH RESPONSE, padded
778 // clang-format off
779 unsigned char packet[] = {
780 // type (short header, 4 byte packet number)
781 0x43,
782 // connection_id
783 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
784 // packet number
785 0x12, 0x34, 0x56, 0x78,
786
787 // Path Response Frame type (IETF_PATH_RESPONSE)
788 0x1b,
789 // 8 "random" bytes
790 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
791 // Padding type and pad
792 0x00, 0x00, 0x00, 0x00, 0x00
793 };
794 // clang-format on
795 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
wuba750aab2020-02-10 06:43:15 -0800796 QuicCircularDeque<QuicPathFrameBuffer> payloads;
renjietang4c704c82019-10-07 16:39:11 -0700797 payloads.push_back(payload0);
798 size_t length = creator_.BuildPathResponsePacket(
vasilvvbed67c62020-10-20 06:38:43 -0700799 header, buffer.get(), ABSL_ARRAYSIZE(packet), payloads,
renjietang4c704c82019-10-07 16:39:11 -0700800 /*is_padded=*/true, ENCRYPTION_INITIAL);
vasilvvbed67c62020-10-20 06:38:43 -0700801 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700802 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
803 header);
804
dmcardle8f7df532020-01-07 13:28:57 -0800805 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700806 "constructed packet", data.data(), data.length(),
vasilvvbed67c62020-10-20 06:38:43 -0700807 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700808}
809
810TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesUnpadded) {
811 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
812 // This frame is only for IETF QUIC.
813 return;
814 }
815
816 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700817 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700818 header.reset_flag = false;
819 header.version_flag = false;
820 header.packet_number = kPacketNumber;
821 QuicPathFrameBuffer payload0 = {
822 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
823 QuicPathFrameBuffer payload1 = {
824 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
825 QuicPathFrameBuffer payload2 = {
826 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
827
828 // Build one packet with 3 PATH RESPONSES, no padding
829 // clang-format off
830 unsigned char packet[] = {
831 // type (short header, 4 byte packet number)
832 0x43,
833 // connection_id
834 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
835 // packet number
836 0x12, 0x34, 0x56, 0x78,
837
838 // 3 path response frames (IETF_PATH_RESPONSE type byte and payload)
839 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
840 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
841 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
842 };
843 // clang-format on
844
845 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
wuba750aab2020-02-10 06:43:15 -0800846 QuicCircularDeque<QuicPathFrameBuffer> payloads;
renjietang4c704c82019-10-07 16:39:11 -0700847 payloads.push_back(payload0);
848 payloads.push_back(payload1);
849 payloads.push_back(payload2);
850 size_t length = creator_.BuildPathResponsePacket(
vasilvvbed67c62020-10-20 06:38:43 -0700851 header, buffer.get(), ABSL_ARRAYSIZE(packet), payloads,
renjietang4c704c82019-10-07 16:39:11 -0700852 /*is_padded=*/false, ENCRYPTION_INITIAL);
vasilvvbed67c62020-10-20 06:38:43 -0700853 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700854 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
855 header);
856
dmcardle8f7df532020-01-07 13:28:57 -0800857 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700858 "constructed packet", data.data(), data.length(),
vasilvvbed67c62020-10-20 06:38:43 -0700859 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700860}
861
862TEST_P(QuicPacketCreatorTest, BuildPathResponsePacket3ResponsesPadded) {
863 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
864 // This frame is only for IETF QUIC.
865 return;
866 }
867
868 QuicPacketHeader header;
dschinazi423adc72019-10-23 09:58:55 -0700869 header.destination_connection_id = CreateTestConnectionId();
renjietang4c704c82019-10-07 16:39:11 -0700870 header.reset_flag = false;
871 header.version_flag = false;
872 header.packet_number = kPacketNumber;
873 QuicPathFrameBuffer payload0 = {
874 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}};
875 QuicPathFrameBuffer payload1 = {
876 {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}};
877 QuicPathFrameBuffer payload2 = {
878 {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28}};
879
880 // Build one packet with 3 PATH RESPONSES, with padding
881 // clang-format off
882 unsigned char packet[] = {
883 // type (short header, 4 byte packet number)
884 0x43,
885 // connection_id
886 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
887 // packet number
888 0x12, 0x34, 0x56, 0x78,
889
890 // 3 path response frames (IETF_PATH_RESPONSE byte and payload)
891 0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
892 0x1b, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
893 0x1b, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
894 // Padding
895 0x00, 0x00, 0x00, 0x00, 0x00
896 };
897 // clang-format on
898
899 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
wuba750aab2020-02-10 06:43:15 -0800900 QuicCircularDeque<QuicPathFrameBuffer> payloads;
renjietang4c704c82019-10-07 16:39:11 -0700901 payloads.push_back(payload0);
902 payloads.push_back(payload1);
903 payloads.push_back(payload2);
904 size_t length = creator_.BuildPathResponsePacket(
vasilvvbed67c62020-10-20 06:38:43 -0700905 header, buffer.get(), ABSL_ARRAYSIZE(packet), payloads,
renjietang4c704c82019-10-07 16:39:11 -0700906 /*is_padded=*/true, ENCRYPTION_INITIAL);
vasilvvbed67c62020-10-20 06:38:43 -0700907 EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700908 QuicPacket data(creator_.transport_version(), buffer.release(), length, true,
909 header);
910
dmcardle8f7df532020-01-07 13:28:57 -0800911 quiche::test::CompareCharArraysWithHexError(
renjietang4c704c82019-10-07 16:39:11 -0700912 "constructed packet", data.data(), data.length(),
vasilvvbed67c62020-10-20 06:38:43 -0700913 reinterpret_cast<char*>(packet), ABSL_ARRAYSIZE(packet));
renjietang4c704c82019-10-07 16:39:11 -0700914}
915
QUICHE teama6ef0a62019-03-07 20:34:33 -0500916TEST_P(QuicPacketCreatorTest, SerializeConnectivityProbingPacket) {
dschinazi1c6e5922020-06-19 10:35:03 -0700917 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500918
dschinazi1c6e5922020-06-19 10:35:03 -0700919 std::unique_ptr<SerializedPacket> encrypted;
920 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
921 QuicPathFrameBuffer payload = {
922 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
923 encrypted =
danzh28ba4722020-11-12 11:55:39 -0800924 creator_.SerializePathChallengeConnectivityProbingPacket(payload);
dschinazi1c6e5922020-06-19 10:35:03 -0700925 } else {
926 encrypted = creator_.SerializeConnectivityProbingPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500927 }
dschinazi1c6e5922020-06-19 10:35:03 -0700928 {
929 InSequence s;
930 EXPECT_CALL(framer_visitor_, OnPacket());
931 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
932 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -0800933 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
dschinazi1c6e5922020-06-19 10:35:03 -0700934 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
935 if (VersionHasIetfQuicFrames(creator_.transport_version())) {
936 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
937 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
938 } else {
939 EXPECT_CALL(framer_visitor_, OnPingFrame(_));
940 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
941 }
942 EXPECT_CALL(framer_visitor_, OnPacketComplete());
943 }
944 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
945 server_framer_.ProcessPacket(QuicEncryptedPacket(
946 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500947}
948
949TEST_P(QuicPacketCreatorTest, SerializePathChallengeProbePacket) {
renjietang4c704c82019-10-07 16:39:11 -0700950 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500951 return;
952 }
953 QuicPathFrameBuffer payload = {
954 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
955
dschinazi1c6e5922020-06-19 10:35:03 -0700956 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500957
dschinazi1c6e5922020-06-19 10:35:03 -0700958 std::unique_ptr<SerializedPacket> encrypted(
danzh28ba4722020-11-12 11:55:39 -0800959 creator_.SerializePathChallengeConnectivityProbingPacket(payload));
dschinazi1c6e5922020-06-19 10:35:03 -0700960 {
961 InSequence s;
962 EXPECT_CALL(framer_visitor_, OnPacket());
963 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
964 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -0800965 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
dschinazi1c6e5922020-06-19 10:35:03 -0700966 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
967 EXPECT_CALL(framer_visitor_, OnPathChallengeFrame(_));
968 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
969 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500970 }
dschinazi1c6e5922020-06-19 10:35:03 -0700971 // QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
972 server_framer_.ProcessPacket(QuicEncryptedPacket(
973 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500974}
975
976TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket1PayloadPadded) {
renjietang4c704c82019-10-07 16:39:11 -0700977 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500978 return;
979 }
980 QuicPathFrameBuffer payload0 = {
981 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
982
dschinazi1c6e5922020-06-19 10:35:03 -0700983 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500984
dschinazi1c6e5922020-06-19 10:35:03 -0700985 QuicCircularDeque<QuicPathFrameBuffer> payloads;
986 payloads.push_back(payload0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500987
dschinazi1c6e5922020-06-19 10:35:03 -0700988 std::unique_ptr<SerializedPacket> encrypted(
989 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
990 {
991 InSequence s;
992 EXPECT_CALL(framer_visitor_, OnPacket());
993 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
994 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -0800995 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
dschinazi1c6e5922020-06-19 10:35:03 -0700996 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
997 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
998 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
999 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001000 }
dschinazi1c6e5922020-06-19 10:35:03 -07001001 server_framer_.ProcessPacket(QuicEncryptedPacket(
1002 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001003}
1004
1005TEST_P(QuicPacketCreatorTest,
1006 SerializePathResponseProbePacket1PayloadUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001007 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001008 return;
1009 }
1010 QuicPathFrameBuffer payload0 = {
1011 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1012
dschinazi1c6e5922020-06-19 10:35:03 -07001013 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001014
dschinazi1c6e5922020-06-19 10:35:03 -07001015 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1016 payloads.push_back(payload0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001017
dschinazi1c6e5922020-06-19 10:35:03 -07001018 std::unique_ptr<SerializedPacket> encrypted(
1019 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
1020 {
1021 InSequence s;
1022 EXPECT_CALL(framer_visitor_, OnPacket());
1023 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1024 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001025 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
dschinazi1c6e5922020-06-19 10:35:03 -07001026 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1027 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_));
1028 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001029 }
dschinazi1c6e5922020-06-19 10:35:03 -07001030 server_framer_.ProcessPacket(QuicEncryptedPacket(
1031 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001032}
1033
1034TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket2PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001035 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001036 return;
1037 }
1038 QuicPathFrameBuffer payload0 = {
1039 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1040 QuicPathFrameBuffer payload1 = {
1041 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1042
dschinazi1c6e5922020-06-19 10:35:03 -07001043 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001044
dschinazi1c6e5922020-06-19 10:35:03 -07001045 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1046 payloads.push_back(payload0);
1047 payloads.push_back(payload1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001048
dschinazi1c6e5922020-06-19 10:35:03 -07001049 std::unique_ptr<SerializedPacket> encrypted(
1050 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
1051 {
1052 InSequence s;
1053 EXPECT_CALL(framer_visitor_, OnPacket());
1054 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1055 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001056 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
dschinazi1c6e5922020-06-19 10:35:03 -07001057 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1058 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1059 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1060 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001061 }
dschinazi1c6e5922020-06-19 10:35:03 -07001062 server_framer_.ProcessPacket(QuicEncryptedPacket(
1063 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001064}
1065
1066TEST_P(QuicPacketCreatorTest,
1067 SerializePathResponseProbePacket2PayloadsUnPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001068 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001069 return;
1070 }
1071 QuicPathFrameBuffer payload0 = {
1072 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1073 QuicPathFrameBuffer payload1 = {
1074 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1075
dschinazi1c6e5922020-06-19 10:35:03 -07001076 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001077
dschinazi1c6e5922020-06-19 10:35:03 -07001078 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1079 payloads.push_back(payload0);
1080 payloads.push_back(payload1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001081
dschinazi1c6e5922020-06-19 10:35:03 -07001082 std::unique_ptr<SerializedPacket> encrypted(
1083 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
1084 {
1085 InSequence s;
1086 EXPECT_CALL(framer_visitor_, OnPacket());
1087 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1088 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001089 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
dschinazi1c6e5922020-06-19 10:35:03 -07001090 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1091 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(2);
1092 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001093 }
dschinazi1c6e5922020-06-19 10:35:03 -07001094 server_framer_.ProcessPacket(QuicEncryptedPacket(
1095 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001096}
1097
1098TEST_P(QuicPacketCreatorTest, SerializePathResponseProbePacket3PayloadsPadded) {
renjietang4c704c82019-10-07 16:39:11 -07001099 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001100 return;
1101 }
1102 QuicPathFrameBuffer payload0 = {
1103 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1104 QuicPathFrameBuffer payload1 = {
1105 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1106 QuicPathFrameBuffer payload2 = {
1107 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1108
dschinazi1c6e5922020-06-19 10:35:03 -07001109 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001110
dschinazi1c6e5922020-06-19 10:35:03 -07001111 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1112 payloads.push_back(payload0);
1113 payloads.push_back(payload1);
1114 payloads.push_back(payload2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001115
dschinazi1c6e5922020-06-19 10:35:03 -07001116 std::unique_ptr<SerializedPacket> encrypted(
1117 creator_.SerializePathResponseConnectivityProbingPacket(payloads, true));
1118 {
1119 InSequence s;
1120 EXPECT_CALL(framer_visitor_, OnPacket());
1121 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1122 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001123 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
dschinazi1c6e5922020-06-19 10:35:03 -07001124 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1125 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1126 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1127 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001128 }
dschinazi1c6e5922020-06-19 10:35:03 -07001129 server_framer_.ProcessPacket(QuicEncryptedPacket(
1130 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001131}
1132
1133TEST_P(QuicPacketCreatorTest,
1134 SerializePathResponseProbePacket3PayloadsUnpadded) {
renjietang4c704c82019-10-07 16:39:11 -07001135 if (!VersionHasIetfQuicFrames(creator_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001136 return;
1137 }
1138 QuicPathFrameBuffer payload0 = {
1139 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee}};
1140 QuicPathFrameBuffer payload1 = {
1141 {0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde}};
1142 QuicPathFrameBuffer payload2 = {
1143 {0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xee, 0xde, 0xad}};
1144
dschinazi1c6e5922020-06-19 10:35:03 -07001145 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001146
dschinazi1c6e5922020-06-19 10:35:03 -07001147 QuicCircularDeque<QuicPathFrameBuffer> payloads;
1148 payloads.push_back(payload0);
1149 payloads.push_back(payload1);
1150 payloads.push_back(payload2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001151
dschinazi1c6e5922020-06-19 10:35:03 -07001152 std::unique_ptr<SerializedPacket> encrypted(
1153 creator_.SerializePathResponseConnectivityProbingPacket(payloads, false));
1154 InSequence s;
1155 EXPECT_CALL(framer_visitor_, OnPacket());
1156 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1157 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001158 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
dschinazi1c6e5922020-06-19 10:35:03 -07001159 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1160 EXPECT_CALL(framer_visitor_, OnPathResponseFrame(_)).Times(3);
1161 EXPECT_CALL(framer_visitor_, OnPacketComplete());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001162
dschinazi1c6e5922020-06-19 10:35:03 -07001163 server_framer_.ProcessPacket(QuicEncryptedPacket(
1164 encrypted->encrypted_buffer, encrypted->encrypted_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001165}
1166
1167TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
dschinazicc7d40d2020-12-02 11:28:18 -08001168 if (creator_.version().HasIetfInvariantHeader() &&
fayang3ac15c12019-06-14 14:04:51 -07001169 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001170 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1171 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1172 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1173 } else {
1174 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1175 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1176 }
1177
1178 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64);
1179 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1180 10000 / kDefaultMaxPacketSize);
1181 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1182 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1183
1184 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256);
1185 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1186 10000 / kDefaultMaxPacketSize);
1187 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1188 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1189
1190 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256);
1191 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1192 10000 / kDefaultMaxPacketSize);
1193 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1194 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1195
1196 QuicPacketCreatorPeer::SetPacketNumber(&creator_,
1197 UINT64_C(64) * 256 * 256 * 256 * 256);
1198 creator_.UpdatePacketNumberLength(QuicPacketNumber(2),
1199 10000 / kDefaultMaxPacketSize);
1200 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1201 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1202}
1203
1204TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
1205 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
dschinazicc7d40d2020-12-02 11:28:18 -08001206 if (creator_.version().HasIetfInvariantHeader() &&
fayang3ac15c12019-06-14 14:04:51 -07001207 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001208 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1209 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1210 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1211 } else {
1212 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1213 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1214 }
1215
1216 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1217 10000 / kDefaultMaxPacketSize);
1218 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1219 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1220
1221 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1222 10000 * 256 / kDefaultMaxPacketSize);
1223 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1224 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1225
1226 creator_.UpdatePacketNumberLength(QuicPacketNumber(1),
1227 10000 * 256 * 256 / kDefaultMaxPacketSize);
1228 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1229 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1230
1231 creator_.UpdatePacketNumberLength(
1232 QuicPacketNumber(1),
1233 UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
1234 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER,
1235 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1236}
1237
fayang4c1c2362019-09-13 07:20:01 -07001238TEST_P(QuicPacketCreatorTest, SkipNPacketNumbers) {
1239 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
dschinazicc7d40d2020-12-02 11:28:18 -08001240 if (creator_.version().HasIetfInvariantHeader() &&
fayang4c1c2362019-09-13 07:20:01 -07001241 !GetParam().version.SendsVariableLengthPacketNumberInLongHeader()) {
1242 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1243 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1244 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1245 } else {
1246 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1247 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1248 }
1249 creator_.SkipNPacketNumbers(63, QuicPacketNumber(2),
1250 10000 / kDefaultMaxPacketSize);
1251 EXPECT_EQ(QuicPacketNumber(64), creator_.packet_number());
1252 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
1253 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1254
1255 creator_.SkipNPacketNumbers(64 * 255, QuicPacketNumber(2),
1256 10000 / kDefaultMaxPacketSize);
1257 EXPECT_EQ(QuicPacketNumber(64 * 256), creator_.packet_number());
1258 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER,
1259 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1260
1261 creator_.SkipNPacketNumbers(64 * 256 * 255, QuicPacketNumber(2),
1262 10000 / kDefaultMaxPacketSize);
1263 EXPECT_EQ(QuicPacketNumber(64 * 256 * 256), creator_.packet_number());
1264 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
1265 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
1266}
1267
QUICHE teama6ef0a62019-03-07 20:34:33 -05001268TEST_P(QuicPacketCreatorTest, SerializeFrame) {
1269 if (!GetParam().version_serialization) {
1270 creator_.StopSendingVersion();
1271 }
nharper55fa6132019-05-07 19:37:21 -07001272 std::string data("test data");
1273 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1274 QuicStreamFrame stream_frame(
1275 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
vasilvvc872ee42020-10-07 19:50:22 -07001276 /*fin=*/false, 0u, absl::string_view());
nharper55fa6132019-05-07 19:37:21 -07001277 frames_.push_back(QuicFrame(stream_frame));
1278 } else {
1279 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1280 frames_.push_back(
1281 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1282 }
1283 SerializedPacket serialized = SerializeAllFrames(frames_);
1284
1285 QuicPacketHeader header;
1286 {
1287 InSequence s;
1288 EXPECT_CALL(framer_visitor_, OnPacket());
1289 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1290 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001291 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
nharper55fa6132019-05-07 19:37:21 -07001292 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1293 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
1294 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1295 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1296 } else {
1297 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1298 }
1299 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1300 }
1301 ProcessPacket(serialized);
1302 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
nharper55fa6132019-05-07 19:37:21 -07001303}
1304
1305TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
1306 if (!GetParam().version_serialization) {
1307 creator_.StopSendingVersion();
1308 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001309 std::string data("a");
1310 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1311 QuicStreamFrame stream_frame(
1312 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
vasilvvc872ee42020-10-07 19:50:22 -07001313 /*fin=*/false, 0u, absl::string_view());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001314 frames_.push_back(QuicFrame(stream_frame));
1315 } else {
1316 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1317 frames_.push_back(
1318 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1319 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001320 SerializedPacket serialized = SerializeAllFrames(frames_);
1321
1322 QuicPacketHeader header;
1323 {
1324 InSequence s;
1325 EXPECT_CALL(framer_visitor_, OnPacket());
1326 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1327 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001328 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001329 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1330 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001331 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1332 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1333 } else {
1334 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1335 }
nharper55fa6132019-05-07 19:37:21 -07001336 if (client_framer_.version().HasHeaderProtection()) {
1337 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1338 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001339 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1340 }
1341 ProcessPacket(serialized);
1342 EXPECT_EQ(GetParam().version_serialization, header.version_flag);
1343}
1344
1345TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
1346 if (!GetParam().version_serialization) {
1347 creator_.StopSendingVersion();
1348 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001349 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001350 // A string larger than fits into a frame.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001351 QuicFrame frame;
ianswett3085da82019-04-04 07:24:24 -07001352 size_t payload_length = creator_.max_packet_length();
1353 const std::string too_long_payload(payload_length, 'a');
QUICHE teama6ef0a62019-03-07 20:34:33 -05001354 MakeIOVector(too_long_payload, &iov_);
1355 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1356 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001357 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1358 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001359 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1360 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, true, false,
1361 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001362 size_t consumed = frame.stream_frame.data_length;
ianswett3085da82019-04-04 07:24:24 -07001363 // The entire payload could not be consumed.
1364 EXPECT_GT(payload_length, consumed);
fayang62b637b2019-09-16 08:40:49 -07001365 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001366 DeleteSerializedPacket();
1367}
1368
1369TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
1370 if (!GetParam().version_serialization) {
1371 creator_.StopSendingVersion();
1372 }
1373 const size_t max_plaintext_size =
1374 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
1375 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001376 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
1377 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1378 client_framer_.transport_version(), Perspective::IS_CLIENT);
1379 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1380 stream_id =
1381 QuicUtils::GetCryptoStreamId(client_framer_.transport_version());
1382 }
1383 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001384 EXPECT_EQ(max_plaintext_size -
1385 GetPacketHeaderSize(
1386 client_framer_.transport_version(),
1387 creator_.GetDestinationConnectionIdLength(),
1388 creator_.GetSourceConnectionIdLength(),
1389 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1390 !kIncludeDiversificationNonce,
1391 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1392 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1393 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1394 creator_.BytesFree());
rchc76cd742019-03-26 16:00:03 -07001395 StrictMock<MockDebugDelegate> debug;
1396 creator_.set_debug_delegate(&debug);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001397
1398 // Add a variety of frame types and then a padding frame.
1399 QuicAckFrame ack_frame(InitAckFrame(10u));
rchc76cd742019-03-26 16:00:03 -07001400 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
renjietangb63005e2019-11-19 23:08:53 -08001401 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001402 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001403 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001404
1405 QuicFrame frame;
1406 MakeIOVector("test", &iov_);
rchc76cd742019-03-26 16:00:03 -07001407 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
fayang62b637b2019-09-16 08:40:49 -07001408 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1409 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1410 NOT_RETRANSMISSION, &frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001411 size_t consumed = frame.stream_frame.data_length;
1412 EXPECT_EQ(4u, consumed);
1413 EXPECT_TRUE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001414 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001415
1416 QuicPaddingFrame padding_frame;
rchc76cd742019-03-26 16:00:03 -07001417 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
renjietangb63005e2019-11-19 23:08:53 -08001418 EXPECT_TRUE(creator_.AddFrame(QuicFrame(padding_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001419 EXPECT_TRUE(creator_.HasPendingFrames());
1420 EXPECT_EQ(0u, creator_.BytesFree());
1421
1422 // Packet is full. Creator will flush.
1423 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1424 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
renjietangb63005e2019-11-19 23:08:53 -08001425 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001426
1427 // Ensure the packet is successfully created.
wub8a5dafa2020-05-13 12:30:17 -07001428 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1429 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
1430 const QuicFrames& retransmittable =
1431 serialized_packet_->retransmittable_frames;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001432 ASSERT_EQ(1u, retransmittable.size());
1433 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
wub8a5dafa2020-05-13 12:30:17 -07001434 EXPECT_TRUE(serialized_packet_->has_ack);
1435 EXPECT_EQ(QuicPacketNumber(10u), serialized_packet_->largest_acked);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001436 DeleteSerializedPacket();
1437
1438 EXPECT_FALSE(creator_.HasPendingFrames());
nharper46833c32019-05-15 21:33:05 -07001439 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001440 EXPECT_EQ(max_plaintext_size -
1441 GetPacketHeaderSize(
1442 client_framer_.transport_version(),
1443 creator_.GetDestinationConnectionIdLength(),
1444 creator_.GetSourceConnectionIdLength(),
1445 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1446 !kIncludeDiversificationNonce,
1447 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
1448 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
1449 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
1450 creator_.BytesFree());
1451}
1452
1453TEST_P(QuicPacketCreatorTest, SerializeAndSendStreamFrame) {
dschinazi1c6e5922020-06-19 10:35:03 -07001454 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001455 if (!GetParam().version_serialization) {
1456 creator_.StopSendingVersion();
1457 }
1458 EXPECT_FALSE(creator_.HasPendingFrames());
1459
1460 MakeIOVector("test", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001461 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1462 iov_.iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001463 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1464 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1465 size_t num_bytes_consumed;
rchc76cd742019-03-26 16:00:03 -07001466 StrictMock<MockDebugDelegate> debug;
1467 creator_.set_debug_delegate(&debug);
1468 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001469 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001470 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1471 NOT_RETRANSMISSION, &num_bytes_consumed);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001472 EXPECT_EQ(4u, num_bytes_consumed);
1473
1474 // Ensure the packet is successfully created.
wub8a5dafa2020-05-13 12:30:17 -07001475 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1476 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
1477 const QuicFrames& retransmittable =
1478 serialized_packet_->retransmittable_frames;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001479 ASSERT_EQ(1u, retransmittable.size());
1480 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type);
1481 DeleteSerializedPacket();
1482
1483 EXPECT_FALSE(creator_.HasPendingFrames());
1484}
1485
nharperebabffd2019-06-03 17:34:45 -07001486TEST_P(QuicPacketCreatorTest, SerializeStreamFrameWithPadding) {
1487 // Regression test to check that CreateAndSerializeStreamFrame uses a
1488 // correctly formatted stream frame header when appending padding.
1489
dschinazi1c6e5922020-06-19 10:35:03 -07001490 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
nharperebabffd2019-06-03 17:34:45 -07001491 if (!GetParam().version_serialization) {
1492 creator_.StopSendingVersion();
1493 }
1494 EXPECT_FALSE(creator_.HasPendingFrames());
1495
1496 // Send one byte of stream data.
1497 MakeIOVector("a", &iov_);
dschinazi552accc2019-06-17 17:07:34 -07001498 producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), &iov_, 1u, 0u,
1499 iov_.iov_len);
nharperebabffd2019-06-03 17:34:45 -07001500 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1501 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1502 size_t num_bytes_consumed;
1503 creator_.CreateAndSerializeStreamFrame(
dschinazi552accc2019-06-17 17:07:34 -07001504 GetNthClientInitiatedStreamId(0), iov_.iov_len, 0, 0, true,
1505 NOT_RETRANSMISSION, &num_bytes_consumed);
nharperebabffd2019-06-03 17:34:45 -07001506 EXPECT_EQ(1u, num_bytes_consumed);
1507
1508 // Check that a packet is created.
wub8a5dafa2020-05-13 12:30:17 -07001509 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
1510 ASSERT_FALSE(serialized_packet_->retransmittable_frames.empty());
nharperebabffd2019-06-03 17:34:45 -07001511 {
1512 InSequence s;
1513 EXPECT_CALL(framer_visitor_, OnPacket());
1514 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1515 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001516 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
nharperebabffd2019-06-03 17:34:45 -07001517 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1518 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1519 if (client_framer_.version().HasHeaderProtection()) {
1520 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1521 }
1522 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1523 }
wub8a5dafa2020-05-13 12:30:17 -07001524 ProcessPacket(*serialized_packet_);
nharperebabffd2019-06-03 17:34:45 -07001525}
1526
QUICHE teama6ef0a62019-03-07 20:34:33 -05001527TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) {
1528 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1529 if (!IsDefaultTestConfiguration()) {
1530 return;
1531 }
1532
QUICHE team6987b4a2019-03-15 16:23:04 -07001533 creator_.set_encryption_level(ENCRYPTION_INITIAL);
fkastenholz85f18902019-05-28 12:47:00 -07001534 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001535 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
vasilvvc872ee42020-10-07 19:50:22 -07001536 /*fin=*/false, 0u, absl::string_view());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001537 EXPECT_QUIC_BUG(
renjietangb63005e2019-11-19 23:08:53 -08001538 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001539 "Cannot send stream data with level: ENCRYPTION_INITIAL");
1540}
1541
1542TEST_P(QuicPacketCreatorTest, SendStreamDataWithEncryptionHandshake) {
1543 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1544 if (!IsDefaultTestConfiguration()) {
1545 return;
1546 }
1547
1548 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
fkastenholz85f18902019-05-28 12:47:00 -07001549 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
dschinazi552accc2019-06-17 17:07:34 -07001550 QuicStreamFrame stream_frame(GetNthClientInitiatedStreamId(0),
vasilvvc872ee42020-10-07 19:50:22 -07001551 /*fin=*/false, 0u, absl::string_view());
fayang49523232019-05-03 06:28:22 -07001552 EXPECT_QUIC_BUG(
renjietangb63005e2019-11-19 23:08:53 -08001553 creator_.AddFrame(QuicFrame(stream_frame), NOT_RETRANSMISSION),
fayang49523232019-05-03 06:28:22 -07001554 "Cannot send stream data with level: ENCRYPTION_HANDSHAKE");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001555}
1556
1557TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
1558 // EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
1559 if (!IsDefaultTestConfiguration()) {
1560 return;
1561 }
1562
QUICHE teamdc41bf12019-03-20 12:58:42 -07001563 // This test only matters when the crypto handshake is sent in stream frames.
1564 // TODO(b/128596274): Re-enable when this check is supported for CRYPTO
1565 // frames.
1566 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1567 return;
1568 }
1569
QUICHE teama6ef0a62019-03-07 20:34:33 -05001570 CryptoHandshakeMessage message;
1571 message.set_tag(kCHLO);
dschinazi66dea072019-04-09 11:41:06 -07001572 message.set_minimum_size(kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001573 CryptoFramer framer;
1574 std::unique_ptr<QuicData> message_data;
QUICHE team3fe6a8b2019-03-14 09:10:38 -07001575 message_data = framer.ConstructHandshakeMessage(message);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001576
1577 struct iovec iov;
vasilvvc872ee42020-10-07 19:50:22 -07001578 MakeIOVector(absl::string_view(message_data->data(), message_data->length()),
1579 &iov);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001580 QuicFrame frame;
fkastenholz85f18902019-05-28 12:47:00 -07001581 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _));
fayang62b637b2019-09-16 08:40:49 -07001582 EXPECT_QUIC_BUG(
1583 creator_.ConsumeDataToFillCurrentPacket(
1584 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
1585 &iov, 1u, iov.iov_len, 0u, 0u, false, false, NOT_RETRANSMISSION,
1586 &frame),
1587 "Client hello won't fit in a single packet.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001588}
1589
1590TEST_P(QuicPacketCreatorTest, PendingPadding) {
1591 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1592 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
1593 EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
1594
1595 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1596 .WillRepeatedly(
1597 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1598 // Flush all paddings.
1599 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001600 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001601 {
1602 InSequence s;
1603 EXPECT_CALL(framer_visitor_, OnPacket());
1604 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1605 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001606 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001607 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
1608 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1609 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1610 }
1611 // Packet only contains padding.
wub8a5dafa2020-05-13 12:30:17 -07001612 ProcessPacket(*serialized_packet_);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001613 }
1614 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1615}
1616
1617TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001618 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001619 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1620 QuicFrame frame;
1621 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001622 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1623 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001624 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001625 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001626 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1627 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1628 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001629 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001630 EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
1631}
1632
QUICHE teama6ef0a62019-03-07 20:34:33 -05001633TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001634 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001635 const QuicByteCount kStreamFramePayloadSize = 100u;
1636 // Set the packet size be enough for one stream frame with 0 stream offset +
1637 // 1.
QUICHE teamdc41bf12019-03-20 12:58:42 -07001638 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1639 client_framer_.transport_version(), Perspective::IS_CLIENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001640 size_t length =
1641 GetPacketHeaderOverhead(client_framer_.transport_version()) +
1642 GetEncryptionOverhead() +
1643 QuicFramer::GetMinStreamFrameSize(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001644 client_framer_.transport_version(), stream_id, 0,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001645 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
1646 kStreamFramePayloadSize + 1;
1647 creator_.SetMaxPacketLength(length);
1648 creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
1649 QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
1650 QuicFrame frame;
1651 char buf[kStreamFramePayloadSize + 1] = {};
1652 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1653 .WillRepeatedly(
1654 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1655 // Send stream frame of size kStreamFramePayloadSize.
vasilvvc872ee42020-10-07 19:50:22 -07001656 MakeIOVector(absl::string_view(buf, kStreamFramePayloadSize), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001657 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1658 0u, 0u, false, false,
1659 NOT_RETRANSMISSION, &frame);
1660 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001661 // 1 byte padding is sent.
1662 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1663 // Send stream frame of size kStreamFramePayloadSize + 1.
vasilvvc872ee42020-10-07 19:50:22 -07001664 MakeIOVector(absl::string_view(buf, kStreamFramePayloadSize + 1), &iov_);
fayang62b637b2019-09-16 08:40:49 -07001665 creator_.ConsumeDataToFillCurrentPacket(stream_id, &iov_, 1u, iov_.iov_len,
1666 0u, kStreamFramePayloadSize, false,
1667 false, NOT_RETRANSMISSION, &frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001668 // No padding is sent.
fayang62b637b2019-09-16 08:40:49 -07001669 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001670 EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
1671 // Flush all paddings.
1672 while (creator_.pending_padding_bytes() > 0) {
fayang62b637b2019-09-16 08:40:49 -07001673 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001674 }
1675 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1676}
1677
1678TEST_P(QuicPacketCreatorTest, FlushWithExternalBuffer) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001679 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
wub50d4c712020-05-19 15:48:28 -07001680 char* buffer = new char[kMaxOutgoingPacketSize];
1681 QuicPacketBuffer external_buffer = {buffer,
1682 [](const char* p) { delete[] p; }};
1683 EXPECT_CALL(delegate_, GetPacketBuffer()).WillOnce(Return(external_buffer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001684
1685 QuicFrame frame;
1686 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001687 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1688 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001689 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
QUICHE teamdc41bf12019-03-20 12:58:42 -07001690 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001691 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
1692
1693 EXPECT_CALL(delegate_, OnSerializedPacket(_))
wub50d4c712020-05-19 15:48:28 -07001694 .WillOnce(Invoke([&external_buffer](SerializedPacket serialized_packet) {
1695 EXPECT_EQ(external_buffer.buffer, serialized_packet.encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001696 }));
fayang62b637b2019-09-16 08:40:49 -07001697 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001698}
1699
1700// Test for error found in
1701// https://bugs.chromium.org/p/chromium/issues/detail?id=859949 where a gap
1702// length that crosses an IETF VarInt length boundary would cause a
1703// failure. While this test is not applicable to versions other than version 99,
1704// it should still work. Hence, it is not made version-specific.
1705TEST_P(QuicPacketCreatorTest, IetfAckGapErrorRegression) {
1706 QuicAckFrame ack_frame =
1707 InitAckFrame({{QuicPacketNumber(60), QuicPacketNumber(61)},
1708 {QuicPacketNumber(125), QuicPacketNumber(126)}});
1709 frames_.push_back(QuicFrame(&ack_frame));
1710 SerializeAllFrames(frames_);
1711}
1712
1713TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
fayangd4291e42019-05-30 10:31:21 -07001714 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001715 return;
1716 }
dschinazied459c02020-05-07 16:12:23 -07001717 if (client_framer_.version().UsesTls()) {
1718 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1719 }
QUICHE teamdc41bf12019-03-20 12:58:42 -07001720 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001721 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1722 .Times(3)
1723 .WillRepeatedly(
1724 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacketForTests));
1725 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
1726 // Verify that there is enough room for the largest message payload.
ianswettb239f862019-04-05 09:15:06 -07001727 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1728 creator_.GetCurrentLargestMessagePayload()));
1729 std::string message(creator_.GetCurrentLargestMessagePayload(), 'a');
wub553a9662019-03-28 20:13:23 -07001730 QuicMessageFrame* message_frame =
1731 new QuicMessageFrame(1, MakeSpan(&allocator_, message, &storage));
renjietangb63005e2019-11-19 23:08:53 -08001732 EXPECT_TRUE(creator_.AddFrame(QuicFrame(message_frame), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001733 EXPECT_TRUE(creator_.HasPendingFrames());
fayang62b637b2019-09-16 08:40:49 -07001734 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001735
wub553a9662019-03-28 20:13:23 -07001736 QuicMessageFrame* frame2 =
1737 new QuicMessageFrame(2, MakeSpan(&allocator_, "message", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001738 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame2), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001739 EXPECT_TRUE(creator_.HasPendingFrames());
1740 // Verify if a new frame is added, 1 byte message length will be added.
1741 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
wub553a9662019-03-28 20:13:23 -07001742 QuicMessageFrame* frame3 =
1743 new QuicMessageFrame(3, MakeSpan(&allocator_, "message2", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001744 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame3), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001745 EXPECT_EQ(1u, creator_.ExpansionOnNewFrame());
fayang62b637b2019-09-16 08:40:49 -07001746 creator_.FlushCurrentPacket();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001747
1748 QuicFrame frame;
1749 MakeIOVector("test", &iov_);
QUICHE teamdc41bf12019-03-20 12:58:42 -07001750 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1751 client_framer_.transport_version(), Perspective::IS_CLIENT);
fayang62b637b2019-09-16 08:40:49 -07001752 EXPECT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
1753 stream_id, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
1754 NOT_RETRANSMISSION, &frame));
wub553a9662019-03-28 20:13:23 -07001755 QuicMessageFrame* frame4 =
1756 new QuicMessageFrame(4, MakeSpan(&allocator_, "message", &storage));
renjietangb63005e2019-11-19 23:08:53 -08001757 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame4), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001758 EXPECT_TRUE(creator_.HasPendingFrames());
1759 // Verify there is not enough room for largest payload.
ianswettb239f862019-04-05 09:15:06 -07001760 EXPECT_FALSE(creator_.HasRoomForMessageFrame(
1761 creator_.GetCurrentLargestMessagePayload()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001762 // Add largest message will causes the flush of the stream frame.
wub553a9662019-03-28 20:13:23 -07001763 QuicMessageFrame frame5(5, MakeSpan(&allocator_, message, &storage));
renjietangb63005e2019-11-19 23:08:53 -08001764 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&frame5), NOT_RETRANSMISSION));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001765 EXPECT_FALSE(creator_.HasPendingFrames());
1766}
1767
1768TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
fayangd4291e42019-05-30 10:31:21 -07001769 if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001770 return;
1771 }
dschinazied459c02020-05-07 16:12:23 -07001772 if (client_framer_.version().UsesTls()) {
1773 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1774 }
vasilvvc48c8712019-03-11 13:38:16 -07001775 std::string message_data(kDefaultMaxPacketSize, 'a');
vasilvvc872ee42020-10-07 19:50:22 -07001776 absl::string_view message_buffer(message_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001777 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
ianswettb239f862019-04-05 09:15:06 -07001778 // Test all possible encryption levels of message frames.
1779 for (EncryptionLevel level :
1780 {ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
1781 creator_.set_encryption_level(level);
1782 // Test all possible sizes of message frames.
1783 for (size_t message_size = 0;
1784 message_size <= creator_.GetCurrentLargestMessagePayload();
1785 ++message_size) {
1786 QuicMessageFrame* frame = new QuicMessageFrame(
vasilvvc872ee42020-10-07 19:50:22 -07001787 0, MakeSpan(&allocator_,
1788 absl::string_view(message_buffer.data(), message_size),
1789 &storage));
renjietangb63005e2019-11-19 23:08:53 -08001790 EXPECT_TRUE(creator_.AddFrame(QuicFrame(frame), NOT_RETRANSMISSION));
ianswettb239f862019-04-05 09:15:06 -07001791 EXPECT_TRUE(creator_.HasPendingFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001792
ianswettb239f862019-04-05 09:15:06 -07001793 size_t expansion_bytes = message_size >= 64 ? 2 : 1;
1794 EXPECT_EQ(expansion_bytes, creator_.ExpansionOnNewFrame());
1795 // Verify BytesFree returns bytes available for the next frame, which
1796 // should subtract the message length.
1797 size_t expected_bytes_free =
1798 creator_.GetCurrentLargestMessagePayload() - message_size <
1799 expansion_bytes
1800 ? 0
1801 : creator_.GetCurrentLargestMessagePayload() - expansion_bytes -
1802 message_size;
1803 EXPECT_EQ(expected_bytes_free, creator_.BytesFree());
1804 EXPECT_LE(creator_.GetGuaranteedLargestMessagePayload(),
1805 creator_.GetCurrentLargestMessagePayload());
1806 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1807 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
fayang62b637b2019-09-16 08:40:49 -07001808 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -07001809 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
ianswettb239f862019-04-05 09:15:06 -07001810 DeleteSerializedPacket();
1811 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001812 }
1813}
1814
nharperd43f1d62019-07-01 15:18:20 -07001815TEST_P(QuicPacketCreatorTest, GetGuaranteedLargestMessagePayload) {
dschinazied459c02020-05-07 16:12:23 -07001816 ParsedQuicVersion version = GetParam().version;
1817 if (!version.SupportsMessageFrames()) {
nharperd43f1d62019-07-01 15:18:20 -07001818 return;
1819 }
dschinazied459c02020-05-07 16:12:23 -07001820 if (version.UsesTls()) {
1821 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1822 }
nharperd43f1d62019-07-01 15:18:20 -07001823 QuicPacketLength expected_largest_payload = 1319;
dschinazied459c02020-05-07 16:12:23 -07001824 if (version.HasLongHeaderLengths()) {
nharperd43f1d62019-07-01 15:18:20 -07001825 expected_largest_payload -= 2;
1826 }
dschinazied459c02020-05-07 16:12:23 -07001827 if (version.HasLengthPrefixedConnectionIds()) {
dschinazi48ac9192019-07-31 00:07:26 -07001828 expected_largest_payload -= 1;
1829 }
nharperd43f1d62019-07-01 15:18:20 -07001830 EXPECT_EQ(expected_largest_payload,
1831 creator_.GetGuaranteedLargestMessagePayload());
dschinazied459c02020-05-07 16:12:23 -07001832 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1833 creator_.GetGuaranteedLargestMessagePayload()));
1834
1835 // Now test whether SetMaxDatagramFrameSize works.
1836 creator_.SetMaxDatagramFrameSize(expected_largest_payload + 1 +
1837 kQuicFrameTypeSize);
1838 EXPECT_EQ(expected_largest_payload,
1839 creator_.GetGuaranteedLargestMessagePayload());
1840 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1841 creator_.GetGuaranteedLargestMessagePayload()));
1842
1843 creator_.SetMaxDatagramFrameSize(expected_largest_payload +
1844 kQuicFrameTypeSize);
1845 EXPECT_EQ(expected_largest_payload,
1846 creator_.GetGuaranteedLargestMessagePayload());
1847 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1848 creator_.GetGuaranteedLargestMessagePayload()));
1849
1850 creator_.SetMaxDatagramFrameSize(expected_largest_payload - 1 +
1851 kQuicFrameTypeSize);
1852 EXPECT_EQ(expected_largest_payload - 1,
1853 creator_.GetGuaranteedLargestMessagePayload());
1854 EXPECT_TRUE(creator_.HasRoomForMessageFrame(
1855 creator_.GetGuaranteedLargestMessagePayload()));
1856
1857 constexpr QuicPacketLength kFrameSizeLimit = 1000;
1858 constexpr QuicPacketLength kPayloadSizeLimit =
1859 kFrameSizeLimit - kQuicFrameTypeSize;
1860 creator_.SetMaxDatagramFrameSize(kFrameSizeLimit);
1861 EXPECT_EQ(creator_.GetGuaranteedLargestMessagePayload(), kPayloadSizeLimit);
1862 EXPECT_TRUE(creator_.HasRoomForMessageFrame(kPayloadSizeLimit));
1863 EXPECT_FALSE(creator_.HasRoomForMessageFrame(kPayloadSizeLimit + 1));
1864}
1865
1866TEST_P(QuicPacketCreatorTest, GetCurrentLargestMessagePayload) {
1867 ParsedQuicVersion version = GetParam().version;
1868 if (!version.SupportsMessageFrames()) {
1869 return;
1870 }
1871 if (version.UsesTls()) {
1872 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
1873 }
1874 QuicPacketLength expected_largest_payload = 1319;
1875 if (version.SendsVariableLengthPacketNumberInLongHeader()) {
1876 expected_largest_payload += 3;
1877 }
1878 if (version.HasLongHeaderLengths()) {
1879 expected_largest_payload -= 2;
1880 }
1881 if (version.HasLengthPrefixedConnectionIds()) {
1882 expected_largest_payload -= 1;
1883 }
1884 EXPECT_EQ(expected_largest_payload,
1885 creator_.GetCurrentLargestMessagePayload());
1886
1887 // Now test whether SetMaxDatagramFrameSize works.
1888 creator_.SetMaxDatagramFrameSize(expected_largest_payload + 1 +
1889 kQuicFrameTypeSize);
1890 EXPECT_EQ(expected_largest_payload,
1891 creator_.GetCurrentLargestMessagePayload());
1892
1893 creator_.SetMaxDatagramFrameSize(expected_largest_payload +
1894 kQuicFrameTypeSize);
1895 EXPECT_EQ(expected_largest_payload,
1896 creator_.GetCurrentLargestMessagePayload());
1897
1898 creator_.SetMaxDatagramFrameSize(expected_largest_payload - 1 +
1899 kQuicFrameTypeSize);
1900 EXPECT_EQ(expected_largest_payload - 1,
1901 creator_.GetCurrentLargestMessagePayload());
nharperd43f1d62019-07-01 15:18:20 -07001902}
1903
QUICHE teama6ef0a62019-03-07 20:34:33 -05001904TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
QUICHE teamdc41bf12019-03-20 12:58:42 -07001905 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001906
1907 QuicAckFrame temp_ack_frame = InitAckFrame(1);
1908 QuicFrame ack_frame(&temp_ack_frame);
1909 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(ack_frame.type));
1910
QUICHE teamdc41bf12019-03-20 12:58:42 -07001911 QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
1912 client_framer_.transport_version(), Perspective::IS_CLIENT);
1913 QuicFrame stream_frame(QuicStreamFrame(stream_id,
dmcardlecf0bfcf2019-12-13 08:08:21 -08001914 /*fin=*/false, 0u,
vasilvvc872ee42020-10-07 19:50:22 -07001915 absl::string_view()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001916 ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
1917
1918 QuicFrame padding_frame{QuicPaddingFrame()};
1919 ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
1920
1921 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1922 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1923
renjietangb63005e2019-11-19 23:08:53 -08001924 EXPECT_TRUE(creator_.AddFrame(ack_frame, LOSS_RETRANSMISSION));
wub8a5dafa2020-05-13 12:30:17 -07001925 ASSERT_EQ(serialized_packet_, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001926
renjietangb63005e2019-11-19 23:08:53 -08001927 EXPECT_TRUE(creator_.AddFrame(stream_frame, RTO_RETRANSMISSION));
wub8a5dafa2020-05-13 12:30:17 -07001928 ASSERT_EQ(serialized_packet_, nullptr);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001929
renjietangb63005e2019-11-19 23:08:53 -08001930 EXPECT_TRUE(creator_.AddFrame(padding_frame, TLP_RETRANSMISSION));
fayang62b637b2019-09-16 08:40:49 -07001931 creator_.FlushCurrentPacket();
wub8a5dafa2020-05-13 12:30:17 -07001932 ASSERT_TRUE(serialized_packet_->encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001933
fayangcff885a2019-10-22 07:39:04 -07001934 // The last retransmittable frame on packet is a stream frame, the packet's
1935 // transmission type should be the same as the stream frame's.
wub8a5dafa2020-05-13 12:30:17 -07001936 EXPECT_EQ(serialized_packet_->transmission_type, RTO_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001937 DeleteSerializedPacket();
1938}
1939
1940TEST_P(QuicPacketCreatorTest, RetryToken) {
1941 if (!GetParam().version_serialization ||
1942 !QuicVersionHasLongHeaderLengths(client_framer_.transport_version())) {
1943 return;
1944 }
1945
1946 char retry_token_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8,
1947 9, 10, 11, 12, 13, 14, 15, 16};
1948
1949 creator_.SetRetryToken(
vasilvvc48c8712019-03-11 13:38:16 -07001950 std::string(retry_token_bytes, sizeof(retry_token_bytes)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001951
QUICHE teamdc41bf12019-03-20 12:58:42 -07001952 std::string data("a");
1953 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1954 QuicStreamFrame stream_frame(
1955 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
vasilvvc872ee42020-10-07 19:50:22 -07001956 /*fin=*/false, 0u, absl::string_view());
QUICHE teamdc41bf12019-03-20 12:58:42 -07001957 frames_.push_back(QuicFrame(stream_frame));
1958 } else {
1959 producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
1960 frames_.push_back(
1961 QuicFrame(new QuicCryptoFrame(ENCRYPTION_INITIAL, 0, data.length())));
1962 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001963 SerializedPacket serialized = SerializeAllFrames(frames_);
1964
1965 QuicPacketHeader header;
1966 {
1967 InSequence s;
1968 EXPECT_CALL(framer_visitor_, OnPacket());
1969 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
1970 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08001971 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001972 EXPECT_CALL(framer_visitor_, OnPacketHeader(_))
1973 .WillOnce(DoAll(SaveArg<0>(&header), Return(true)));
QUICHE teamdc41bf12019-03-20 12:58:42 -07001974 if (QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
1975 EXPECT_CALL(framer_visitor_, OnCryptoFrame(_));
1976 } else {
1977 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
1978 }
nharper55fa6132019-05-07 19:37:21 -07001979 if (client_framer_.version().HasHeaderProtection()) {
1980 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
1981 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001982 EXPECT_CALL(framer_visitor_, OnPacketComplete());
1983 }
1984 ProcessPacket(serialized);
1985 ASSERT_TRUE(header.version_flag);
1986 ASSERT_EQ(header.long_packet_type, INITIAL);
1987 ASSERT_EQ(header.retry_token.length(), sizeof(retry_token_bytes));
dmcardle8f7df532020-01-07 13:28:57 -08001988 quiche::test::CompareCharArraysWithHexError(
QUICHE teama6ef0a62019-03-07 20:34:33 -05001989 "retry token", header.retry_token.data(), header.retry_token.length(),
1990 retry_token_bytes, sizeof(retry_token_bytes));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001991}
1992
QUICHE team2252b702019-05-14 23:55:14 -04001993TEST_P(QuicPacketCreatorTest, GetConnectionId) {
QUICHE team2252b702019-05-14 23:55:14 -04001994 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
1995 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
1996}
1997
dschinazi346b7ce2019-06-05 01:38:18 -07001998TEST_P(QuicPacketCreatorTest, ClientConnectionId) {
dschinazi346b7ce2019-06-05 01:38:18 -07001999 if (!client_framer_.version().SupportsClientConnectionIds()) {
2000 return;
2001 }
2002 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
2003 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
2004 creator_.SetClientConnectionId(TestConnectionId(0x33));
2005 EXPECT_EQ(TestConnectionId(2), creator_.GetDestinationConnectionId());
2006 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
2007}
2008
renjietangdbe98342019-10-18 11:00:57 -07002009TEST_P(QuicPacketCreatorTest, CoalesceStreamFrames) {
2010 InSequence s;
2011 if (!GetParam().version_serialization) {
2012 creator_.StopSendingVersion();
2013 }
renjietangdbe98342019-10-18 11:00:57 -07002014 const size_t max_plaintext_size =
2015 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
2016 EXPECT_FALSE(creator_.HasPendingFrames());
2017 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2018 QuicStreamId stream_id1 = QuicUtils::GetFirstBidirectionalStreamId(
2019 client_framer_.transport_version(), Perspective::IS_CLIENT);
2020 QuicStreamId stream_id2 = GetNthClientInitiatedStreamId(1);
2021 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2022 EXPECT_EQ(max_plaintext_size -
2023 GetPacketHeaderSize(
2024 client_framer_.transport_version(),
2025 creator_.GetDestinationConnectionIdLength(),
2026 creator_.GetSourceConnectionIdLength(),
2027 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2028 !kIncludeDiversificationNonce,
2029 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2030 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
2031 0, QuicPacketCreatorPeer::GetLengthLength(&creator_)),
2032 creator_.BytesFree());
2033 StrictMock<MockDebugDelegate> debug;
2034 creator_.set_debug_delegate(&debug);
2035
2036 MakeIOVector("test", &iov_);
2037 QuicFrame frame;
2038 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2039 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2040 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2041 NOT_RETRANSMISSION, &frame));
2042 EXPECT_TRUE(creator_.HasPendingFrames());
2043 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id1));
2044
2045 MakeIOVector("coalesce", &iov_);
2046 // frame will be coalesced with the first frame.
2047 const auto previous_size = creator_.PacketSize();
renjietang2a6ba792019-10-22 10:44:58 -07002048 QuicStreamFrame target(stream_id1, true, 0, 12);
2049 EXPECT_CALL(debug, OnStreamFrameCoalesced(target));
renjietangdbe98342019-10-18 11:00:57 -07002050 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2051 stream_id1, &iov_, 1u, iov_.iov_len, 0u, 4u, true, false,
2052 NOT_RETRANSMISSION, &frame));
2053 EXPECT_EQ(frame.stream_frame.data_length,
2054 creator_.PacketSize() - previous_size);
renjietangdbe98342019-10-18 11:00:57 -07002055
2056 // frame is for another stream, so it won't be coalesced.
2057 const auto length = creator_.BytesFree() - 10u;
renjietang7f46be32019-10-21 16:55:17 -07002058 std::string large_data(length, 'x');
renjietangdbe98342019-10-18 11:00:57 -07002059 MakeIOVector(large_data, &iov_);
2060 EXPECT_CALL(debug, OnFrameAddedToPacket(_));
2061 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2062 stream_id2, &iov_, 1u, iov_.iov_len, 0u, 0u, false, false,
2063 NOT_RETRANSMISSION, &frame));
2064 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(stream_id2));
2065
2066 // The packet doesn't have enough free bytes for all data, but will still be
2067 // able to consume and coalesce part of them.
2068 EXPECT_CALL(debug, OnStreamFrameCoalesced(_));
2069 MakeIOVector("somerandomdata", &iov_);
2070 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2071 stream_id2, &iov_, 1u, iov_.iov_len, 0u, length, false, false,
2072 NOT_RETRANSMISSION, &frame));
2073
2074 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2075 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2076 creator_.FlushCurrentPacket();
2077 EXPECT_CALL(framer_visitor_, OnPacket());
2078 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2079 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08002080 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
renjietangdbe98342019-10-18 11:00:57 -07002081 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2082 // The packet should only have 2 stream frames.
2083 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2084 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2085 EXPECT_CALL(framer_visitor_, OnPacketComplete());
wub8a5dafa2020-05-13 12:30:17 -07002086 ProcessPacket(*serialized_packet_);
renjietangdbe98342019-10-18 11:00:57 -07002087}
2088
fayang51152fd2019-10-21 06:48:09 -07002089TEST_P(QuicPacketCreatorTest, SaveNonRetransmittableFrames) {
fayang51152fd2019-10-21 06:48:09 -07002090 QuicAckFrame ack_frame(InitAckFrame(1));
2091 frames_.push_back(QuicFrame(&ack_frame));
2092 frames_.push_back(QuicFrame(QuicPaddingFrame(-1)));
2093 SerializedPacket serialized = SerializeAllFrames(frames_);
2094 ASSERT_EQ(2u, serialized.nonretransmittable_frames.size());
2095 EXPECT_EQ(ACK_FRAME, serialized.nonretransmittable_frames[0].type);
2096 EXPECT_EQ(PADDING_FRAME, serialized.nonretransmittable_frames[1].type);
fayangeb268412019-10-21 14:05:38 -07002097 // Verify full padding frame is translated to a padding frame with actual
2098 // bytes of padding.
2099 EXPECT_LT(
2100 0,
2101 serialized.nonretransmittable_frames[1].padding_frame.num_padding_bytes);
fayang51152fd2019-10-21 06:48:09 -07002102 frames_.clear();
2103
2104 // Serialize another packet with the same frames.
2105 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
2106 &creator_, serialized.nonretransmittable_frames, buffer_,
2107 kMaxOutgoingPacketSize);
2108 // Verify the packet length of both packets are equal.
2109 EXPECT_EQ(serialized.encrypted_length, packet.encrypted_length);
2110}
2111
fayang08750832019-10-24 11:25:34 -07002112TEST_P(QuicPacketCreatorTest, SerializeCoalescedPacket) {
fayang08750832019-10-24 11:25:34 -07002113 QuicCoalescedPacket coalesced;
2114 SimpleBufferAllocator allocator;
2115 QuicSocketAddress self_address(QuicIpAddress::Loopback4(), 1);
2116 QuicSocketAddress peer_address(QuicIpAddress::Loopback4(), 2);
2117 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2118 EncryptionLevel level = static_cast<EncryptionLevel>(i);
2119 creator_.set_encryption_level(level);
2120 QuicAckFrame ack_frame(InitAckFrame(1));
2121 frames_.push_back(QuicFrame(&ack_frame));
2122 if (level != ENCRYPTION_INITIAL && level != ENCRYPTION_HANDSHAKE) {
vasilvvc872ee42020-10-07 19:50:22 -07002123 frames_.push_back(
2124 QuicFrame(QuicStreamFrame(1, false, 0u, absl::string_view())));
fayang08750832019-10-24 11:25:34 -07002125 }
2126 SerializedPacket serialized = SerializeAllFrames(frames_);
2127 EXPECT_EQ(level, serialized.encryption_level);
2128 frames_.clear();
2129 ASSERT_TRUE(coalesced.MaybeCoalescePacket(serialized, self_address,
2130 peer_address, &allocator,
2131 creator_.max_packet_length()));
2132 }
2133 char buffer[kMaxOutgoingPacketSize];
2134 size_t coalesced_length = creator_.SerializeCoalescedPacket(
2135 coalesced, buffer, kMaxOutgoingPacketSize);
2136 // Verify packet is padded to full.
2137 ASSERT_EQ(coalesced.max_packet_length(), coalesced_length);
2138 if (!QuicVersionHasLongHeaderLengths(server_framer_.transport_version())) {
2139 return;
2140 }
2141 // Verify packet process.
2142 std::unique_ptr<QuicEncryptedPacket> packets[NUM_ENCRYPTION_LEVELS];
2143 packets[ENCRYPTION_INITIAL] =
bnc40d0fa52019-10-29 11:40:48 -07002144 std::make_unique<QuicEncryptedPacket>(buffer, coalesced_length);
fayang08750832019-10-24 11:25:34 -07002145 for (size_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
2146 InSequence s;
2147 EXPECT_CALL(framer_visitor_, OnPacket());
2148 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
2149 if (i < ENCRYPTION_FORWARD_SECURE) {
2150 // Save coalesced packet.
2151 EXPECT_CALL(framer_visitor_, OnCoalescedPacket(_))
2152 .WillOnce(Invoke([i, &packets](const QuicEncryptedPacket& packet) {
2153 packets[i + 1] = packet.Clone();
2154 }));
2155 }
2156 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
fayang93b4e4d2020-11-25 07:56:47 -08002157 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
fayang08750832019-10-24 11:25:34 -07002158 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
2159 EXPECT_CALL(framer_visitor_, OnAckFrameStart(_, _)).WillOnce(Return(true));
2160 EXPECT_CALL(framer_visitor_,
2161 OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)))
2162 .WillOnce(Return(true));
2163 EXPECT_CALL(framer_visitor_, OnAckFrameEnd(_)).WillOnce(Return(true));
2164 if (i == ENCRYPTION_INITIAL) {
2165 // Verify padding is added.
2166 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
2167 } else {
2168 EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(testing::AtMost(1));
2169 }
2170 if (i != ENCRYPTION_INITIAL && i != ENCRYPTION_HANDSHAKE) {
2171 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
2172 }
2173 EXPECT_CALL(framer_visitor_, OnPacketComplete());
2174
2175 server_framer_.ProcessPacket(*packets[i]);
2176 }
2177}
2178
fayang2ab1e852019-11-04 11:24:36 -08002179TEST_P(QuicPacketCreatorTest, SoftMaxPacketLength) {
2180 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2181 QuicByteCount previous_max_packet_length = creator_.max_packet_length();
2182 const size_t overhead =
2183 GetPacketHeaderOverhead(client_framer_.transport_version()) +
2184 QuicPacketCreator::MinPlaintextPacketSize(client_framer_.version()) +
2185 GetEncryptionOverhead();
2186 // Make sure a length which cannot accommodate header (includes header
2187 // protection minimal length) gets rejected.
2188 creator_.SetSoftMaxPacketLength(overhead - 1);
2189 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2190
2191 creator_.SetSoftMaxPacketLength(overhead);
2192 EXPECT_EQ(overhead, creator_.max_packet_length());
2193
2194 // Verify creator has room for stream frame because max_packet_length_ gets
2195 // restored.
vasilvva57bbb32019-11-06 06:19:27 -08002196 ASSERT_TRUE(creator_.HasRoomForStreamFrame(
2197 GetNthClientInitiatedStreamId(1), kMaxIetfVarInt,
2198 std::numeric_limits<uint32_t>::max()));
fayang2ab1e852019-11-04 11:24:36 -08002199 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2200
2201 // Same for message frame.
2202 if (VersionSupportsMessageFrames(client_framer_.transport_version())) {
2203 creator_.SetSoftMaxPacketLength(overhead);
dschinazied459c02020-05-07 16:12:23 -07002204 if (client_framer_.version().UsesTls()) {
2205 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
2206 }
fayang2ab1e852019-11-04 11:24:36 -08002207 // Verify GetCurrentLargestMessagePayload is based on the actual
2208 // max_packet_length.
2209 EXPECT_LT(1u, creator_.GetCurrentLargestMessagePayload());
2210 EXPECT_EQ(overhead, creator_.max_packet_length());
2211 ASSERT_TRUE(creator_.HasRoomForMessageFrame(
2212 creator_.GetCurrentLargestMessagePayload()));
2213 EXPECT_EQ(previous_max_packet_length, creator_.max_packet_length());
2214 }
2215
2216 // Verify creator can consume crypto data because max_packet_length_ gets
2217 // restored.
2218 creator_.SetSoftMaxPacketLength(overhead);
2219 EXPECT_EQ(overhead, creator_.max_packet_length());
2220 std::string data = "crypto data";
2221 MakeIOVector(data, &iov_);
2222 QuicFrame frame;
2223 if (!QuicVersionUsesCryptoFrames(client_framer_.transport_version())) {
2224 ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
2225 QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), &iov_,
2226 1u, iov_.iov_len, 0u, kOffset, false, true, NOT_RETRANSMISSION,
2227 &frame));
2228 size_t bytes_consumed = frame.stream_frame.data_length;
2229 EXPECT_LT(0u, bytes_consumed);
2230 } else {
2231 producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
2232 ASSERT_TRUE(creator_.ConsumeCryptoDataToFillCurrentPacket(
2233 ENCRYPTION_INITIAL, data.length(), kOffset,
2234 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
2235 size_t bytes_consumed = frame.crypto_frame->data_length;
2236 EXPECT_LT(0u, bytes_consumed);
2237 }
2238 EXPECT_TRUE(creator_.HasPendingFrames());
2239 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2240 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
2241 creator_.FlushCurrentPacket();
2242
2243 // Verify ACK frame can be consumed.
2244 creator_.SetSoftMaxPacketLength(overhead);
2245 EXPECT_EQ(overhead, creator_.max_packet_length());
2246 QuicAckFrame ack_frame(InitAckFrame(10u));
renjietangb63005e2019-11-19 23:08:53 -08002247 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame), NOT_RETRANSMISSION));
fayang2ab1e852019-11-04 11:24:36 -08002248 EXPECT_TRUE(creator_.HasPendingFrames());
2249}
2250
fayang4245c212019-11-05 13:33:46 -08002251class MockDelegate : public QuicPacketCreator::DelegateInterface {
2252 public:
2253 MockDelegate() {}
2254 MockDelegate(const MockDelegate&) = delete;
2255 MockDelegate& operator=(const MockDelegate&) = delete;
2256 ~MockDelegate() override {}
2257
wub713afae2020-04-27 07:48:31 -07002258 MOCK_METHOD(bool,
2259 ShouldGeneratePacket,
2260 (HasRetransmittableData retransmittable, IsHandshake handshake),
2261 (override));
2262 MOCK_METHOD(const QuicFrames,
2263 MaybeBundleAckOpportunistically,
2264 (),
2265 (override));
wub50d4c712020-05-19 15:48:28 -07002266 MOCK_METHOD(QuicPacketBuffer, GetPacketBuffer, (), (override));
wub8a5dafa2020-05-13 12:30:17 -07002267 MOCK_METHOD(void, OnSerializedPacket, (SerializedPacket), (override));
wub713afae2020-04-27 07:48:31 -07002268 MOCK_METHOD(void,
2269 OnUnrecoverableError,
2270 (QuicErrorCode, const std::string&),
2271 (override));
fayang15042962020-07-01 12:14:29 -07002272 MOCK_METHOD(SerializedPacketFate,
2273 GetSerializedPacketFate,
2274 (bool, EncryptionLevel),
2275 (override));
fayang4245c212019-11-05 13:33:46 -08002276
2277 void SetCanWriteAnything() {
2278 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
2279 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2280 .WillRepeatedly(Return(true));
2281 }
2282
2283 void SetCanNotWrite() {
2284 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2285 .WillRepeatedly(Return(false));
2286 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2287 .WillRepeatedly(Return(false));
2288 }
2289
2290 // Use this when only ack frames should be allowed to be written.
2291 void SetCanWriteOnlyNonRetransmittable() {
2292 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
2293 .WillRepeatedly(Return(false));
2294 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
2295 .WillRepeatedly(Return(true));
2296 }
2297};
2298
2299// Simple struct for describing the contents of a packet.
2300// Useful in conjunction with a SimpleQuicFrame for validating that a packet
2301// contains the expected frames.
2302struct PacketContents {
2303 PacketContents()
2304 : num_ack_frames(0),
2305 num_connection_close_frames(0),
2306 num_goaway_frames(0),
2307 num_rst_stream_frames(0),
2308 num_stop_waiting_frames(0),
2309 num_stream_frames(0),
2310 num_crypto_frames(0),
2311 num_ping_frames(0),
2312 num_mtu_discovery_frames(0),
2313 num_padding_frames(0) {}
2314
2315 size_t num_ack_frames;
2316 size_t num_connection_close_frames;
2317 size_t num_goaway_frames;
2318 size_t num_rst_stream_frames;
2319 size_t num_stop_waiting_frames;
2320 size_t num_stream_frames;
2321 size_t num_crypto_frames;
2322 size_t num_ping_frames;
2323 size_t num_mtu_discovery_frames;
2324 size_t num_padding_frames;
2325};
2326
2327class MultiplePacketsTestPacketCreator : public QuicPacketCreator {
2328 public:
2329 MultiplePacketsTestPacketCreator(
2330 QuicConnectionId connection_id,
2331 QuicFramer* framer,
2332 QuicRandom* random_generator,
2333 QuicPacketCreator::DelegateInterface* delegate,
2334 SimpleDataProducer* producer)
2335 : QuicPacketCreator(connection_id, framer, random_generator, delegate),
2336 ack_frame_(InitAckFrame(1)),
2337 delegate_(static_cast<MockDelegate*>(delegate)),
2338 producer_(producer) {}
2339
2340 bool ConsumeRetransmittableControlFrame(const QuicFrame& frame,
2341 bool bundle_ack) {
2342 if (!has_ack()) {
2343 QuicFrames frames;
2344 if (bundle_ack) {
2345 frames.push_back(QuicFrame(&ack_frame_));
2346 }
2347 if (delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2348 NOT_HANDSHAKE)) {
2349 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically())
2350 .WillOnce(Return(frames));
2351 }
2352 }
2353 return QuicPacketCreator::ConsumeRetransmittableControlFrame(frame);
2354 }
2355
2356 QuicConsumedData ConsumeDataFastPath(QuicStreamId id,
2357 const struct iovec* iov,
2358 int iov_count,
2359 size_t total_length,
2360 QuicStreamOffset offset,
2361 bool fin) {
2362 // Save data before data is consumed.
2363 if (total_length > 0) {
2364 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2365 }
2366 return QuicPacketCreator::ConsumeDataFastPath(id, total_length, offset, fin,
2367 0);
2368 }
2369
2370 QuicConsumedData ConsumeData(QuicStreamId id,
2371 const struct iovec* iov,
2372 int iov_count,
2373 size_t total_length,
2374 QuicStreamOffset offset,
2375 StreamSendingState state) {
2376 // Save data before data is consumed.
2377 if (total_length > 0) {
2378 producer_->SaveStreamData(id, iov, iov_count, 0, total_length);
2379 }
2380 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2381 NOT_HANDSHAKE)) {
2382 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2383 }
2384 return QuicPacketCreator::ConsumeData(id, total_length, offset, state);
2385 }
2386
2387 MessageStatus AddMessageFrame(QuicMessageId message_id,
2388 QuicMemSliceSpan message) {
2389 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2390 NOT_HANDSHAKE)) {
2391 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2392 }
2393 return QuicPacketCreator::AddMessageFrame(message_id, message);
2394 }
2395
2396 size_t ConsumeCryptoData(EncryptionLevel level,
vasilvvc872ee42020-10-07 19:50:22 -07002397 absl::string_view data,
fayang4245c212019-11-05 13:33:46 -08002398 QuicStreamOffset offset) {
2399 producer_->SaveCryptoData(level, offset, data);
2400 if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2401 NOT_HANDSHAKE)) {
2402 EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
2403 }
2404 return QuicPacketCreator::ConsumeCryptoData(level, data.length(), offset);
2405 }
2406
2407 QuicAckFrame ack_frame_;
2408 MockDelegate* delegate_;
2409 SimpleDataProducer* producer_;
2410};
2411
2412class QuicPacketCreatorMultiplePacketsTest : public QuicTest {
2413 public:
2414 QuicPacketCreatorMultiplePacketsTest()
2415 : framer_(AllSupportedVersions(),
2416 QuicTime::Zero(),
2417 Perspective::IS_CLIENT,
2418 kQuicDefaultConnectionIdLength),
2419 creator_(TestConnectionId(),
2420 &framer_,
2421 &random_creator_,
2422 &delegate_,
2423 &producer_),
2424 ack_frame_(InitAckFrame(1)) {
wub50d4c712020-05-19 15:48:28 -07002425 EXPECT_CALL(delegate_, GetPacketBuffer())
2426 .WillRepeatedly(Return(QuicPacketBuffer()));
fayangfe77c032020-08-24 18:21:32 -07002427 EXPECT_CALL(delegate_, GetSerializedPacketFate(_, _))
2428 .WillRepeatedly(Return(SEND_TO_WRITER));
fayang4245c212019-11-05 13:33:46 -08002429 creator_.SetEncrypter(
2430 ENCRYPTION_FORWARD_SECURE,
2431 std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
2432 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
2433 framer_.set_data_producer(&producer_);
2434 if (simple_framer_.framer()->version().KnowsWhichDecrypterToUse()) {
2435 simple_framer_.framer()->InstallDecrypter(
2436 ENCRYPTION_FORWARD_SECURE,
2437 std::make_unique<NullDecrypter>(Perspective::IS_SERVER));
2438 }
2439 creator_.AttachPacketFlusher();
2440 }
2441
wub8a5dafa2020-05-13 12:30:17 -07002442 ~QuicPacketCreatorMultiplePacketsTest() override {}
fayang4245c212019-11-05 13:33:46 -08002443
wub8a5dafa2020-05-13 12:30:17 -07002444 void SavePacket(SerializedPacket packet) {
2445 DCHECK(packet.release_encrypted_buffer == nullptr);
2446 packet.encrypted_buffer = CopyBuffer(packet);
2447 packet.release_encrypted_buffer = [](const char* p) { delete[] p; };
2448 packets_.push_back(std::move(packet));
fayang4245c212019-11-05 13:33:46 -08002449 }
2450
2451 protected:
2452 QuicRstStreamFrame* CreateRstStreamFrame() {
2453 return new QuicRstStreamFrame(1, 1, QUIC_STREAM_NO_ERROR, 0);
2454 }
2455
2456 QuicGoAwayFrame* CreateGoAwayFrame() {
2457 return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, std::string());
2458 }
2459
2460 void CheckPacketContains(const PacketContents& contents,
2461 size_t packet_index) {
2462 ASSERT_GT(packets_.size(), packet_index);
2463 const SerializedPacket& packet = packets_[packet_index];
2464 size_t num_retransmittable_frames =
2465 contents.num_connection_close_frames + contents.num_goaway_frames +
2466 contents.num_rst_stream_frames + contents.num_stream_frames +
2467 contents.num_crypto_frames + contents.num_ping_frames;
2468 size_t num_frames =
2469 contents.num_ack_frames + contents.num_stop_waiting_frames +
2470 contents.num_mtu_discovery_frames + contents.num_padding_frames +
2471 num_retransmittable_frames;
2472
2473 if (num_retransmittable_frames == 0) {
2474 ASSERT_TRUE(packet.retransmittable_frames.empty());
2475 } else {
2476 ASSERT_FALSE(packet.retransmittable_frames.empty());
2477 EXPECT_EQ(num_retransmittable_frames,
2478 packet.retransmittable_frames.size());
2479 }
2480
2481 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2482 ASSERT_TRUE(simple_framer_.ProcessPacket(
2483 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2484 size_t num_padding_frames = 0;
2485 if (contents.num_padding_frames == 0) {
2486 num_padding_frames = simple_framer_.padding_frames().size();
2487 }
2488 EXPECT_EQ(num_frames + num_padding_frames, simple_framer_.num_frames());
2489 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
2490 EXPECT_EQ(contents.num_connection_close_frames,
2491 simple_framer_.connection_close_frames().size());
2492 EXPECT_EQ(contents.num_goaway_frames,
2493 simple_framer_.goaway_frames().size());
2494 EXPECT_EQ(contents.num_rst_stream_frames,
2495 simple_framer_.rst_stream_frames().size());
2496 EXPECT_EQ(contents.num_stream_frames,
2497 simple_framer_.stream_frames().size());
2498 EXPECT_EQ(contents.num_crypto_frames,
2499 simple_framer_.crypto_frames().size());
2500 EXPECT_EQ(contents.num_stop_waiting_frames,
2501 simple_framer_.stop_waiting_frames().size());
2502 if (contents.num_padding_frames != 0) {
2503 EXPECT_EQ(contents.num_padding_frames,
2504 simple_framer_.padding_frames().size());
2505 }
2506
2507 // From the receiver's perspective, MTU discovery frames are ping frames.
2508 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames,
2509 simple_framer_.ping_frames().size());
2510 }
2511
2512 void CheckPacketHasSingleStreamFrame(size_t packet_index) {
2513 ASSERT_GT(packets_.size(), packet_index);
2514 const SerializedPacket& packet = packets_[packet_index];
2515 ASSERT_FALSE(packet.retransmittable_frames.empty());
2516 EXPECT_EQ(1u, packet.retransmittable_frames.size());
2517 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
2518 ASSERT_TRUE(simple_framer_.ProcessPacket(
2519 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
2520 EXPECT_EQ(1u, simple_framer_.num_frames());
2521 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
2522 }
2523
2524 void CheckAllPacketsHaveSingleStreamFrame() {
2525 for (size_t i = 0; i < packets_.size(); i++) {
2526 CheckPacketHasSingleStreamFrame(i);
2527 }
2528 }
2529
2530 void CreateData(size_t len) {
2531 data_array_.reset(new char[len]);
2532 memset(data_array_.get(), '?', len);
2533 iov_.iov_base = data_array_.get();
2534 iov_.iov_len = len;
2535 }
2536
2537 QuicFramer framer_;
2538 MockRandom random_creator_;
2539 StrictMock<MockDelegate> delegate_;
2540 MultiplePacketsTestPacketCreator creator_;
2541 SimpleQuicFramer simple_framer_;
2542 std::vector<SerializedPacket> packets_;
2543 QuicAckFrame ack_frame_;
2544 struct iovec iov_;
2545 SimpleBufferAllocator allocator_;
2546
2547 private:
2548 std::unique_ptr<char[]> data_array_;
2549 SimpleDataProducer producer_;
2550};
2551
2552TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_NotWritable) {
2553 delegate_.SetCanNotWrite();
2554
2555 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2556 const bool consumed =
2557 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2558 /*bundle_ack=*/false);
2559 EXPECT_FALSE(consumed);
2560 EXPECT_FALSE(creator_.HasPendingFrames());
2561 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2562 delete rst_frame;
2563}
2564
fayang9320ca72020-08-03 13:02:59 -07002565TEST_F(QuicPacketCreatorMultiplePacketsTest,
2566 WrongEncryptionLevelForStreamDataFastPath) {
fayang9320ca72020-08-03 13:02:59 -07002567 creator_.set_encryption_level(ENCRYPTION_HANDSHAKE);
2568 delegate_.SetCanWriteAnything();
2569 // Create a 10000 byte IOVector.
2570 CreateData(10000);
2571 EXPECT_CALL(delegate_, OnSerializedPacket(_)).Times(0);
2572 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _));
2573 EXPECT_QUIC_BUG(creator_.ConsumeDataFastPath(
2574 QuicUtils::GetFirstBidirectionalStreamId(
2575 framer_.transport_version(), Perspective::IS_CLIENT),
2576 &iov_, 1u, iov_.iov_len, 0, true),
2577 "");
2578}
2579
fayang4245c212019-11-05 13:33:46 -08002580TEST_F(QuicPacketCreatorMultiplePacketsTest, AddControlFrame_OnlyAckWritable) {
2581 delegate_.SetCanWriteOnlyNonRetransmittable();
2582
2583 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2584 const bool consumed =
2585 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2586 /*bundle_ack=*/false);
2587 EXPECT_FALSE(consumed);
2588 EXPECT_FALSE(creator_.HasPendingFrames());
2589 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2590 delete rst_frame;
2591}
2592
2593TEST_F(QuicPacketCreatorMultiplePacketsTest,
2594 AddControlFrame_WritableAndShouldNotFlush) {
2595 delegate_.SetCanWriteAnything();
2596
2597 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2598 /*bundle_ack=*/false);
2599 EXPECT_TRUE(creator_.HasPendingFrames());
2600 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2601}
2602
2603TEST_F(QuicPacketCreatorMultiplePacketsTest,
2604 AddControlFrame_NotWritableBatchThenFlush) {
2605 delegate_.SetCanNotWrite();
2606
2607 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
2608 const bool consumed =
2609 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
2610 /*bundle_ack=*/false);
2611 EXPECT_FALSE(consumed);
2612 EXPECT_FALSE(creator_.HasPendingFrames());
2613 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2614 delete rst_frame;
2615}
2616
2617TEST_F(QuicPacketCreatorMultiplePacketsTest,
2618 AddControlFrame_WritableAndShouldFlush) {
2619 delegate_.SetCanWriteAnything();
2620
2621 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2622 .WillOnce(
2623 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2624
2625 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
2626 /*bundle_ack=*/false);
2627 creator_.Flush();
2628 EXPECT_FALSE(creator_.HasPendingFrames());
2629 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2630
2631 PacketContents contents;
2632 contents.num_rst_stream_frames = 1;
2633 CheckPacketContains(contents, 0);
2634}
2635
2636TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeCryptoData) {
2637 delegate_.SetCanWriteAnything();
2638
2639 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2640 .WillOnce(
2641 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2642 std::string data = "crypto data";
2643 size_t consumed_bytes =
2644 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2645 creator_.Flush();
2646 EXPECT_EQ(data.length(), consumed_bytes);
2647 EXPECT_FALSE(creator_.HasPendingFrames());
2648 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2649
2650 PacketContents contents;
2651 contents.num_crypto_frames = 1;
2652 contents.num_padding_frames = 1;
2653 CheckPacketContains(contents, 0);
2654}
2655
fayang09207712020-05-15 12:36:42 -07002656TEST_F(QuicPacketCreatorMultiplePacketsTest,
2657 ConsumeCryptoDataCheckShouldGeneratePacket) {
2658 delegate_.SetCanNotWrite();
2659
fayangd6c5bd02020-06-29 07:25:34 -07002660 EXPECT_CALL(delegate_, OnSerializedPacket(_)).Times(0);
fayang09207712020-05-15 12:36:42 -07002661 std::string data = "crypto data";
2662 size_t consumed_bytes =
2663 creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2664 creator_.Flush();
fayangd6c5bd02020-06-29 07:25:34 -07002665 EXPECT_EQ(0u, consumed_bytes);
fayang09207712020-05-15 12:36:42 -07002666 EXPECT_FALSE(creator_.HasPendingFrames());
2667 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
fayang09207712020-05-15 12:36:42 -07002668}
2669
fayang4245c212019-11-05 13:33:46 -08002670TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_NotWritable) {
2671 delegate_.SetCanNotWrite();
2672
2673 MakeIOVector("foo", &iov_);
2674 QuicConsumedData consumed = creator_.ConsumeData(
2675 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2676 Perspective::IS_CLIENT),
2677 &iov_, 1u, iov_.iov_len, 0, FIN);
2678 EXPECT_EQ(0u, consumed.bytes_consumed);
2679 EXPECT_FALSE(consumed.fin_consumed);
2680 EXPECT_FALSE(creator_.HasPendingFrames());
2681 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2682}
2683
2684TEST_F(QuicPacketCreatorMultiplePacketsTest,
2685 ConsumeData_WritableAndShouldNotFlush) {
2686 delegate_.SetCanWriteAnything();
2687
2688 MakeIOVector("foo", &iov_);
2689 QuicConsumedData consumed = creator_.ConsumeData(
2690 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2691 Perspective::IS_CLIENT),
2692 &iov_, 1u, iov_.iov_len, 0, FIN);
2693 EXPECT_EQ(3u, consumed.bytes_consumed);
2694 EXPECT_TRUE(consumed.fin_consumed);
2695 EXPECT_TRUE(creator_.HasPendingFrames());
2696 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2697}
2698
2699TEST_F(QuicPacketCreatorMultiplePacketsTest,
2700 ConsumeData_WritableAndShouldFlush) {
2701 delegate_.SetCanWriteAnything();
2702
2703 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2704 .WillOnce(
2705 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2706 MakeIOVector("foo", &iov_);
2707 QuicConsumedData consumed = creator_.ConsumeData(
2708 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2709 Perspective::IS_CLIENT),
2710 &iov_, 1u, iov_.iov_len, 0, FIN);
2711 creator_.Flush();
2712 EXPECT_EQ(3u, consumed.bytes_consumed);
2713 EXPECT_TRUE(consumed.fin_consumed);
2714 EXPECT_FALSE(creator_.HasPendingFrames());
2715 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2716
2717 PacketContents contents;
2718 contents.num_stream_frames = 1;
2719 CheckPacketContains(contents, 0);
2720}
2721
2722// Test the behavior of ConsumeData when the data consumed is for the crypto
2723// handshake stream. Ensure that the packet is always sent and padded even if
2724// the creator operates in batch mode.
2725TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_Handshake) {
2726 delegate_.SetCanWriteAnything();
2727
2728 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2729 .WillOnce(
2730 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2731 std::string data = "foo bar";
2732 MakeIOVector(data, &iov_);
2733 size_t consumed_bytes = 0;
2734 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2735 consumed_bytes = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2736 } else {
2737 consumed_bytes =
2738 creator_
2739 .ConsumeData(
2740 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2741 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2742 .bytes_consumed;
2743 }
2744 EXPECT_EQ(7u, consumed_bytes);
2745 EXPECT_FALSE(creator_.HasPendingFrames());
2746 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2747
2748 PacketContents contents;
2749 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2750 contents.num_crypto_frames = 1;
2751 } else {
2752 contents.num_stream_frames = 1;
2753 }
2754 contents.num_padding_frames = 1;
2755 CheckPacketContains(contents, 0);
2756
2757 ASSERT_EQ(1u, packets_.size());
2758 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2759 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
2760}
2761
2762// Test the behavior of ConsumeData when the data is for the crypto handshake
2763// stream, but padding is disabled.
2764TEST_F(QuicPacketCreatorMultiplePacketsTest,
2765 ConsumeData_Handshake_PaddingDisabled) {
2766 creator_.set_fully_pad_crypto_handshake_packets(false);
2767
2768 delegate_.SetCanWriteAnything();
2769
2770 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2771 .WillOnce(
2772 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2773 std::string data = "foo";
2774 MakeIOVector(data, &iov_);
2775 size_t bytes_consumed = 0;
2776 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2777 bytes_consumed = creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
2778 } else {
2779 bytes_consumed =
2780 creator_
2781 .ConsumeData(
2782 QuicUtils::GetCryptoStreamId(framer_.transport_version()),
2783 &iov_, 1u, iov_.iov_len, 0, NO_FIN)
2784 .bytes_consumed;
2785 }
2786 EXPECT_EQ(3u, bytes_consumed);
2787 EXPECT_FALSE(creator_.HasPendingFrames());
2788 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2789
2790 PacketContents contents;
2791 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2792 contents.num_crypto_frames = 1;
2793 } else {
2794 contents.num_stream_frames = 1;
2795 }
2796 contents.num_padding_frames = 0;
2797 CheckPacketContains(contents, 0);
2798
2799 ASSERT_EQ(1u, packets_.size());
2800
2801 // Packet is not fully padded, but we want to future packets to be larger.
2802 ASSERT_EQ(kDefaultMaxPacketSize, creator_.max_packet_length());
2803 size_t expected_packet_length = 27;
2804 if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
2805 // The framing of CRYPTO frames is slightly different than that of stream
2806 // frames, so the expected packet length differs slightly.
2807 expected_packet_length = 28;
2808 }
2809 if (framer_.version().HasHeaderProtection()) {
2810 expected_packet_length = 29;
2811 }
2812 EXPECT_EQ(expected_packet_length, packets_[0].encrypted_length);
2813}
2814
2815TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_EmptyData) {
2816 delegate_.SetCanWriteAnything();
2817
2818 EXPECT_QUIC_BUG(creator_.ConsumeData(
2819 QuicUtils::QuicUtils::GetFirstBidirectionalStreamId(
2820 framer_.transport_version(), Perspective::IS_CLIENT),
2821 nullptr, 0, 0, 0, NO_FIN),
2822 "Attempt to consume empty data without FIN.");
2823}
2824
2825TEST_F(QuicPacketCreatorMultiplePacketsTest,
2826 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
2827 delegate_.SetCanWriteAnything();
2828
2829 MakeIOVector("foo", &iov_);
2830 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2831 framer_.transport_version(), Perspective::IS_CLIENT),
2832 &iov_, 1u, iov_.iov_len, 0, FIN);
2833 MakeIOVector("quux", &iov_);
2834 QuicConsumedData consumed =
2835 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 3, NO_FIN);
2836 EXPECT_EQ(4u, consumed.bytes_consumed);
2837 EXPECT_FALSE(consumed.fin_consumed);
2838 EXPECT_TRUE(creator_.HasPendingFrames());
2839 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2840}
2841
2842TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_BatchOperations) {
2843 delegate_.SetCanWriteAnything();
2844
2845 MakeIOVector("foo", &iov_);
2846 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
2847 framer_.transport_version(), Perspective::IS_CLIENT),
2848 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2849 MakeIOVector("quux", &iov_);
2850 QuicConsumedData consumed = creator_.ConsumeData(
2851 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2852 Perspective::IS_CLIENT),
2853 &iov_, 1u, iov_.iov_len, 3, FIN);
2854 EXPECT_EQ(4u, consumed.bytes_consumed);
2855 EXPECT_TRUE(consumed.fin_consumed);
2856 EXPECT_TRUE(creator_.HasPendingFrames());
2857 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2858
2859 // Now both frames will be flushed out.
2860 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2861 .WillOnce(
2862 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2863 creator_.Flush();
2864 EXPECT_FALSE(creator_.HasPendingFrames());
2865 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2866
2867 PacketContents contents;
renjietange426d622020-01-02 11:58:46 -08002868 contents.num_stream_frames = 1;
fayang4245c212019-11-05 13:33:46 -08002869 CheckPacketContains(contents, 0);
2870}
2871
2872TEST_F(QuicPacketCreatorMultiplePacketsTest,
2873 ConsumeData_FramesPreviouslyQueued) {
2874 // Set the packet size be enough for two stream frames with 0 stream offset,
2875 // but not enough for a stream frame of 0 offset and one with non-zero offset.
2876 size_t length =
2877 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
2878 GetPacketHeaderSize(
2879 framer_.transport_version(),
2880 creator_.GetDestinationConnectionIdLength(),
2881 creator_.GetSourceConnectionIdLength(),
2882 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
2883 !kIncludeDiversificationNonce,
2884 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
2885 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
2886 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
2887 // Add an extra 3 bytes for the payload and 1 byte so
2888 // BytesFree is larger than the GetMinStreamFrameSize.
2889 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0,
2890 false, 3) +
2891 3 +
2892 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(), 1, 0, true,
2893 1) +
2894 1;
2895 creator_.SetMaxPacketLength(length);
2896 delegate_.SetCanWriteAnything();
2897 {
2898 InSequence dummy;
2899 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2900 .WillOnce(
2901 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2902 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2903 .WillOnce(
2904 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2905 }
2906 // Queue enough data to prevent a stream frame with a non-zero offset from
2907 // fitting.
2908 MakeIOVector("foo", &iov_);
2909 QuicConsumedData consumed = creator_.ConsumeData(
2910 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2911 Perspective::IS_CLIENT),
2912 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
2913 EXPECT_EQ(3u, consumed.bytes_consumed);
2914 EXPECT_FALSE(consumed.fin_consumed);
2915 EXPECT_TRUE(creator_.HasPendingFrames());
2916 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2917
2918 // This frame will not fit with the existing frame, causing the queued frame
2919 // to be serialized, and it will be added to a new open packet.
2920 MakeIOVector("bar", &iov_);
2921 consumed = creator_.ConsumeData(
2922 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2923 Perspective::IS_CLIENT),
2924 &iov_, 1u, iov_.iov_len, 3, FIN);
2925 EXPECT_EQ(3u, consumed.bytes_consumed);
2926 EXPECT_TRUE(consumed.fin_consumed);
2927 EXPECT_TRUE(creator_.HasPendingFrames());
2928 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
2929
2930 creator_.FlushCurrentPacket();
2931 EXPECT_FALSE(creator_.HasPendingFrames());
2932 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2933
2934 PacketContents contents;
2935 contents.num_stream_frames = 1;
2936 CheckPacketContains(contents, 0);
2937 CheckPacketContains(contents, 1);
2938}
2939
2940TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataFastPath) {
2941 delegate_.SetCanWriteAnything();
2942 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
2943
2944 // Create a 10000 byte IOVector.
2945 CreateData(10000);
2946 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2947 .WillRepeatedly(
2948 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2949 QuicConsumedData consumed = creator_.ConsumeDataFastPath(
2950 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2951 Perspective::IS_CLIENT),
2952 &iov_, 1u, iov_.iov_len, 0, true);
2953 EXPECT_EQ(10000u, consumed.bytes_consumed);
2954 EXPECT_TRUE(consumed.fin_consumed);
2955 EXPECT_FALSE(creator_.HasPendingFrames());
2956 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2957
2958 PacketContents contents;
2959 contents.num_stream_frames = 1;
2960 CheckPacketContains(contents, 0);
2961 EXPECT_FALSE(packets_.empty());
wub8a5dafa2020-05-13 12:30:17 -07002962 SerializedPacket& packet = packets_.back();
fayang4245c212019-11-05 13:33:46 -08002963 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2964 EXPECT_EQ(LOSS_RETRANSMISSION, packet.transmission_type);
2965 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2966 const QuicStreamFrame& stream_frame =
2967 packet.retransmittable_frames.front().stream_frame;
2968 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2969}
2970
2971TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLarge) {
2972 delegate_.SetCanWriteAnything();
2973
2974 // Create a 10000 byte IOVector.
2975 CreateData(10000);
2976 EXPECT_CALL(delegate_, OnSerializedPacket(_))
2977 .WillRepeatedly(
2978 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
2979 QuicConsumedData consumed = creator_.ConsumeData(
2980 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
2981 Perspective::IS_CLIENT),
2982 &iov_, 1u, iov_.iov_len, 0, FIN);
2983 EXPECT_EQ(10000u, consumed.bytes_consumed);
2984 EXPECT_TRUE(consumed.fin_consumed);
2985 EXPECT_FALSE(creator_.HasPendingFrames());
2986 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
2987
2988 PacketContents contents;
2989 contents.num_stream_frames = 1;
2990 CheckPacketContains(contents, 0);
2991 EXPECT_FALSE(packets_.empty());
wub8a5dafa2020-05-13 12:30:17 -07002992 SerializedPacket& packet = packets_.back();
fayang4245c212019-11-05 13:33:46 -08002993 EXPECT_TRUE(!packet.retransmittable_frames.empty());
2994 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
2995 const QuicStreamFrame& stream_frame =
2996 packet.retransmittable_frames.front().stream_frame;
2997 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
2998}
2999
3000TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckFalse) {
3001 delegate_.SetCanNotWrite();
3002
3003 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3004 const bool success =
3005 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3006 /*bundle_ack=*/true);
3007 EXPECT_FALSE(success);
3008 EXPECT_FALSE(creator_.HasPendingFrames());
3009 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3010
3011 delegate_.SetCanWriteAnything();
3012
3013 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3014 /*bundle_ack=*/false);
3015
3016 // Create a 10000 byte IOVector.
3017 CreateData(10000);
3018 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3019 .WillRepeatedly(
3020 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3021 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateRstStreamFrame()),
3022 /*bundle_ack=*/true);
3023 QuicConsumedData consumed = creator_.ConsumeData(
3024 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3025 Perspective::IS_CLIENT),
3026 &iov_, 1u, iov_.iov_len, 0, FIN);
3027 creator_.Flush();
3028
3029 EXPECT_EQ(10000u, consumed.bytes_consumed);
3030 EXPECT_TRUE(consumed.fin_consumed);
3031 EXPECT_FALSE(creator_.HasPendingFrames());
3032 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3033
3034 EXPECT_FALSE(packets_.empty());
wub8a5dafa2020-05-13 12:30:17 -07003035 SerializedPacket& packet = packets_.back();
fayang4245c212019-11-05 13:33:46 -08003036 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3037 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3038 const QuicStreamFrame& stream_frame =
3039 packet.retransmittable_frames.front().stream_frame;
3040 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3041}
3042
3043TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeDataLargeSendAckTrue) {
fayang4245c212019-11-05 13:33:46 -08003044 delegate_.SetCanNotWrite();
3045 delegate_.SetCanWriteAnything();
3046
3047 // Create a 10000 byte IOVector.
3048 CreateData(10000);
3049 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3050 .WillRepeatedly(
3051 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3052 QuicConsumedData consumed = creator_.ConsumeData(
3053 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3054 Perspective::IS_CLIENT),
3055 &iov_, 1u, iov_.iov_len, 0, FIN);
3056 creator_.Flush();
3057
3058 EXPECT_EQ(10000u, consumed.bytes_consumed);
3059 EXPECT_TRUE(consumed.fin_consumed);
3060 EXPECT_FALSE(creator_.HasPendingFrames());
3061 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3062
3063 EXPECT_FALSE(packets_.empty());
wub8a5dafa2020-05-13 12:30:17 -07003064 SerializedPacket& packet = packets_.back();
fayang4245c212019-11-05 13:33:46 -08003065 EXPECT_TRUE(!packet.retransmittable_frames.empty());
3066 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3067 const QuicStreamFrame& stream_frame =
3068 packet.retransmittable_frames.front().stream_frame;
3069 EXPECT_EQ(10000u, stream_frame.data_length + stream_frame.offset);
3070}
3071
3072TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations) {
3073 delegate_.SetCanNotWrite();
3074
3075 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3076 const bool consumed =
3077 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3078 /*bundle_ack=*/true);
3079 EXPECT_FALSE(consumed);
3080 EXPECT_FALSE(creator_.HasPendingFrames());
3081 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3082 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3083
3084 delegate_.SetCanWriteAnything();
3085
3086 EXPECT_TRUE(
3087 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3088 /*bundle_ack=*/false));
3089 // Send some data and a control frame
3090 MakeIOVector("quux", &iov_);
3091 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3092 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3093 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3094 /*bundle_ack=*/false);
3095 }
3096 EXPECT_TRUE(creator_.HasPendingStreamFramesOfStream(3));
3097
3098 // All five frames will be flushed out in a single packet.
3099 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3100 .WillOnce(
3101 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3102 creator_.Flush();
3103 EXPECT_FALSE(creator_.HasPendingFrames());
3104 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3105 EXPECT_FALSE(creator_.HasPendingStreamFramesOfStream(3));
3106
3107 PacketContents contents;
3108 // ACK will be flushed by connection.
3109 contents.num_ack_frames = 0;
3110 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3111 contents.num_goaway_frames = 1;
3112 } else {
3113 contents.num_goaway_frames = 0;
3114 }
3115 contents.num_rst_stream_frames = 1;
3116 contents.num_stream_frames = 1;
3117 CheckPacketContains(contents, 0);
3118}
3119
3120TEST_F(QuicPacketCreatorMultiplePacketsTest, NotWritableThenBatchOperations2) {
3121 delegate_.SetCanNotWrite();
3122
3123 QuicRstStreamFrame* rst_frame = CreateRstStreamFrame();
3124 const bool success =
3125 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3126 /*bundle_ack=*/true);
3127 EXPECT_FALSE(success);
3128 EXPECT_FALSE(creator_.HasPendingFrames());
3129 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3130
3131 delegate_.SetCanWriteAnything();
3132
3133 {
3134 InSequence dummy;
3135 // All five frames will be flushed out in a single packet
3136 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3137 .WillOnce(
3138 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3139 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3140 .WillOnce(
3141 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3142 }
3143 EXPECT_TRUE(
3144 creator_.ConsumeRetransmittableControlFrame(QuicFrame(rst_frame),
3145 /*bundle_ack=*/false));
3146 // Send enough data to exceed one packet
3147 size_t data_len = kDefaultMaxPacketSize + 100;
3148 CreateData(data_len);
3149 QuicConsumedData consumed =
3150 creator_.ConsumeData(3, &iov_, 1u, iov_.iov_len, 0, FIN);
3151 EXPECT_EQ(data_len, consumed.bytes_consumed);
3152 EXPECT_TRUE(consumed.fin_consumed);
3153 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3154 creator_.ConsumeRetransmittableControlFrame(QuicFrame(CreateGoAwayFrame()),
3155 /*bundle_ack=*/false);
3156 }
3157
3158 creator_.Flush();
3159 EXPECT_FALSE(creator_.HasPendingFrames());
3160 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3161
3162 // The first packet should have the queued data and part of the stream data.
3163 PacketContents contents;
3164 // ACK will be sent by connection.
3165 contents.num_ack_frames = 0;
3166 contents.num_rst_stream_frames = 1;
3167 contents.num_stream_frames = 1;
3168 CheckPacketContains(contents, 0);
3169
3170 // The second should have the remainder of the stream data.
3171 PacketContents contents2;
3172 if (!VersionHasIetfQuicFrames(framer_.transport_version())) {
3173 contents2.num_goaway_frames = 1;
3174 } else {
3175 contents2.num_goaway_frames = 0;
3176 }
3177 contents2.num_stream_frames = 1;
3178 CheckPacketContains(contents2, 1);
3179}
3180
3181// Regression test of b/120493795.
3182TEST_F(QuicPacketCreatorMultiplePacketsTest, PacketTransmissionType) {
3183 delegate_.SetCanWriteAnything();
3184
3185 // The first ConsumeData will fill the packet without flush.
3186 creator_.SetTransmissionType(LOSS_RETRANSMISSION);
3187
3188 size_t data_len = 1324;
3189 CreateData(data_len);
3190 QuicStreamId stream1_id = QuicUtils::GetFirstBidirectionalStreamId(
3191 framer_.transport_version(), Perspective::IS_CLIENT);
3192 QuicConsumedData consumed =
3193 creator_.ConsumeData(stream1_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3194 EXPECT_EQ(data_len, consumed.bytes_consumed);
3195 ASSERT_EQ(0u, creator_.BytesFree())
3196 << "Test setup failed: Please increase data_len to "
3197 << data_len + creator_.BytesFree() << " bytes.";
3198
3199 // The second ConsumeData can not be added to the packet and will flush.
3200 creator_.SetTransmissionType(NOT_RETRANSMISSION);
3201
3202 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3203 .WillOnce(
3204 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3205
3206 QuicStreamId stream2_id = stream1_id + 4;
3207
3208 consumed =
3209 creator_.ConsumeData(stream2_id, &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3210 EXPECT_EQ(data_len, consumed.bytes_consumed);
3211
3212 // Ensure the packet is successfully created.
3213 ASSERT_EQ(1u, packets_.size());
3214 ASSERT_TRUE(packets_[0].encrypted_buffer);
3215 ASSERT_EQ(1u, packets_[0].retransmittable_frames.size());
3216 EXPECT_EQ(stream1_id,
3217 packets_[0].retransmittable_frames[0].stream_frame.stream_id);
3218
3219 // Since the second frame was not added, the packet's transmission type
3220 // should be the first frame's type.
3221 EXPECT_EQ(packets_[0].transmission_type, LOSS_RETRANSMISSION);
3222}
3223
3224TEST_F(QuicPacketCreatorMultiplePacketsTest, TestConnectionIdLength) {
3225 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
3226 creator_.SetServerConnectionIdLength(0);
3227 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3228 creator_.GetDestinationConnectionIdLength());
3229
3230 for (size_t i = 1; i < 10; i++) {
3231 creator_.SetServerConnectionIdLength(i);
dschinazicc7d40d2020-12-02 11:28:18 -08003232 if (framer_.version().HasIetfInvariantHeader()) {
fayang4245c212019-11-05 13:33:46 -08003233 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
3234 creator_.GetDestinationConnectionIdLength());
3235 } else {
3236 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID,
3237 creator_.GetDestinationConnectionIdLength());
3238 }
3239 }
3240}
3241
3242// Test whether SetMaxPacketLength() works in the situation when the queue is
3243// empty, and we send three packets worth of data.
3244TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Initial) {
3245 delegate_.SetCanWriteAnything();
3246
3247 // Send enough data for three packets.
3248 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
3249 size_t packet_len = kDefaultMaxPacketSize + 100;
3250 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3251 creator_.SetMaxPacketLength(packet_len);
3252 EXPECT_EQ(packet_len, creator_.max_packet_length());
3253
3254 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3255 .Times(3)
3256 .WillRepeatedly(
3257 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3258 CreateData(data_len);
3259 QuicConsumedData consumed = creator_.ConsumeData(
3260 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3261 Perspective::IS_CLIENT),
3262 &iov_, 1u, iov_.iov_len,
3263 /*offset=*/0, FIN);
3264 EXPECT_EQ(data_len, consumed.bytes_consumed);
3265 EXPECT_TRUE(consumed.fin_consumed);
3266 EXPECT_FALSE(creator_.HasPendingFrames());
3267 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3268
3269 // We expect three packets, and first two of them have to be of packet_len
3270 // size. We check multiple packets (instead of just one) because we want to
3271 // ensure that |max_packet_length_| does not get changed incorrectly by the
3272 // creator after first packet is serialized.
3273 ASSERT_EQ(3u, packets_.size());
3274 EXPECT_EQ(packet_len, packets_[0].encrypted_length);
3275 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3276 CheckAllPacketsHaveSingleStreamFrame();
3277}
3278
3279// Test whether SetMaxPacketLength() works in the situation when we first write
3280// data, then change packet size, then write data again.
3281TEST_F(QuicPacketCreatorMultiplePacketsTest, SetMaxPacketLength_Middle) {
3282 delegate_.SetCanWriteAnything();
3283
3284 // We send enough data to overflow default packet length, but not the altered
3285 // one.
3286 size_t data_len = kDefaultMaxPacketSize;
3287 size_t packet_len = kDefaultMaxPacketSize + 100;
3288 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3289
3290 // We expect to see three packets in total.
3291 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3292 .Times(3)
3293 .WillRepeatedly(
3294 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3295
3296 // Send two packets before packet size change.
3297 CreateData(data_len);
3298 QuicConsumedData consumed = creator_.ConsumeData(
3299 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3300 Perspective::IS_CLIENT),
3301 &iov_, 1u, iov_.iov_len,
3302 /*offset=*/0, NO_FIN);
3303 creator_.Flush();
3304 EXPECT_EQ(data_len, consumed.bytes_consumed);
3305 EXPECT_FALSE(consumed.fin_consumed);
3306 EXPECT_FALSE(creator_.HasPendingFrames());
3307 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3308
3309 // Make sure we already have two packets.
3310 ASSERT_EQ(2u, packets_.size());
3311
3312 // Increase packet size.
3313 creator_.SetMaxPacketLength(packet_len);
3314 EXPECT_EQ(packet_len, creator_.max_packet_length());
3315
3316 // Send a packet after packet size change.
3317 CreateData(data_len);
3318 creator_.AttachPacketFlusher();
3319 consumed = creator_.ConsumeData(
3320 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3321 Perspective::IS_CLIENT),
3322 &iov_, 1u, iov_.iov_len, data_len, FIN);
3323 creator_.Flush();
3324 EXPECT_EQ(data_len, consumed.bytes_consumed);
3325 EXPECT_TRUE(consumed.fin_consumed);
3326 EXPECT_FALSE(creator_.HasPendingFrames());
3327 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3328
3329 // We expect first data chunk to get fragmented, but the second one to fit
3330 // into a single packet.
3331 ASSERT_EQ(3u, packets_.size());
3332 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3333 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length);
3334 CheckAllPacketsHaveSingleStreamFrame();
3335}
3336
3337// Test whether SetMaxPacketLength() works correctly when we force the change of
3338// the packet size in the middle of the batched packet.
3339TEST_F(QuicPacketCreatorMultiplePacketsTest,
3340 SetMaxPacketLength_MidpacketFlush) {
3341 delegate_.SetCanWriteAnything();
3342
3343 size_t first_write_len = kDefaultMaxPacketSize / 2;
3344 size_t packet_len = kDefaultMaxPacketSize + 100;
3345 size_t second_write_len = packet_len + 1;
3346 ASSERT_LE(packet_len, kMaxOutgoingPacketSize);
3347
3348 // First send half of the packet worth of data. We are in the batch mode, so
3349 // should not cause packet serialization.
3350 CreateData(first_write_len);
3351 QuicConsumedData consumed = creator_.ConsumeData(
3352 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3353 Perspective::IS_CLIENT),
3354 &iov_, 1u, iov_.iov_len,
3355 /*offset=*/0, NO_FIN);
3356 EXPECT_EQ(first_write_len, consumed.bytes_consumed);
3357 EXPECT_FALSE(consumed.fin_consumed);
3358 EXPECT_TRUE(creator_.HasPendingFrames());
3359 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3360
3361 // Make sure we have no packets so far.
3362 ASSERT_EQ(0u, packets_.size());
3363
3364 // Expect a packet to be flushed.
3365 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3366 .WillOnce(
3367 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3368
3369 // Increase packet size after flushing all frames.
3370 // Ensure it's immediately enacted.
3371 creator_.FlushCurrentPacket();
3372 creator_.SetMaxPacketLength(packet_len);
3373 EXPECT_EQ(packet_len, creator_.max_packet_length());
3374 EXPECT_FALSE(creator_.HasPendingFrames());
3375 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3376
3377 // We expect to see exactly one packet serialized after that, because we send
3378 // a value somewhat exceeding new max packet size, and the tail data does not
3379 // get serialized because we are still in the batch mode.
3380 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3381 .WillOnce(
3382 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3383
3384 // Send a more than a packet worth of data to the same stream. This should
3385 // trigger serialization of one packet, and queue another one.
3386 CreateData(second_write_len);
3387 consumed = creator_.ConsumeData(
3388 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3389 Perspective::IS_CLIENT),
3390 &iov_, 1u, iov_.iov_len,
3391 /*offset=*/first_write_len, FIN);
3392 EXPECT_EQ(second_write_len, consumed.bytes_consumed);
3393 EXPECT_TRUE(consumed.fin_consumed);
3394 EXPECT_TRUE(creator_.HasPendingFrames());
3395 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3396
3397 // We expect the first packet to be underfilled, and the second packet be up
3398 // to the new max packet size.
3399 ASSERT_EQ(2u, packets_.size());
3400 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3401 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
3402
3403 CheckAllPacketsHaveSingleStreamFrame();
3404}
3405
3406// Test sending a connectivity probing packet.
3407TEST_F(QuicPacketCreatorMultiplePacketsTest,
3408 GenerateConnectivityProbingPacket) {
3409 delegate_.SetCanWriteAnything();
3410
wub8a5dafa2020-05-13 12:30:17 -07003411 std::unique_ptr<SerializedPacket> probing_packet;
fayang4245c212019-11-05 13:33:46 -08003412 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3413 QuicPathFrameBuffer payload = {
3414 {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
3415 probing_packet =
danzh28ba4722020-11-12 11:55:39 -08003416 creator_.SerializePathChallengeConnectivityProbingPacket(payload);
fayang4245c212019-11-05 13:33:46 -08003417 } else {
3418 probing_packet = creator_.SerializeConnectivityProbingPacket();
3419 }
3420
3421 ASSERT_TRUE(simple_framer_.ProcessPacket(QuicEncryptedPacket(
3422 probing_packet->encrypted_buffer, probing_packet->encrypted_length)));
3423
3424 EXPECT_EQ(2u, simple_framer_.num_frames());
3425 if (VersionHasIetfQuicFrames(framer_.transport_version())) {
3426 EXPECT_EQ(1u, simple_framer_.path_challenge_frames().size());
3427 } else {
3428 EXPECT_EQ(1u, simple_framer_.ping_frames().size());
3429 }
3430 EXPECT_EQ(1u, simple_framer_.padding_frames().size());
3431}
3432
3433// Test sending an MTU probe, without any surrounding data.
3434TEST_F(QuicPacketCreatorMultiplePacketsTest,
3435 GenerateMtuDiscoveryPacket_Simple) {
3436 delegate_.SetCanWriteAnything();
3437
3438 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3439 static_assert(target_mtu < kMaxOutgoingPacketSize,
3440 "The MTU probe used by the test exceeds maximum packet size");
3441
3442 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3443 .WillOnce(
3444 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3445
3446 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3447
3448 EXPECT_FALSE(creator_.HasPendingFrames());
3449 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3450 ASSERT_EQ(1u, packets_.size());
3451 EXPECT_EQ(target_mtu, packets_[0].encrypted_length);
3452
3453 PacketContents contents;
3454 contents.num_mtu_discovery_frames = 1;
3455 contents.num_padding_frames = 1;
3456 CheckPacketContains(contents, 0);
3457}
3458
3459// Test sending an MTU probe. Surround it with data, to ensure that it resets
3460// the MTU to the value before the probe was sent.
3461TEST_F(QuicPacketCreatorMultiplePacketsTest,
3462 GenerateMtuDiscoveryPacket_SurroundedByData) {
3463 delegate_.SetCanWriteAnything();
3464
3465 const size_t target_mtu = kDefaultMaxPacketSize + 100;
3466 static_assert(target_mtu < kMaxOutgoingPacketSize,
3467 "The MTU probe used by the test exceeds maximum packet size");
3468
3469 // Send enough data so it would always cause two packets to be sent.
3470 const size_t data_len = target_mtu + 1;
3471
3472 // Send a total of five packets: two packets before the probe, the probe
3473 // itself, and two packets after the probe.
3474 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3475 .Times(5)
3476 .WillRepeatedly(
3477 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3478
3479 // Send data before the MTU probe.
3480 CreateData(data_len);
3481 QuicConsumedData consumed = creator_.ConsumeData(
3482 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3483 Perspective::IS_CLIENT),
3484 &iov_, 1u, iov_.iov_len,
3485 /*offset=*/0, NO_FIN);
3486 creator_.Flush();
3487 EXPECT_EQ(data_len, consumed.bytes_consumed);
3488 EXPECT_FALSE(consumed.fin_consumed);
3489 EXPECT_FALSE(creator_.HasPendingFrames());
3490 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3491
3492 // Send the MTU probe.
3493 creator_.GenerateMtuDiscoveryPacket(target_mtu);
3494 EXPECT_FALSE(creator_.HasPendingFrames());
3495 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3496
3497 // Send data after the MTU probe.
3498 CreateData(data_len);
3499 creator_.AttachPacketFlusher();
3500 consumed = creator_.ConsumeData(
3501 QuicUtils::GetFirstBidirectionalStreamId(framer_.transport_version(),
3502 Perspective::IS_CLIENT),
3503 &iov_, 1u, iov_.iov_len,
3504 /*offset=*/data_len, FIN);
3505 creator_.Flush();
3506 EXPECT_EQ(data_len, consumed.bytes_consumed);
3507 EXPECT_TRUE(consumed.fin_consumed);
3508 EXPECT_FALSE(creator_.HasPendingFrames());
3509 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3510
3511 ASSERT_EQ(5u, packets_.size());
3512 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
3513 EXPECT_EQ(target_mtu, packets_[2].encrypted_length);
3514 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length);
3515
3516 PacketContents probe_contents;
3517 probe_contents.num_mtu_discovery_frames = 1;
3518 probe_contents.num_padding_frames = 1;
3519
3520 CheckPacketHasSingleStreamFrame(0);
3521 CheckPacketHasSingleStreamFrame(1);
3522 CheckPacketContains(probe_contents, 2);
3523 CheckPacketHasSingleStreamFrame(3);
3524 CheckPacketHasSingleStreamFrame(4);
3525}
3526
3527TEST_F(QuicPacketCreatorMultiplePacketsTest, DontCrashOnInvalidStopWaiting) {
3528 if (VersionSupportsMessageFrames(framer_.transport_version())) {
3529 return;
3530 }
3531 // Test added to ensure the creator does not crash when an invalid frame is
3532 // added. Because this is an indication of internal programming errors,
3533 // DFATALs are expected.
3534 // A 1 byte packet number length can't encode a gap of 1000.
3535 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1000);
3536
3537 delegate_.SetCanNotWrite();
3538 delegate_.SetCanWriteAnything();
3539
3540 // This will not serialize any packets, because of the invalid frame.
3541 EXPECT_CALL(delegate_,
3542 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _));
3543 EXPECT_QUIC_BUG(creator_.Flush(),
3544 "packet_number_length 1 is too small "
3545 "for least_unacked_delta: 1001");
3546}
3547
3548// Regression test for b/31486443.
3549TEST_F(QuicPacketCreatorMultiplePacketsTest,
3550 ConnectionCloseFrameLargerThanPacketSize) {
3551 delegate_.SetCanWriteAnything();
3552 char buf[2000] = {};
vasilvvc872ee42020-10-07 19:50:22 -07003553 absl::string_view error_details(buf, 2000);
fayang4245c212019-11-05 13:33:46 -08003554 const QuicErrorCode kQuicErrorCode = QUIC_PACKET_WRITE_ERROR;
3555
3556 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
3557 framer_.transport_version(), kQuicErrorCode, std::string(error_details),
3558 /*transport_close_frame_type=*/0);
3559 creator_.ConsumeRetransmittableControlFrame(QuicFrame(frame),
3560 /*bundle_ack=*/false);
3561 EXPECT_TRUE(creator_.HasPendingFrames());
3562 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3563}
3564
3565TEST_F(QuicPacketCreatorMultiplePacketsTest,
3566 RandomPaddingAfterFinSingleStreamSinglePacket) {
3567 const QuicByteCount kStreamFramePayloadSize = 100u;
3568 char buf[kStreamFramePayloadSize] = {};
3569 const QuicStreamId kDataStreamId = 5;
3570 // Set the packet size be enough for one stream frame with 0 stream offset and
3571 // max size of random padding.
3572 size_t length =
3573 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3574 GetPacketHeaderSize(
3575 framer_.transport_version(),
3576 creator_.GetDestinationConnectionIdLength(),
3577 creator_.GetSourceConnectionIdLength(),
3578 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3579 !kIncludeDiversificationNonce,
3580 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3581 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3582 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3583 QuicFramer::GetMinStreamFrameSize(
3584 framer_.transport_version(), kDataStreamId, 0,
3585 /*last_frame_in_packet=*/false,
3586 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes) +
3587 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes;
3588 creator_.SetMaxPacketLength(length);
3589 delegate_.SetCanWriteAnything();
3590 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3591 .WillOnce(
3592 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
vasilvvc872ee42020-10-07 19:50:22 -07003593 MakeIOVector(absl::string_view(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003594 QuicConsumedData consumed = creator_.ConsumeData(
3595 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3596 creator_.Flush();
3597 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3598 EXPECT_FALSE(creator_.HasPendingFrames());
3599 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3600
3601 EXPECT_EQ(1u, packets_.size());
3602 PacketContents contents;
3603 // The packet has both stream and padding frames.
3604 contents.num_padding_frames = 1;
3605 contents.num_stream_frames = 1;
3606 CheckPacketContains(contents, 0);
3607}
3608
3609TEST_F(QuicPacketCreatorMultiplePacketsTest,
3610 RandomPaddingAfterFinSingleStreamMultiplePackets) {
3611 const QuicByteCount kStreamFramePayloadSize = 100u;
3612 char buf[kStreamFramePayloadSize] = {};
3613 const QuicStreamId kDataStreamId = 5;
3614 // Set the packet size be enough for one stream frame with 0 stream offset +
3615 // 1. One or more packets will accommodate.
3616 size_t length =
3617 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3618 GetPacketHeaderSize(
3619 framer_.transport_version(),
3620 creator_.GetDestinationConnectionIdLength(),
3621 creator_.GetSourceConnectionIdLength(),
3622 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3623 !kIncludeDiversificationNonce,
3624 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3625 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3626 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3627 QuicFramer::GetMinStreamFrameSize(
3628 framer_.transport_version(), kDataStreamId, 0,
3629 /*last_frame_in_packet=*/false, kStreamFramePayloadSize + 1) +
3630 kStreamFramePayloadSize + 1;
3631 creator_.SetMaxPacketLength(length);
3632 delegate_.SetCanWriteAnything();
3633 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3634 .WillRepeatedly(
3635 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
vasilvvc872ee42020-10-07 19:50:22 -07003636 MakeIOVector(absl::string_view(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003637 QuicConsumedData consumed = creator_.ConsumeData(
3638 kDataStreamId, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3639 creator_.Flush();
3640 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3641 EXPECT_FALSE(creator_.HasPendingFrames());
3642 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3643
3644 EXPECT_LE(1u, packets_.size());
3645 PacketContents contents;
3646 // The first packet has both stream and padding frames.
3647 contents.num_stream_frames = 1;
3648 contents.num_padding_frames = 1;
3649 CheckPacketContains(contents, 0);
3650
3651 for (size_t i = 1; i < packets_.size(); ++i) {
3652 // Following packets only have paddings.
3653 contents.num_stream_frames = 0;
3654 contents.num_padding_frames = 1;
3655 CheckPacketContains(contents, i);
3656 }
3657}
3658
3659TEST_F(QuicPacketCreatorMultiplePacketsTest,
3660 RandomPaddingAfterFinMultipleStreamsMultiplePackets) {
3661 const QuicByteCount kStreamFramePayloadSize = 100u;
3662 char buf[kStreamFramePayloadSize] = {};
3663 const QuicStreamId kDataStreamId1 = 5;
3664 const QuicStreamId kDataStreamId2 = 6;
3665 // Set the packet size be enough for first frame with 0 stream offset + second
3666 // frame + 1 byte payload. two or more packets will accommodate.
3667 size_t length =
3668 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) +
3669 GetPacketHeaderSize(
3670 framer_.transport_version(),
3671 creator_.GetDestinationConnectionIdLength(),
3672 creator_.GetSourceConnectionIdLength(),
3673 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
3674 !kIncludeDiversificationNonce,
3675 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_),
3676 QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_), 0,
3677 QuicPacketCreatorPeer::GetLengthLength(&creator_)) +
3678 QuicFramer::GetMinStreamFrameSize(
3679 framer_.transport_version(), kDataStreamId1, 0,
3680 /*last_frame_in_packet=*/false, kStreamFramePayloadSize) +
3681 kStreamFramePayloadSize +
3682 QuicFramer::GetMinStreamFrameSize(framer_.transport_version(),
3683 kDataStreamId1, 0,
3684 /*last_frame_in_packet=*/false, 1) +
3685 1;
3686 creator_.SetMaxPacketLength(length);
3687 delegate_.SetCanWriteAnything();
3688 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3689 .WillRepeatedly(
3690 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
vasilvvc872ee42020-10-07 19:50:22 -07003691 MakeIOVector(absl::string_view(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003692 QuicConsumedData consumed = creator_.ConsumeData(
3693 kDataStreamId1, &iov_, 1u, iov_.iov_len, 0, FIN_AND_PADDING);
3694 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
vasilvvc872ee42020-10-07 19:50:22 -07003695 MakeIOVector(absl::string_view(buf, kStreamFramePayloadSize), &iov_);
fayang4245c212019-11-05 13:33:46 -08003696 consumed = creator_.ConsumeData(kDataStreamId2, &iov_, 1u, iov_.iov_len, 0,
3697 FIN_AND_PADDING);
3698 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed);
3699 creator_.Flush();
3700 EXPECT_FALSE(creator_.HasPendingFrames());
3701 EXPECT_FALSE(creator_.HasPendingRetransmittableFrames());
3702
3703 EXPECT_LE(2u, packets_.size());
3704 PacketContents contents;
3705 // The first packet has two stream frames.
3706 contents.num_stream_frames = 2;
3707 CheckPacketContains(contents, 0);
3708
3709 // The second packet has one stream frame and padding frames.
3710 contents.num_stream_frames = 1;
3711 contents.num_padding_frames = 1;
3712 CheckPacketContains(contents, 1);
3713
3714 for (size_t i = 2; i < packets_.size(); ++i) {
3715 // Following packets only have paddings.
3716 contents.num_stream_frames = 0;
3717 contents.num_padding_frames = 1;
3718 CheckPacketContains(contents, i);
3719 }
3720}
3721
3722TEST_F(QuicPacketCreatorMultiplePacketsTest, AddMessageFrame) {
3723 if (!VersionSupportsMessageFrames(framer_.transport_version())) {
3724 return;
3725 }
dschinazied459c02020-05-07 16:12:23 -07003726 if (framer_.version().UsesTls()) {
3727 creator_.SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
3728 }
fayang4245c212019-11-05 13:33:46 -08003729 quic::QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
3730 delegate_.SetCanWriteAnything();
3731 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3732 .WillOnce(
3733 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3734
3735 MakeIOVector("foo", &iov_);
3736 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3737 framer_.transport_version(), Perspective::IS_CLIENT),
3738 &iov_, 1u, iov_.iov_len, 0, FIN);
3739 EXPECT_EQ(
3740 MESSAGE_STATUS_SUCCESS,
3741 creator_.AddMessageFrame(1, MakeSpan(&allocator_, "message", &storage)));
3742 EXPECT_TRUE(creator_.HasPendingFrames());
3743 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3744
3745 // Add a message which causes the flush of current packet.
3746 EXPECT_EQ(
3747 MESSAGE_STATUS_SUCCESS,
3748 creator_.AddMessageFrame(
3749 2,
3750 MakeSpan(&allocator_,
3751 std::string(creator_.GetCurrentLargestMessagePayload(), 'a'),
3752 &storage)));
3753 EXPECT_TRUE(creator_.HasPendingRetransmittableFrames());
3754
3755 // Failed to send messages which cannot fit into one packet.
3756 EXPECT_EQ(
3757 MESSAGE_STATUS_TOO_LARGE,
3758 creator_.AddMessageFrame(
3759 3, MakeSpan(&allocator_,
3760 std::string(
3761 creator_.GetCurrentLargestMessagePayload() + 10, 'a'),
3762 &storage)));
3763}
3764
3765TEST_F(QuicPacketCreatorMultiplePacketsTest, ConnectionId) {
3766 creator_.SetServerConnectionId(TestConnectionId(0x1337));
3767 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3768 EXPECT_EQ(EmptyQuicConnectionId(), creator_.GetSourceConnectionId());
3769 if (!framer_.version().SupportsClientConnectionIds()) {
3770 return;
3771 }
3772 creator_.SetClientConnectionId(TestConnectionId(0x33));
3773 EXPECT_EQ(TestConnectionId(0x1337), creator_.GetDestinationConnectionId());
3774 EXPECT_EQ(TestConnectionId(0x33), creator_.GetSourceConnectionId());
3775}
3776
fayangfce2f722020-06-26 10:27:32 -07003777// Regresstion test for b/159812345.
3778TEST_F(QuicPacketCreatorMultiplePacketsTest, ExtraPaddingNeeded) {
3779 if (!framer_.version().HasHeaderProtection()) {
3780 return;
3781 }
3782 delegate_.SetCanWriteAnything();
3783
3784 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3785 .WillOnce(
3786 Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket));
3787 MakeIOVector("a", &iov_);
3788 creator_.ConsumeData(QuicUtils::GetFirstBidirectionalStreamId(
3789 framer_.transport_version(), Perspective::IS_CLIENT),
3790 &iov_, 1u, iov_.iov_len, 0, FIN);
3791 creator_.Flush();
3792 ASSERT_FALSE(packets_[0].nonretransmittable_frames.empty());
3793 QuicFrame padding = packets_[0].nonretransmittable_frames[0];
fayang7cd1d822020-08-25 13:52:19 -07003794 // Verify stream frame expansion is excluded.
3795 padding.padding_frame.num_padding_bytes = 3;
fayangfce2f722020-06-26 10:27:32 -07003796}
3797
danzh051bf772020-08-24 12:30:36 -07003798TEST_F(QuicPacketCreatorMultiplePacketsTest,
3799 PeerAddressContextWithSameAddress) {
3800 QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
3801 creator_.SetDefaultPeerAddress(peer_addr);
3802 // Send some stream data.
3803 MakeIOVector("foo", &iov_);
3804 EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
3805 .WillRepeatedly(Return(true));
3806 QuicConsumedData consumed = creator_.ConsumeData(
3807 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
3808 Perspective::IS_CLIENT),
3809 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3810 EXPECT_EQ(3u, consumed.bytes_consumed);
3811 EXPECT_TRUE(creator_.HasPendingFrames());
3812 {
3813 // Set a different address via context which should trigger flush.
3814 QuicPacketCreator::ScopedPeerAddressContext context(&creator_, peer_addr);
3815 EXPECT_TRUE(creator_.HasPendingFrames());
3816 // Queue another STREAM_FRAME.
3817 QuicConsumedData consumed = creator_.ConsumeData(
3818 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
3819 Perspective::IS_CLIENT),
3820 &iov_, 1u, iov_.iov_len, 0, FIN);
3821 EXPECT_EQ(3u, consumed.bytes_consumed);
3822 }
3823 // After exiting the scope, the last queued frame should be flushed.
3824 EXPECT_TRUE(creator_.HasPendingFrames());
3825 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3826 .WillOnce(Invoke([=](SerializedPacket packet) {
3827 EXPECT_EQ(peer_addr, packet.peer_address);
3828 ASSERT_EQ(2u, packet.retransmittable_frames.size());
3829 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3830 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.back().type);
3831 }));
3832 creator_.FlushCurrentPacket();
3833}
3834
3835TEST_F(QuicPacketCreatorMultiplePacketsTest,
3836 PeerAddressContextWithDifferentAddress) {
3837 QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
3838 creator_.SetDefaultPeerAddress(peer_addr);
3839 // Send some stream data.
3840 MakeIOVector("foo", &iov_);
3841 EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
3842 .WillRepeatedly(Return(true));
3843 QuicConsumedData consumed = creator_.ConsumeData(
3844 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
3845 Perspective::IS_CLIENT),
3846 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3847 EXPECT_EQ(3u, consumed.bytes_consumed);
3848
3849 QuicSocketAddress peer_addr1(QuicIpAddress::Any4(), 12346);
3850 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3851 .WillOnce(Invoke([=](SerializedPacket packet) {
3852 EXPECT_EQ(peer_addr, packet.peer_address);
3853 ASSERT_EQ(1u, packet.retransmittable_frames.size());
3854 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3855 }))
3856 .WillOnce(Invoke([=](SerializedPacket packet) {
3857 EXPECT_EQ(peer_addr1, packet.peer_address);
3858 ASSERT_EQ(1u, packet.retransmittable_frames.size());
3859 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3860 }));
3861 EXPECT_TRUE(creator_.HasPendingFrames());
3862 {
3863 // Set a different address via context which should trigger flush.
3864 QuicPacketCreator::ScopedPeerAddressContext context(&creator_, peer_addr1);
3865 EXPECT_FALSE(creator_.HasPendingFrames());
3866 // Queue another STREAM_FRAME.
3867 QuicConsumedData consumed = creator_.ConsumeData(
3868 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
3869 Perspective::IS_CLIENT),
3870 &iov_, 1u, iov_.iov_len, 0, FIN);
3871 EXPECT_EQ(3u, consumed.bytes_consumed);
3872 EXPECT_TRUE(creator_.HasPendingFrames());
3873 }
3874 // After exiting the scope, the last queued frame should be flushed.
3875 EXPECT_FALSE(creator_.HasPendingFrames());
3876}
3877
3878TEST_F(QuicPacketCreatorMultiplePacketsTest,
3879 NestedPeerAddressContextWithDifferentAddress) {
3880 QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
3881 creator_.SetDefaultPeerAddress(peer_addr);
3882 QuicPacketCreator::ScopedPeerAddressContext context(&creator_, peer_addr);
3883
3884 // Send some stream data.
3885 MakeIOVector("foo", &iov_);
3886 EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
3887 .WillRepeatedly(Return(true));
3888 QuicConsumedData consumed = creator_.ConsumeData(
3889 QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
3890 Perspective::IS_CLIENT),
3891 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3892 EXPECT_EQ(3u, consumed.bytes_consumed);
3893 EXPECT_TRUE(creator_.HasPendingFrames());
3894
3895 QuicSocketAddress peer_addr1(QuicIpAddress::Any4(), 12346);
3896 EXPECT_CALL(delegate_, OnSerializedPacket(_))
3897 .WillOnce(Invoke([=](SerializedPacket packet) {
3898 EXPECT_EQ(peer_addr, packet.peer_address);
3899 ASSERT_EQ(1u, packet.retransmittable_frames.size());
3900 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3901
3902 // Set up another context with a different address.
3903 QuicPacketCreator::ScopedPeerAddressContext context(&creator_,
3904 peer_addr1);
3905 MakeIOVector("foo", &iov_);
3906 EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
3907 .WillRepeatedly(Return(true));
3908 QuicConsumedData consumed = creator_.ConsumeData(
3909 QuicUtils::GetFirstBidirectionalStreamId(
3910 creator_.transport_version(), Perspective::IS_CLIENT),
3911 &iov_, 1u, iov_.iov_len, 0, NO_FIN);
3912 EXPECT_EQ(3u, consumed.bytes_consumed);
3913 EXPECT_TRUE(creator_.HasPendingFrames());
3914 // This should trigger another OnSerializedPacket() with the 2nd
3915 // address.
3916 creator_.FlushCurrentPacket();
3917 }))
3918 .WillOnce(Invoke([=](SerializedPacket packet) {
3919 EXPECT_EQ(peer_addr1, packet.peer_address);
3920 ASSERT_EQ(1u, packet.retransmittable_frames.size());
3921 EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
3922 }));
3923 creator_.FlushCurrentPacket();
3924}
3925
QUICHE teama6ef0a62019-03-07 20:34:33 -05003926} // namespace
3927} // namespace test
3928} // namespace quic