1 // Copyright 2013 The Chromium Authors
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/quic/quic_test_packet_maker.h"
6
7 #include <list>
8 #include <utility>
9
10 #include "base/strings/strcat.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "net/base/features.h"
13 #include "net/quic/mock_crypto_client_stream.h"
14 #include "net/quic/quic_chromium_client_session.h"
15 #include "net/quic/quic_http_utils.h"
16 #include "net/third_party/quiche/src/quiche/quic/core/http/http_constants.h"
17 #include "net/third_party/quiche/src/quiche/quic/core/quic_framer.h"
18 #include "net/third_party/quiche/src/quiche/quic/core/quic_stream.h"
19 #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
20 #include "net/third_party/quiche/src/quiche/quic/test_tools/mock_random.h"
21 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
22
23 namespace net::test {
24 namespace {
25
CloneFrames(const quic::QuicFrames & frames)26 quic::QuicFrames CloneFrames(const quic::QuicFrames& frames) {
27 quic::QuicFrames new_frames = frames;
28 for (auto& frame : new_frames) {
29 switch (frame.type) {
30 // Frames smaller than a pointer are inlined, so don't need to be cloned.
31 case quic::PADDING_FRAME:
32 case quic::MTU_DISCOVERY_FRAME:
33 case quic::PING_FRAME:
34 case quic::MAX_STREAMS_FRAME:
35 case quic::STOP_WAITING_FRAME:
36 case quic::STREAMS_BLOCKED_FRAME:
37 case quic::STREAM_FRAME:
38 case quic::HANDSHAKE_DONE_FRAME:
39 case quic::BLOCKED_FRAME:
40 case quic::WINDOW_UPDATE_FRAME:
41 case quic::STOP_SENDING_FRAME:
42 case quic::PATH_CHALLENGE_FRAME:
43 case quic::PATH_RESPONSE_FRAME:
44 break;
45 case quic::ACK_FRAME:
46 frame.ack_frame = new quic::QuicAckFrame(*frame.ack_frame);
47 break;
48 case quic::RST_STREAM_FRAME:
49 frame.rst_stream_frame =
50 new quic::QuicRstStreamFrame(*frame.rst_stream_frame);
51 break;
52 case quic::CONNECTION_CLOSE_FRAME:
53 frame.connection_close_frame =
54 new quic::QuicConnectionCloseFrame(*frame.connection_close_frame);
55 break;
56 case quic::GOAWAY_FRAME:
57 frame.goaway_frame = new quic::QuicGoAwayFrame(*frame.goaway_frame);
58 break;
59 case quic::NEW_CONNECTION_ID_FRAME:
60 frame.new_connection_id_frame =
61 new quic::QuicNewConnectionIdFrame(*frame.new_connection_id_frame);
62 break;
63 case quic::RETIRE_CONNECTION_ID_FRAME:
64 frame.retire_connection_id_frame =
65 new quic::QuicRetireConnectionIdFrame(
66 *frame.retire_connection_id_frame);
67 break;
68 case quic::MESSAGE_FRAME:
69 DCHECK(false) << "Message frame not supported";
70 // frame.message_frame = new
71 // quic::QuicMessageFrame(*frame.message_frame);
72 break;
73 case quic::CRYPTO_FRAME:
74 frame.crypto_frame = new quic::QuicCryptoFrame(*frame.crypto_frame);
75 break;
76 case quic::NEW_TOKEN_FRAME:
77 frame.new_token_frame =
78 new quic::QuicNewTokenFrame(*frame.new_token_frame);
79 break;
80 case quic::ACK_FREQUENCY_FRAME:
81 frame.ack_frequency_frame =
82 new quic::QuicAckFrequencyFrame(*frame.ack_frequency_frame);
83 break;
84
85 case quic::NUM_FRAME_TYPES:
86 DCHECK(false) << "Cannot clone frame type: " << frame.type;
87 }
88 }
89 return new_frames;
90 }
91
92
93 } // namespace
94
QuicTestPacketMaker(quic::ParsedQuicVersion version,quic::QuicConnectionId connection_id,const quic::QuicClock * clock,const std::string & host,quic::Perspective perspective,bool client_priority_uses_incremental)95 QuicTestPacketMaker::QuicTestPacketMaker(quic::ParsedQuicVersion version,
96 quic::QuicConnectionId connection_id,
97 const quic::QuicClock* clock,
98 const std::string& host,
99 quic::Perspective perspective,
100 bool client_priority_uses_incremental)
101 : version_(version),
102 connection_id_(connection_id),
103 clock_(clock),
104 host_(host),
105 qpack_encoder_(&decoder_stream_error_delegate_),
106 perspective_(perspective),
107 client_priority_uses_incremental_(client_priority_uses_incremental) {
108 DCHECK(!(perspective_ == quic::Perspective::IS_SERVER &&
109 client_priority_uses_incremental_));
110
111 qpack_encoder_.set_qpack_stream_sender_delegate(
112 &encoder_stream_sender_delegate_);
113 }
114
~QuicTestPacketMaker()115 QuicTestPacketMaker::~QuicTestPacketMaker() {
116 for (auto& kv : saved_frames_) {
117 quic::DeleteFrames(&(kv.second));
118 }
119 }
120
set_hostname(const std::string & host)121 void QuicTestPacketMaker::set_hostname(const std::string& host) {
122 host_.assign(host);
123 }
124
125 std::unique_ptr<quic::QuicReceivedPacket>
MakeConnectivityProbingPacket(uint64_t num,bool include_version)126 QuicTestPacketMaker::MakeConnectivityProbingPacket(uint64_t num,
127 bool include_version) {
128 InitializeHeader(num, include_version);
129
130 if (!version_.HasIetfQuicFrames()) {
131 AddQuicPingFrame();
132 } else if (perspective_ == quic::Perspective::IS_CLIENT) {
133 AddQuicPathChallengeFrame();
134 } else {
135 AddQuicPathResponseFrame();
136 }
137
138 AddQuicPaddingFrame();
139
140 return BuildPacket();
141 }
142
MakePingPacket(uint64_t num,bool include_version)143 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakePingPacket(
144 uint64_t num,
145 bool include_version) {
146 InitializeHeader(num, include_version);
147 AddQuicPingFrame();
148 return BuildPacket();
149 }
150
151 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetireConnectionIdPacket(uint64_t num,bool include_version,uint64_t sequence_number)152 QuicTestPacketMaker::MakeRetireConnectionIdPacket(uint64_t num,
153 bool include_version,
154 uint64_t sequence_number) {
155 InitializeHeader(num, include_version);
156 AddQuicRetireConnectionIdFrame(sequence_number);
157 return BuildPacket();
158 }
159
160 std::unique_ptr<quic::QuicReceivedPacket>
MakeNewConnectionIdPacket(uint64_t num,bool include_version,const quic::QuicConnectionId & cid,uint64_t sequence_number,uint64_t retire_prior_to)161 QuicTestPacketMaker::MakeNewConnectionIdPacket(
162 uint64_t num,
163 bool include_version,
164 const quic::QuicConnectionId& cid,
165 uint64_t sequence_number,
166 uint64_t retire_prior_to) {
167 InitializeHeader(num, include_version);
168 AddQuicNewConnectionIdFrame(
169 cid, sequence_number, retire_prior_to,
170 quic::QuicUtils::GenerateStatelessResetToken(cid));
171 return BuildPacket();
172 }
173
174 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndNewConnectionIdPacket(uint64_t num,bool include_version,uint64_t largest_received,uint64_t smallest_received,const quic::QuicConnectionId & cid,uint64_t sequence_number,uint64_t retire_prior_to)175 QuicTestPacketMaker::MakeAckAndNewConnectionIdPacket(
176 uint64_t num,
177 bool include_version,
178 uint64_t largest_received,
179 uint64_t smallest_received,
180 const quic::QuicConnectionId& cid,
181 uint64_t sequence_number,
182 uint64_t retire_prior_to) {
183 InitializeHeader(num, include_version);
184 AddQuicAckFrame(largest_received, smallest_received);
185 AddQuicNewConnectionIdFrame(
186 cid, sequence_number, retire_prior_to,
187 quic::QuicUtils::GenerateStatelessResetToken(cid));
188 return BuildPacket();
189 }
190
191 std::unique_ptr<quic::QuicReceivedPacket>
MakeDummyCHLOPacket(uint64_t packet_num)192 QuicTestPacketMaker::MakeDummyCHLOPacket(uint64_t packet_num) {
193 SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
194 InitializeHeader(packet_num, /*include_version=*/true);
195
196 quic::CryptoHandshakeMessage message =
197 MockCryptoClientStream::GetDummyCHLOMessage();
198 const quic::QuicData& data = message.GetSerialized();
199
200 if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
201 AddQuicStreamFrameWithOffset(
202 quic::QuicUtils::GetCryptoStreamId(version_.transport_version),
203 /*fin=*/false, /*offset=*/0, data.AsStringPiece());
204 } else {
205 AddQuicCryptoFrame(quic::ENCRYPTION_INITIAL, 0, data.length());
206
207 data_producer_ = std::make_unique<quic::test::SimpleDataProducer>();
208 data_producer_->SaveCryptoData(quic::ENCRYPTION_INITIAL, 0,
209 data.AsStringPiece());
210 }
211 AddQuicPaddingFrame();
212
213 return BuildPacket();
214 }
215
216 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndPingPacket(uint64_t num,bool include_version,uint64_t largest_received,uint64_t smallest_received)217 QuicTestPacketMaker::MakeAckAndPingPacket(uint64_t num,
218 bool include_version,
219 uint64_t largest_received,
220 uint64_t smallest_received) {
221 InitializeHeader(num, include_version);
222 AddQuicAckFrame(largest_received, smallest_received);
223 AddQuicPingFrame();
224 return BuildPacket();
225 }
226
227 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndRetireConnectionIdPacket(uint64_t num,bool include_version,uint64_t largest_received,uint64_t smallest_received,uint64_t sequence_number)228 QuicTestPacketMaker::MakeAckAndRetireConnectionIdPacket(
229 uint64_t num,
230 bool include_version,
231 uint64_t largest_received,
232 uint64_t smallest_received,
233 uint64_t sequence_number) {
234 InitializeHeader(num, include_version);
235 AddQuicAckFrame(largest_received, smallest_received);
236 AddQuicRetireConnectionIdFrame(sequence_number);
237 return BuildPacket();
238 }
239
240 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetransmissionAndRetireConnectionIdPacket(uint64_t num,bool include_version,const std::vector<uint64_t> & original_packet_numbers,uint64_t sequence_number)241 QuicTestPacketMaker::MakeRetransmissionAndRetireConnectionIdPacket(
242 uint64_t num,
243 bool include_version,
244 const std::vector<uint64_t>& original_packet_numbers,
245 uint64_t sequence_number) {
246 InitializeHeader(num, include_version);
247 for (auto it : original_packet_numbers) {
248 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
249 if (!MaybeCoalesceStreamFrame(frame)) {
250 frames_.push_back(frame);
251 }
252 }
253 }
254 AddQuicRetireConnectionIdFrame(sequence_number);
255 return BuildPacket();
256 }
257
258 std::unique_ptr<quic::QuicReceivedPacket>
MakeStreamsBlockedPacket(uint64_t num,bool include_version,quic::QuicStreamCount stream_count,bool unidirectional)259 QuicTestPacketMaker::MakeStreamsBlockedPacket(
260 uint64_t num,
261 bool include_version,
262 quic::QuicStreamCount stream_count,
263 bool unidirectional) {
264 InitializeHeader(num, include_version);
265 AddQuicStreamsBlockedFrame(1, stream_count, unidirectional);
266 return BuildPacket();
267 }
268
269 std::unique_ptr<quic::QuicReceivedPacket>
MakeMaxStreamsPacket(uint64_t num,bool include_version,quic::QuicStreamCount stream_count,bool unidirectional)270 QuicTestPacketMaker::MakeMaxStreamsPacket(uint64_t num,
271 bool include_version,
272 quic::QuicStreamCount stream_count,
273 bool unidirectional) {
274 InitializeHeader(num, include_version);
275 AddQuicMaxStreamsFrame(1, stream_count, unidirectional);
276 return BuildPacket();
277 }
278
MakeRstPacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code)279 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstPacket(
280 uint64_t num,
281 bool include_version,
282 quic::QuicStreamId stream_id,
283 quic::QuicRstStreamErrorCode error_code) {
284 return MakeRstPacket(num, include_version, stream_id, error_code,
285 /*include_stop_sending_if_v99=*/true);
286 }
287
MakeRstPacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,bool include_stop_sending_if_v99)288 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstPacket(
289 uint64_t num,
290 bool include_version,
291 quic::QuicStreamId stream_id,
292 quic::QuicRstStreamErrorCode error_code,
293 bool include_stop_sending_if_v99) {
294 InitializeHeader(num, include_version);
295
296 if (include_stop_sending_if_v99 && version_.HasIetfQuicFrames()) {
297 AddQuicStopSendingFrame(stream_id, error_code);
298 }
299 if (!version_.HasIetfQuicFrames() ||
300 quic::QuicUtils::IsBidirectionalStreamId(stream_id, version_)) {
301 AddQuicRstStreamFrame(stream_id, error_code);
302 }
303
304 return BuildPacket();
305 }
306
307 std::unique_ptr<quic::QuicReceivedPacket>
MakeRstAndDataPacket(uint64_t num,bool include_version,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode rst_error_code,quic::QuicStreamId data_stream_id,absl::string_view data)308 QuicTestPacketMaker::MakeRstAndDataPacket(
309 uint64_t num,
310 bool include_version,
311 quic::QuicStreamId rst_stream_id,
312 quic::QuicRstStreamErrorCode rst_error_code,
313 quic::QuicStreamId data_stream_id,
314 absl::string_view data) {
315 InitializeHeader(num, include_version);
316
317 if (version_.HasIetfQuicFrames()) {
318 AddQuicStopSendingFrame(rst_stream_id, rst_error_code);
319 }
320 AddQuicRstStreamFrame(rst_stream_id, rst_error_code);
321
322 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
323
324 return BuildPacket();
325 }
326
327 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetransmissionRstAndDataPacket(const std::vector<uint64_t> & original_packet_numbers,uint64_t num,bool include_version,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode rst_error_code,quic::QuicStreamId data_stream_id,absl::string_view data,uint64_t retransmit_frame_count)328 QuicTestPacketMaker::MakeRetransmissionRstAndDataPacket(
329 const std::vector<uint64_t>& original_packet_numbers,
330 uint64_t num,
331 bool include_version,
332 quic::QuicStreamId rst_stream_id,
333 quic::QuicRstStreamErrorCode rst_error_code,
334 quic::QuicStreamId data_stream_id,
335 absl::string_view data,
336 uint64_t retransmit_frame_count) {
337 DCHECK(save_packet_frames_);
338 InitializeHeader(num, include_version);
339
340 uint64_t frame_count = 0;
341 for (auto it : original_packet_numbers) {
342 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
343 frame_count++;
344 if (retransmit_frame_count == 0 ||
345 frame_count <= retransmit_frame_count) {
346 if (!MaybeCoalesceStreamFrame(frame)) {
347 frames_.push_back(frame);
348 }
349 }
350 }
351 }
352
353 if (version_.HasIetfQuicFrames()) {
354 AddQuicStopSendingFrame(rst_stream_id, rst_error_code);
355 }
356 AddQuicRstStreamFrame(rst_stream_id, rst_error_code);
357
358 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
359
360 return BuildPacket();
361 }
362
363 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataAndRstPacket(uint64_t num,bool include_version,quic::QuicStreamId data_stream_id,absl::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode rst_error_code)364 QuicTestPacketMaker::MakeDataAndRstPacket(
365 uint64_t num,
366 bool include_version,
367 quic::QuicStreamId data_stream_id,
368 absl::string_view data,
369 quic::QuicStreamId rst_stream_id,
370 quic::QuicRstStreamErrorCode rst_error_code) {
371 InitializeHeader(num, include_version);
372
373 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
374 if (version_.HasIetfQuicFrames()) {
375 AddQuicStopSendingFrame(rst_stream_id, rst_error_code);
376 }
377 AddQuicRstStreamFrame(rst_stream_id, rst_error_code);
378
379 return BuildPacket();
380 }
381
382 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataRstAndAckPacket(uint64_t num,bool include_version,quic::QuicStreamId data_stream_id,absl::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode rst_error_code,uint64_t largest_received,uint64_t smallest_received)383 QuicTestPacketMaker::MakeDataRstAndAckPacket(
384 uint64_t num,
385 bool include_version,
386 quic::QuicStreamId data_stream_id,
387 absl::string_view data,
388 quic::QuicStreamId rst_stream_id,
389 quic::QuicRstStreamErrorCode rst_error_code,
390 uint64_t largest_received,
391 uint64_t smallest_received) {
392 InitializeHeader(num, include_version);
393
394 AddQuicAckFrame(largest_received, smallest_received);
395
396 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
397 if (version_.HasIetfQuicFrames()) {
398 AddQuicStopSendingFrame(rst_stream_id, rst_error_code);
399 }
400 AddQuicRstStreamFrame(rst_stream_id, rst_error_code);
401
402 return BuildPacket();
403 }
404
405 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndRstPacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received)406 QuicTestPacketMaker::MakeAckAndRstPacket(
407 uint64_t num,
408 bool include_version,
409 quic::QuicStreamId stream_id,
410 quic::QuicRstStreamErrorCode error_code,
411 uint64_t largest_received,
412 uint64_t smallest_received) {
413 return MakeAckAndRstPacket(num, include_version, stream_id, error_code,
414 largest_received, smallest_received,
415 /*include_stop_sending_if_v99=*/true);
416 }
417
418 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndRstPacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,bool include_stop_sending_if_v99)419 QuicTestPacketMaker::MakeAckAndRstPacket(
420 uint64_t num,
421 bool include_version,
422 quic::QuicStreamId stream_id,
423 quic::QuicRstStreamErrorCode error_code,
424 uint64_t largest_received,
425 uint64_t smallest_received,
426 bool include_stop_sending_if_v99) {
427 InitializeHeader(num, include_version);
428
429 AddQuicAckFrame(largest_received, smallest_received);
430
431 if (version_.HasIetfQuicFrames() && include_stop_sending_if_v99) {
432 AddQuicStopSendingFrame(stream_id, error_code);
433 }
434 if (!version_.HasIetfQuicFrames() ||
435 quic::QuicUtils::IsBidirectionalStreamId(stream_id, version_)) {
436 AddQuicRstStreamFrame(stream_id, error_code);
437 }
438
439 return BuildPacket();
440 }
441
442 std::unique_ptr<quic::QuicReceivedPacket>
MakeRstAckAndConnectionClosePacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicErrorCode quic_error,const std::string & quic_error_details)443 QuicTestPacketMaker::MakeRstAckAndConnectionClosePacket(
444 uint64_t num,
445 bool include_version,
446 quic::QuicStreamId stream_id,
447 quic::QuicRstStreamErrorCode error_code,
448 uint64_t largest_received,
449 uint64_t smallest_received,
450 quic::QuicErrorCode quic_error,
451 const std::string& quic_error_details) {
452 InitializeHeader(num, include_version);
453
454 AddQuicAckFrame(largest_received, smallest_received);
455
456 if (version_.HasIetfQuicFrames()) {
457 AddQuicStopSendingFrame(stream_id, error_code);
458 }
459 AddQuicRstStreamFrame(stream_id, error_code);
460 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
461
462 return BuildPacket();
463 }
464
465 std::unique_ptr<quic::QuicReceivedPacket>
MakeRstAckAndDataPacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId data_id,bool fin,absl::string_view data)466 QuicTestPacketMaker::MakeRstAckAndDataPacket(
467 uint64_t num,
468 bool include_version,
469 quic::QuicStreamId stream_id,
470 quic::QuicRstStreamErrorCode error_code,
471 uint64_t largest_received,
472 uint64_t smallest_received,
473 quic::QuicStreamId data_id,
474 bool fin,
475 absl::string_view data) {
476 InitializeHeader(num, include_version);
477
478 AddQuicRstStreamFrame(stream_id, error_code);
479
480 AddQuicAckFrame(largest_received, smallest_received);
481 AddQuicStreamFrame(data_id, fin, data);
482 return BuildPacket();
483 }
484
485 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckDataAndRst(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId data_id,bool fin,absl::string_view data)486 QuicTestPacketMaker::MakeAckDataAndRst(uint64_t num,
487 bool include_version,
488 quic::QuicStreamId stream_id,
489 quic::QuicRstStreamErrorCode error_code,
490 uint64_t largest_received,
491 uint64_t smallest_received,
492 quic::QuicStreamId data_id,
493 bool fin,
494 absl::string_view data) {
495 InitializeHeader(num, include_version);
496
497 AddQuicAckFrame(largest_received, smallest_received);
498 AddQuicStreamFrame(data_id, fin, data);
499
500 AddQuicStopSendingFrame(stream_id, error_code);
501 AddQuicRstStreamFrame(stream_id, error_code);
502
503 return BuildPacket();
504 }
505
506 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckRstAndDataPacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId data_id,bool fin,absl::string_view data)507 QuicTestPacketMaker::MakeAckRstAndDataPacket(
508 uint64_t num,
509 bool include_version,
510 quic::QuicStreamId stream_id,
511 quic::QuicRstStreamErrorCode error_code,
512 uint64_t largest_received,
513 uint64_t smallest_received,
514 quic::QuicStreamId data_id,
515 bool fin,
516 absl::string_view data) {
517 InitializeHeader(num, include_version);
518
519 AddQuicAckFrame(largest_received, smallest_received);
520 AddQuicRstStreamFrame(stream_id, error_code);
521 AddQuicStreamFrame(data_id, fin, data);
522 return BuildPacket();
523 }
524
525 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndRetransmissionPacket(uint64_t packet_number,uint64_t first_received,uint64_t largest_received,uint64_t smallest_received,const std::vector<uint64_t> & original_packet_numbers)526 QuicTestPacketMaker::MakeAckAndRetransmissionPacket(
527 uint64_t packet_number,
528 uint64_t first_received,
529 uint64_t largest_received,
530 uint64_t smallest_received,
531 const std::vector<uint64_t>& original_packet_numbers) {
532 DCHECK(save_packet_frames_);
533 InitializeHeader(packet_number, /*include_version=*/false);
534 AddQuicAckFrame(first_received, largest_received, smallest_received);
535 for (auto it : original_packet_numbers) {
536 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
537 if (!MaybeCoalesceStreamFrame(frame)) {
538 frames_.push_back(frame);
539 }
540 }
541 }
542
543 return BuildPacket();
544 }
545
546 std::unique_ptr<quic::QuicReceivedPacket>
MakeCombinedRetransmissionPacket(const std::vector<uint64_t> & original_packet_numbers,uint64_t new_packet_number,bool should_include_version)547 QuicTestPacketMaker::MakeCombinedRetransmissionPacket(
548 const std::vector<uint64_t>& original_packet_numbers,
549 uint64_t new_packet_number,
550 bool should_include_version) {
551 DCHECK(save_packet_frames_);
552 InitializeHeader(new_packet_number, should_include_version);
553 for (auto it : original_packet_numbers) {
554 for (auto& frame : CloneFrames(saved_frames_[quic::QuicPacketNumber(it)])) {
555 if (frame.type != quic::PADDING_FRAME) {
556 if (!MaybeCoalesceStreamFrame(frame)) {
557 frames_.push_back(frame);
558 }
559 }
560 }
561 }
562
563 return BuildPacket();
564 }
565
566 std::unique_ptr<quic::QuicReceivedPacket>
MakeRstAndConnectionClosePacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,quic::QuicErrorCode quic_error,const std::string & quic_error_details)567 QuicTestPacketMaker::MakeRstAndConnectionClosePacket(
568 uint64_t num,
569 bool include_version,
570 quic::QuicStreamId stream_id,
571 quic::QuicRstStreamErrorCode error_code,
572 quic::QuicErrorCode quic_error,
573 const std::string& quic_error_details) {
574 InitializeHeader(num, include_version);
575
576 if (version_.HasIetfQuicFrames()) {
577 AddQuicStopSendingFrame(stream_id, error_code);
578 }
579 AddQuicRstStreamFrame(stream_id, error_code);
580
581 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
582
583 return BuildPacket();
584 }
585
586 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataRstAndConnectionClosePacket(uint64_t num,bool include_version,quic::QuicStreamId data_stream_id,absl::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode error_code,quic::QuicErrorCode quic_error,const std::string & quic_error_details)587 QuicTestPacketMaker::MakeDataRstAndConnectionClosePacket(
588 uint64_t num,
589 bool include_version,
590 quic::QuicStreamId data_stream_id,
591 absl::string_view data,
592 quic::QuicStreamId rst_stream_id,
593 quic::QuicRstStreamErrorCode error_code,
594 quic::QuicErrorCode quic_error,
595 const std::string& quic_error_details) {
596 InitializeHeader(num, include_version);
597
598 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
599 if (version_.HasIetfQuicFrames()) {
600 AddQuicStopSendingFrame(rst_stream_id, error_code);
601 }
602 AddQuicRstStreamFrame(rst_stream_id, error_code);
603
604 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
605
606 return BuildPacket();
607 }
608
609 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataRstAckAndConnectionClosePacket(uint64_t num,bool include_version,quic::QuicStreamId data_stream_id,absl::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicErrorCode quic_error,const std::string & quic_error_details)610 QuicTestPacketMaker::MakeDataRstAckAndConnectionClosePacket(
611 uint64_t num,
612 bool include_version,
613 quic::QuicStreamId data_stream_id,
614 absl::string_view data,
615 quic::QuicStreamId rst_stream_id,
616 quic::QuicRstStreamErrorCode error_code,
617 uint64_t largest_received,
618 uint64_t smallest_received,
619 quic::QuicErrorCode quic_error,
620 const std::string& quic_error_details) {
621 InitializeHeader(num, include_version);
622
623 AddQuicAckFrame(largest_received, smallest_received);
624
625 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
626 if (version_.HasIetfQuicFrames()) {
627 AddQuicStopSendingFrame(rst_stream_id, error_code);
628 }
629 AddQuicRstStreamFrame(rst_stream_id, error_code);
630
631 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
632
633 return BuildPacket();
634 }
635
636 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataRstAckAndConnectionClosePacket(uint64_t num,bool include_version,quic::QuicStreamId data_stream_id,absl::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicErrorCode quic_error,const std::string & quic_error_details,uint64_t frame_type)637 QuicTestPacketMaker::MakeDataRstAckAndConnectionClosePacket(
638 uint64_t num,
639 bool include_version,
640 quic::QuicStreamId data_stream_id,
641 absl::string_view data,
642 quic::QuicStreamId rst_stream_id,
643 quic::QuicRstStreamErrorCode error_code,
644 uint64_t largest_received,
645 uint64_t smallest_received,
646 quic::QuicErrorCode quic_error,
647 const std::string& quic_error_details,
648 uint64_t frame_type) {
649 InitializeHeader(num, include_version);
650
651 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
652 if (version_.HasIetfQuicFrames()) {
653 AddQuicStopSendingFrame(rst_stream_id, error_code);
654 }
655 AddQuicRstStreamFrame(rst_stream_id, error_code);
656
657 AddQuicAckFrame(largest_received, smallest_received);
658 AddQuicConnectionCloseFrame(quic_error, quic_error_details, frame_type);
659
660 return BuildPacket();
661 }
662
663 std::unique_ptr<quic::QuicReceivedPacket>
MakeStopSendingPacket(uint64_t num,bool include_version,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code)664 QuicTestPacketMaker::MakeStopSendingPacket(
665 uint64_t num,
666 bool include_version,
667 quic::QuicStreamId stream_id,
668 quic::QuicRstStreamErrorCode error_code) {
669 DCHECK(version_.HasIetfQuicFrames());
670
671 InitializeHeader(num, include_version);
672 AddQuicStopSendingFrame(stream_id, error_code);
673
674 return BuildPacket();
675 }
676
677 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndConnectionClosePacket(uint64_t num,bool include_version,uint64_t largest_received,uint64_t smallest_received,quic::QuicErrorCode quic_error,const std::string & quic_error_details,uint64_t frame_type)678 QuicTestPacketMaker::MakeAckAndConnectionClosePacket(
679 uint64_t num,
680 bool include_version,
681 uint64_t largest_received,
682 uint64_t smallest_received,
683 quic::QuicErrorCode quic_error,
684 const std::string& quic_error_details,
685 uint64_t frame_type) {
686 InitializeHeader(num, include_version);
687 AddQuicAckFrame(largest_received, smallest_received);
688 AddQuicConnectionCloseFrame(quic_error, quic_error_details, frame_type);
689 return BuildPacket();
690 }
691
692 std::unique_ptr<quic::QuicReceivedPacket>
MakeConnectionClosePacket(uint64_t num,bool include_version,quic::QuicErrorCode quic_error,const std::string & quic_error_details)693 QuicTestPacketMaker::MakeConnectionClosePacket(
694 uint64_t num,
695 bool include_version,
696 quic::QuicErrorCode quic_error,
697 const std::string& quic_error_details) {
698 InitializeHeader(num, include_version);
699 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
700 return BuildPacket();
701 }
702
MakeGoAwayPacket(uint64_t num,quic::QuicErrorCode error_code,std::string reason_phrase)703 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeGoAwayPacket(
704 uint64_t num,
705 quic::QuicErrorCode error_code,
706 std::string reason_phrase) {
707 InitializeHeader(num, /*include_version=*/false);
708 AddQuicGoAwayFrame(error_code, reason_phrase);
709 return BuildPacket();
710 }
711
MakeAckPacket(uint64_t packet_number,uint64_t largest_received,uint64_t smallest_received)712 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeAckPacket(
713 uint64_t packet_number,
714 uint64_t largest_received,
715 uint64_t smallest_received) {
716 return MakeAckPacket(packet_number, 1, largest_received, smallest_received);
717 }
718
MakeAckPacket(uint64_t packet_number,uint64_t first_received,uint64_t largest_received,uint64_t smallest_received)719 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeAckPacket(
720 uint64_t packet_number,
721 uint64_t first_received,
722 uint64_t largest_received,
723 uint64_t smallest_received) {
724 InitializeHeader(packet_number, /*include_version=*/false);
725 AddQuicAckFrame(first_received, largest_received, smallest_received);
726 return BuildPacket();
727 }
728
MakeDataPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool should_include_version,bool fin,absl::string_view data)729 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeDataPacket(
730 uint64_t packet_number,
731 quic::QuicStreamId stream_id,
732 bool should_include_version,
733 bool fin,
734 absl::string_view data) {
735 InitializeHeader(packet_number, should_include_version);
736 AddQuicStreamFrame(stream_id, fin, data);
737 return BuildPacket();
738 }
739
740 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndDataPacket(uint64_t packet_number,bool include_version,quic::QuicStreamId stream_id,uint64_t largest_received,uint64_t smallest_received,bool fin,absl::string_view data)741 QuicTestPacketMaker::MakeAckAndDataPacket(uint64_t packet_number,
742 bool include_version,
743 quic::QuicStreamId stream_id,
744 uint64_t largest_received,
745 uint64_t smallest_received,
746 bool fin,
747 absl::string_view data) {
748 InitializeHeader(packet_number, include_version);
749
750 AddQuicAckFrame(largest_received, smallest_received);
751 AddQuicStreamFrame(stream_id, fin, data);
752
753 return BuildPacket();
754 }
755
756 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckRetransmissionAndDataPacket(uint64_t packet_number,bool include_version,const std::vector<uint64_t> & original_packet_numbers,quic::QuicStreamId stream_id,uint64_t largest_received,uint64_t smallest_received,bool fin,absl::string_view data)757 QuicTestPacketMaker::MakeAckRetransmissionAndDataPacket(
758 uint64_t packet_number,
759 bool include_version,
760 const std::vector<uint64_t>& original_packet_numbers,
761 quic::QuicStreamId stream_id,
762 uint64_t largest_received,
763 uint64_t smallest_received,
764 bool fin,
765 absl::string_view data) {
766 InitializeHeader(packet_number, include_version);
767
768 AddQuicAckFrame(largest_received, smallest_received);
769 for (auto it : original_packet_numbers) {
770 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
771 if (!MaybeCoalesceStreamFrame(frame)) {
772 frames_.push_back(frame);
773 }
774 }
775 }
776 AddQuicStreamFrame(stream_id, fin, data);
777
778 return BuildPacket();
779 }
780
781 std::unique_ptr<quic::QuicReceivedPacket>
MakeRequestHeadersAndMultipleDataFramesPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool should_include_version,bool fin,spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length,const std::vector<std::string> & data_writes)782 QuicTestPacketMaker::MakeRequestHeadersAndMultipleDataFramesPacket(
783 uint64_t packet_number,
784 quic::QuicStreamId stream_id,
785 bool should_include_version,
786 bool fin,
787 spdy::SpdyPriority spdy_priority,
788 spdy::Http2HeaderBlock headers,
789 size_t* spdy_headers_frame_length,
790 const std::vector<std::string>& data_writes) {
791 InitializeHeader(packet_number, should_include_version);
792
793 MaybeAddHttp3SettingsFrames();
794
795 std::string priority_data =
796 GenerateHttp3PriorityData(spdy_priority, stream_id);
797 if (!priority_data.empty()) {
798 AddQuicStreamFrame(2, false, priority_data);
799 }
800
801 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
802 spdy_headers_frame_length);
803 for (const auto& data_write : data_writes) {
804 data += data_write;
805 }
806 AddQuicStreamFrame(stream_id, fin, data);
807
808 return BuildPacket();
809 }
810
811 std::unique_ptr<quic::QuicReceivedPacket>
MakeRequestHeadersPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool should_include_version,bool fin,spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length,bool should_include_priority_frame)812 QuicTestPacketMaker::MakeRequestHeadersPacket(
813 uint64_t packet_number,
814 quic::QuicStreamId stream_id,
815 bool should_include_version,
816 bool fin,
817 spdy::SpdyPriority spdy_priority,
818 spdy::Http2HeaderBlock headers,
819 size_t* spdy_headers_frame_length,
820 bool should_include_priority_frame) {
821 InitializeHeader(packet_number, should_include_version);
822
823 MaybeAddHttp3SettingsFrames();
824
825 if (should_include_priority_frame) {
826 std::string priority_data =
827 GenerateHttp3PriorityData(spdy_priority, stream_id);
828 if (!priority_data.empty()) {
829 AddQuicStreamFrame(2, false, priority_data);
830 }
831 }
832
833 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
834 spdy_headers_frame_length);
835 AddQuicStreamFrame(stream_id, fin, data);
836
837 return BuildPacket();
838 }
839
840 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetransmissionAndRequestHeadersPacket(const std::vector<uint64_t> & original_packet_numbers,uint64_t packet_number,quic::QuicStreamId stream_id,bool should_include_version,bool fin,spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length)841 QuicTestPacketMaker::MakeRetransmissionAndRequestHeadersPacket(
842 const std::vector<uint64_t>& original_packet_numbers,
843 uint64_t packet_number,
844 quic::QuicStreamId stream_id,
845 bool should_include_version,
846 bool fin,
847 spdy::SpdyPriority spdy_priority,
848 spdy::Http2HeaderBlock headers,
849 size_t* spdy_headers_frame_length) {
850 DCHECK(save_packet_frames_);
851 InitializeHeader(packet_number, should_include_version);
852
853 for (auto it : original_packet_numbers) {
854 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
855 if (!MaybeCoalesceStreamFrame(frame)) {
856 frames_.push_back(frame);
857 }
858 }
859 }
860
861 MaybeAddHttp3SettingsFrames();
862
863 std::string priority_data =
864 GenerateHttp3PriorityData(spdy_priority, stream_id);
865 if (!priority_data.empty()) {
866 AddQuicStreamFrame(2, false, priority_data);
867 }
868
869 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
870 spdy_headers_frame_length);
871 AddQuicStreamFrame(stream_id, fin, data);
872
873 return BuildPacket();
874 }
875
876 std::unique_ptr<quic::QuicReceivedPacket>
MakeRequestHeadersAndRstPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool should_include_version,bool fin,spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length,quic::QuicRstStreamErrorCode error_code)877 QuicTestPacketMaker::MakeRequestHeadersAndRstPacket(
878 uint64_t packet_number,
879 quic::QuicStreamId stream_id,
880 bool should_include_version,
881 bool fin,
882 spdy::SpdyPriority spdy_priority,
883 spdy::Http2HeaderBlock headers,
884 size_t* spdy_headers_frame_length,
885 quic::QuicRstStreamErrorCode error_code) {
886 InitializeHeader(packet_number, should_include_version);
887
888 MaybeAddHttp3SettingsFrames();
889
890 std::string priority_data =
891 GenerateHttp3PriorityData(spdy_priority, stream_id);
892 if (!priority_data.empty()) {
893 AddQuicStreamFrame(2, false, priority_data);
894 }
895
896 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
897 spdy_headers_frame_length);
898 AddQuicStreamFrame(stream_id, fin, data);
899 AddQuicStopSendingFrame(stream_id, error_code);
900 AddQuicRstStreamFrame(stream_id, error_code);
901
902 return BuildPacket();
903 }
904
905 std::unique_ptr<quic::QuicReceivedPacket>
MakeResponseHeadersPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool should_include_version,bool fin,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length)906 QuicTestPacketMaker::MakeResponseHeadersPacket(
907 uint64_t packet_number,
908 quic::QuicStreamId stream_id,
909 bool should_include_version,
910 bool fin,
911 spdy::Http2HeaderBlock headers,
912 size_t* spdy_headers_frame_length) {
913 InitializeHeader(packet_number, should_include_version);
914
915 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
916 spdy_headers_frame_length);
917
918 AddQuicStreamFrame(stream_id, fin, data);
919
920 return BuildPacket();
921 }
922
923 std::unique_ptr<quic::QuicReceivedPacket>
MakeInitialSettingsPacket(uint64_t packet_number)924 QuicTestPacketMaker::MakeInitialSettingsPacket(uint64_t packet_number) {
925 InitializeHeader(packet_number, /*should_include_version*/ true);
926 MaybeAddHttp3SettingsFrames();
927 return BuildPacket();
928 }
929
930 std::unique_ptr<quic::QuicReceivedPacket>
MakePriorityPacket(uint64_t packet_number,bool should_include_version,quic::QuicStreamId id,spdy::SpdyPriority spdy_priority)931 QuicTestPacketMaker::MakePriorityPacket(uint64_t packet_number,
932 bool should_include_version,
933 quic::QuicStreamId id,
934 spdy::SpdyPriority spdy_priority) {
935 InitializeHeader(packet_number, should_include_version);
936
937 std::string priority_data = GenerateHttp3PriorityData(spdy_priority, id);
938 if (!priority_data.empty()) {
939 AddQuicStreamFrame(2, false, priority_data);
940 }
941
942 return BuildPacket();
943 }
944
945 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndPriorityPacket(uint64_t packet_number,bool should_include_version,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId id,spdy::SpdyPriority spdy_priority)946 QuicTestPacketMaker::MakeAckAndPriorityPacket(
947 uint64_t packet_number,
948 bool should_include_version,
949 uint64_t largest_received,
950 uint64_t smallest_received,
951 quic::QuicStreamId id,
952 spdy::SpdyPriority spdy_priority) {
953 InitializeHeader(packet_number, should_include_version);
954
955 AddQuicAckFrame(largest_received, smallest_received);
956
957 std::string priority_data = GenerateHttp3PriorityData(spdy_priority, id);
958 if (!priority_data.empty()) {
959 AddQuicStreamFrame(2, false, priority_data);
960 }
961
962 return BuildPacket();
963 }
964
965 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndPriorityUpdatePacket(uint64_t packet_number,bool should_include_version,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId id,spdy::SpdyPriority spdy_priority)966 QuicTestPacketMaker::MakeAckAndPriorityUpdatePacket(
967 uint64_t packet_number,
968 bool should_include_version,
969 uint64_t largest_received,
970 uint64_t smallest_received,
971 quic::QuicStreamId id,
972 spdy::SpdyPriority spdy_priority) {
973 InitializeHeader(packet_number, should_include_version);
974
975 AddQuicAckFrame(largest_received, smallest_received);
976
977 std::string priority_data = GenerateHttp3PriorityData(spdy_priority, id);
978 if (!priority_data.empty()) {
979 AddQuicStreamFrame(2, false, priority_data);
980 }
981
982 return BuildPacket();
983 }
984
985 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetransmissionPacket(uint64_t original_packet_number,uint64_t new_packet_number,bool should_include_version)986 QuicTestPacketMaker::MakeRetransmissionPacket(uint64_t original_packet_number,
987 uint64_t new_packet_number,
988 bool should_include_version) {
989 DCHECK(save_packet_frames_);
990 InitializeHeader(new_packet_number, should_include_version);
991 return BuildPacketImpl(
992 saved_frames_[quic::QuicPacketNumber(original_packet_number)], nullptr);
993 }
994
995 std::unique_ptr<quic::QuicEncryptedPacket>
MakeStatelessResetPacket()996 QuicTestPacketMaker::MakeStatelessResetPacket() {
997 auto connection_id = quic::test::TestConnectionId();
998 return quic::QuicFramer::BuildIetfStatelessResetPacket(
999 connection_id, quic::QuicFramer::GetMinStatelessResetPacketLength() + 1,
1000 quic::QuicUtils::GenerateStatelessResetToken(connection_id));
1001 }
1002
RemoveSavedStreamFrames(quic::QuicStreamId stream_id)1003 void QuicTestPacketMaker::RemoveSavedStreamFrames(
1004 quic::QuicStreamId stream_id) {
1005 for (auto& kv : saved_frames_) {
1006 auto* it = kv.second.begin();
1007 while (it != kv.second.end()) {
1008 if (it->type == quic::STREAM_FRAME &&
1009 it->stream_frame.stream_id == stream_id) {
1010 it = kv.second.erase(it);
1011 } else {
1012 ++it;
1013 }
1014 }
1015 }
1016 }
1017
SetEncryptionLevel(quic::EncryptionLevel level)1018 void QuicTestPacketMaker::SetEncryptionLevel(quic::EncryptionLevel level) {
1019 encryption_level_ = level;
1020 switch (level) {
1021 case quic::ENCRYPTION_INITIAL:
1022 long_header_type_ = quic::INITIAL;
1023 break;
1024 case quic::ENCRYPTION_ZERO_RTT:
1025 long_header_type_ = quic::ZERO_RTT_PROTECTED;
1026 break;
1027 case quic::ENCRYPTION_FORWARD_SECURE:
1028 long_header_type_ = quic::INVALID_PACKET_TYPE;
1029 break;
1030 default:
1031 LOG(DFATAL) << quic::EncryptionLevelToString(level);
1032 long_header_type_ = quic::INVALID_PACKET_TYPE;
1033 }
1034 }
1035
GetRequestHeaders(const std::string & method,const std::string & scheme,const std::string & path) const1036 spdy::Http2HeaderBlock QuicTestPacketMaker::GetRequestHeaders(
1037 const std::string& method,
1038 const std::string& scheme,
1039 const std::string& path) const {
1040 spdy::Http2HeaderBlock headers;
1041 headers[":method"] = method;
1042 headers[":authority"] = host_;
1043 headers[":scheme"] = scheme;
1044 headers[":path"] = path;
1045 return headers;
1046 }
1047
ConnectRequestHeaders(const std::string & host_port) const1048 spdy::Http2HeaderBlock QuicTestPacketMaker::ConnectRequestHeaders(
1049 const std::string& host_port) const {
1050 spdy::Http2HeaderBlock headers;
1051 headers[":method"] = "CONNECT";
1052 headers[":authority"] = host_port;
1053 return headers;
1054 }
1055
GetResponseHeaders(const std::string & status) const1056 spdy::Http2HeaderBlock QuicTestPacketMaker::GetResponseHeaders(
1057 const std::string& status) const {
1058 spdy::Http2HeaderBlock headers;
1059 headers[":status"] = status;
1060 headers["content-type"] = "text/plain";
1061 return headers;
1062 }
1063
GetResponseHeaders(const std::string & status,const std::string & alt_svc) const1064 spdy::Http2HeaderBlock QuicTestPacketMaker::GetResponseHeaders(
1065 const std::string& status,
1066 const std::string& alt_svc) const {
1067 spdy::Http2HeaderBlock headers;
1068 headers[":status"] = status;
1069 headers["alt-svc"] = alt_svc;
1070 headers["content-type"] = "text/plain";
1071 return headers;
1072 }
1073
Reset()1074 void QuicTestPacketMaker::Reset() {
1075 stream_offsets_.clear();
1076 }
1077
QpackEncodeHeaders(quic::QuicStreamId stream_id,spdy::Http2HeaderBlock headers,size_t * encoded_data_length)1078 std::string QuicTestPacketMaker::QpackEncodeHeaders(
1079 quic::QuicStreamId stream_id,
1080 spdy::Http2HeaderBlock headers,
1081 size_t* encoded_data_length) {
1082 std::string data;
1083
1084 std::string encoded_headers =
1085 qpack_encoder_.EncodeHeaderList(stream_id, headers, nullptr);
1086
1087 // Generate HEADERS frame header.
1088 const std::string headers_frame_header =
1089 quic::HttpEncoder::SerializeHeadersFrameHeader(encoded_headers.size());
1090
1091 // Possible add a PUSH stream type.
1092 if (!quic::QuicUtils::IsBidirectionalStreamId(stream_id, version_) &&
1093 stream_offsets_[stream_id] == 0) {
1094 // Push stream type header
1095 data += "\x01";
1096 }
1097
1098 // Add the HEADERS frame header.
1099 data += headers_frame_header;
1100 // Add the HEADERS frame payload.
1101 data += encoded_headers;
1102
1103 // Compute the total data length.
1104 if (encoded_data_length) {
1105 *encoded_data_length = data.length();
1106 }
1107 return data;
1108 }
1109
InitializeHeader(uint64_t packet_number,bool should_include_version)1110 void QuicTestPacketMaker::InitializeHeader(uint64_t packet_number,
1111 bool should_include_version) {
1112 header_.destination_connection_id = DestinationConnectionId();
1113 header_.destination_connection_id_included = HasDestinationConnectionId();
1114 header_.source_connection_id = SourceConnectionId();
1115 header_.source_connection_id_included = HasSourceConnectionId();
1116 header_.reset_flag = false;
1117 header_.version_flag = ShouldIncludeVersion(should_include_version);
1118 if (quic::VersionHasIetfInvariantHeader(version_.transport_version)) {
1119 header_.form = header_.version_flag ? quic::IETF_QUIC_LONG_HEADER_PACKET
1120 : quic::IETF_QUIC_SHORT_HEADER_PACKET;
1121 }
1122 header_.long_packet_type = long_header_type_;
1123 header_.packet_number_length = GetPacketNumberLength();
1124 header_.packet_number = quic::QuicPacketNumber(packet_number);
1125 if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
1126 header_.version_flag) {
1127 if (long_header_type_ == quic::INITIAL) {
1128 header_.retry_token_length_length =
1129 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
1130 }
1131 header_.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
1132 }
1133 }
1134
AddQuicPaddingFrame()1135 void QuicTestPacketMaker::AddQuicPaddingFrame() {
1136 quic::QuicPaddingFrame padding_frame;
1137 frames_.push_back(quic::QuicFrame(padding_frame));
1138 DVLOG(1) << "Adding frame: " << frames_.back();
1139 }
1140
AddQuicPingFrame()1141 void QuicTestPacketMaker::AddQuicPingFrame() {
1142 quic::QuicPingFrame ping_frame;
1143 frames_.push_back(quic::QuicFrame(ping_frame));
1144 DVLOG(1) << "Adding frame: " << frames_.back();
1145 }
1146
AddQuicRetireConnectionIdFrame(uint64_t sequence_number)1147 void QuicTestPacketMaker::AddQuicRetireConnectionIdFrame(
1148 uint64_t sequence_number) {
1149 auto* retire_cid_frame = new quic::QuicRetireConnectionIdFrame();
1150 retire_cid_frame->sequence_number = sequence_number;
1151 frames_.push_back(quic::QuicFrame(retire_cid_frame));
1152 DVLOG(1) << "Adding frame: " << frames_.back();
1153 }
1154
AddQuicNewConnectionIdFrame(const quic::QuicConnectionId & cid,uint64_t sequence_number,uint64_t retire_prior_to,quic::StatelessResetToken reset_token)1155 void QuicTestPacketMaker::AddQuicNewConnectionIdFrame(
1156 const quic::QuicConnectionId& cid,
1157 uint64_t sequence_number,
1158 uint64_t retire_prior_to,
1159 quic::StatelessResetToken reset_token) {
1160 auto* new_cid_frame = new quic::QuicNewConnectionIdFrame();
1161 new_cid_frame->connection_id = cid;
1162 new_cid_frame->sequence_number = sequence_number;
1163 new_cid_frame->retire_prior_to = retire_prior_to;
1164 new_cid_frame->stateless_reset_token = reset_token;
1165 frames_.push_back(quic::QuicFrame(new_cid_frame));
1166 DVLOG(1) << "Adding frame: " << frames_.back();
1167 }
1168
AddQuicMaxStreamsFrame(quic::QuicControlFrameId control_frame_id,quic::QuicStreamCount stream_count,bool unidirectional)1169 void QuicTestPacketMaker::AddQuicMaxStreamsFrame(
1170 quic::QuicControlFrameId control_frame_id,
1171 quic::QuicStreamCount stream_count,
1172 bool unidirectional) {
1173 quic::QuicMaxStreamsFrame max_streams_frame(control_frame_id, stream_count,
1174 unidirectional);
1175 frames_.push_back(quic::QuicFrame(max_streams_frame));
1176 DVLOG(1) << "Adding frame: " << frames_.back();
1177 }
1178
AddQuicStreamsBlockedFrame(quic::QuicControlFrameId control_frame_id,quic::QuicStreamCount stream_count,bool unidirectional)1179 void QuicTestPacketMaker::AddQuicStreamsBlockedFrame(
1180 quic::QuicControlFrameId control_frame_id,
1181 quic::QuicStreamCount stream_count,
1182 bool unidirectional) {
1183 quic::QuicStreamsBlockedFrame streams_blocked_frame(
1184 control_frame_id, stream_count, unidirectional);
1185 frames_.push_back(quic::QuicFrame(streams_blocked_frame));
1186 DVLOG(1) << "Adding frame: " << frames_.back();
1187 }
1188
AddQuicStreamFrame(quic::QuicStreamId stream_id,bool fin,absl::string_view data)1189 void QuicTestPacketMaker::AddQuicStreamFrame(quic::QuicStreamId stream_id,
1190 bool fin,
1191 absl::string_view data) {
1192 AddQuicStreamFrameWithOffset(stream_id, fin, stream_offsets_[stream_id],
1193 data);
1194 stream_offsets_[stream_id] += data.length();
1195 }
1196
AddQuicStreamFrameWithOffset(quic::QuicStreamId stream_id,bool fin,quic::QuicStreamOffset offset,absl::string_view data)1197 void QuicTestPacketMaker::AddQuicStreamFrameWithOffset(
1198 quic::QuicStreamId stream_id,
1199 bool fin,
1200 quic::QuicStreamOffset offset,
1201 absl::string_view data) {
1202 // Save the stream data so that callers can use temporary objects for data.
1203 saved_stream_data_.push_back(std::make_unique<std::string>(data));
1204 absl::string_view saved_data = *saved_stream_data_.back();
1205
1206 quic::QuicStreamFrame stream_frame(stream_id, fin, offset, saved_data);
1207 frames_.push_back(quic::QuicFrame(stream_frame));
1208 DVLOG(1) << "Adding frame: " << frames_.back();
1209 }
1210
AddQuicAckFrame(uint64_t largest_received,uint64_t smallest_received)1211 void QuicTestPacketMaker::AddQuicAckFrame(uint64_t largest_received,
1212 uint64_t smallest_received) {
1213 AddQuicAckFrame(1, largest_received, smallest_received);
1214 }
1215
AddQuicAckFrame(uint64_t first_received,uint64_t largest_received,uint64_t smallest_received)1216 void QuicTestPacketMaker::AddQuicAckFrame(uint64_t first_received,
1217 uint64_t largest_received,
1218 uint64_t smallest_received) {
1219 auto* ack_frame = new quic::QuicAckFrame;
1220 ack_frame->largest_acked = quic::QuicPacketNumber(largest_received);
1221 ack_frame->ack_delay_time = quic::QuicTime::Delta::Zero();
1222 for (uint64_t i = smallest_received; i <= largest_received; ++i) {
1223 ack_frame->received_packet_times.push_back(
1224 std::make_pair(quic::QuicPacketNumber(i), clock_->Now()));
1225 }
1226 if (largest_received > 0) {
1227 DCHECK_GE(largest_received, first_received);
1228 ack_frame->packets.AddRange(quic::QuicPacketNumber(first_received),
1229 quic::QuicPacketNumber(largest_received + 1));
1230 }
1231 frames_.push_back(quic::QuicFrame(ack_frame));
1232 DVLOG(1) << "Adding frame: " << frames_.back();
1233 }
1234
AddQuicRstStreamFrame(quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code)1235 void QuicTestPacketMaker::AddQuicRstStreamFrame(
1236 quic::QuicStreamId stream_id,
1237 quic::QuicRstStreamErrorCode error_code) {
1238 auto* rst_stream_frame = new quic::QuicRstStreamFrame(
1239 1, stream_id, error_code, stream_offsets_[stream_id]);
1240 frames_.push_back(quic::QuicFrame(rst_stream_frame));
1241 DVLOG(1) << "Adding frame: " << frames_.back();
1242 }
1243
AddQuicConnectionCloseFrame(quic::QuicErrorCode quic_error,const std::string & quic_error_details)1244 void QuicTestPacketMaker::AddQuicConnectionCloseFrame(
1245 quic::QuicErrorCode quic_error,
1246 const std::string& quic_error_details) {
1247 AddQuicConnectionCloseFrame(quic_error, quic_error_details, 0);
1248 }
1249
AddQuicConnectionCloseFrame(quic::QuicErrorCode quic_error,const std::string & quic_error_details,uint64_t frame_type)1250 void QuicTestPacketMaker::AddQuicConnectionCloseFrame(
1251 quic::QuicErrorCode quic_error,
1252 const std::string& quic_error_details,
1253 uint64_t frame_type) {
1254 auto* close_frame = new quic::QuicConnectionCloseFrame(
1255 version_.transport_version, quic_error, quic::NO_IETF_QUIC_ERROR,
1256 quic_error_details, frame_type);
1257 frames_.push_back(quic::QuicFrame(close_frame));
1258 DVLOG(1) << "Adding frame: " << frames_.back();
1259 }
1260
AddQuicGoAwayFrame(quic::QuicErrorCode error_code,std::string reason_phrase)1261 void QuicTestPacketMaker::AddQuicGoAwayFrame(quic::QuicErrorCode error_code,
1262 std::string reason_phrase) {
1263 auto* goaway_frame = new quic::QuicGoAwayFrame();
1264 goaway_frame->error_code = error_code;
1265 goaway_frame->last_good_stream_id = 0;
1266 goaway_frame->reason_phrase = reason_phrase;
1267 frames_.push_back(quic::QuicFrame(goaway_frame));
1268 DVLOG(1) << "Adding frame: " << frames_.back();
1269 }
1270
AddQuicPathResponseFrame()1271 void QuicTestPacketMaker::AddQuicPathResponseFrame() {
1272 quic::test::MockRandom rand(0);
1273 quic::QuicPathFrameBuffer payload;
1274 rand.RandBytes(payload.data(), payload.size());
1275 auto path_response_frame = quic::QuicPathResponseFrame(0, payload);
1276 frames_.push_back(quic::QuicFrame(path_response_frame));
1277 DVLOG(1) << "Adding frame: " << frames_.back();
1278 }
1279
AddQuicPathChallengeFrame()1280 void QuicTestPacketMaker::AddQuicPathChallengeFrame() {
1281 quic::test::MockRandom rand(0);
1282 quic::QuicPathFrameBuffer payload;
1283 rand.RandBytes(payload.data(), payload.size());
1284 auto path_challenge_frame = quic::QuicPathChallengeFrame(0, payload);
1285 frames_.push_back(quic::QuicFrame(path_challenge_frame));
1286 DVLOG(1) << "Adding frame: " << frames_.back();
1287 }
1288
AddQuicStopSendingFrame(quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code)1289 void QuicTestPacketMaker::AddQuicStopSendingFrame(
1290 quic::QuicStreamId stream_id,
1291 quic::QuicRstStreamErrorCode error_code) {
1292 auto stop_sending_frame =
1293 quic::QuicStopSendingFrame(1, stream_id, error_code);
1294 frames_.push_back(quic::QuicFrame(stop_sending_frame));
1295 DVLOG(1) << "Adding frame: " << frames_.back();
1296 }
1297
AddQuicCryptoFrame(quic::EncryptionLevel level,quic::QuicStreamOffset offset,quic::QuicPacketLength data_length)1298 void QuicTestPacketMaker::AddQuicCryptoFrame(
1299 quic::EncryptionLevel level,
1300 quic::QuicStreamOffset offset,
1301 quic::QuicPacketLength data_length) {
1302 auto* crypto_frame = new quic::QuicCryptoFrame(level, offset, data_length);
1303 frames_.push_back(quic::QuicFrame(crypto_frame));
1304 DVLOG(1) << "Adding frame: " << frames_.back();
1305 }
1306
BuildPacket()1307 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::BuildPacket() {
1308 auto packet = BuildPacketImpl(frames_, data_producer_.get());
1309
1310 DeleteFrames(&frames_);
1311 data_producer_.reset();
1312
1313 return packet;
1314 }
1315
BuildPacketImpl(const quic::QuicFrames & frames,quic::QuicStreamFrameDataProducer * data_producer)1316 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::BuildPacketImpl(
1317 const quic::QuicFrames& frames,
1318 quic::QuicStreamFrameDataProducer* data_producer) {
1319 quic::QuicFramer framer(quic::test::SupportedVersions(version_),
1320 clock_->Now(), perspective_,
1321 quic::kQuicDefaultConnectionIdLength);
1322 if (encryption_level_ == quic::ENCRYPTION_INITIAL) {
1323 framer.SetInitialObfuscators(perspective_ == quic::Perspective::IS_CLIENT
1324 ? header_.destination_connection_id
1325 : header_.source_connection_id);
1326 } else {
1327 framer.SetEncrypter(
1328 encryption_level_,
1329 std::make_unique<quic::test::TaggingEncrypter>( // IN-TEST
1330 encryption_level_));
1331 }
1332 if (data_producer != nullptr) {
1333 framer.set_data_producer(data_producer);
1334 }
1335 quic::QuicFrames frames_copy = CloneFrames(frames);
1336 size_t max_plaintext_size =
1337 framer.GetMaxPlaintextSize(quic::kDefaultMaxPacketSize);
1338 if (version_.HasHeaderProtection()) {
1339 size_t packet_size =
1340 quic::GetPacketHeaderSize(version_.transport_version, header_);
1341 size_t frames_size = 0;
1342 for (size_t i = 0; i < frames.size(); ++i) {
1343 bool first_frame = i == 0;
1344 bool last_frame = i == frames.size() - 1;
1345 const size_t frame_size = framer.GetSerializedFrameLength(
1346 frames[i], max_plaintext_size - packet_size, first_frame, last_frame,
1347 header_.packet_number_length);
1348 packet_size += frame_size;
1349 frames_size += frame_size;
1350 }
1351
1352 const size_t min_plaintext_packet_size =
1353 quic::QuicPacketCreator::MinPlaintextPacketSize(
1354 version_, header_.packet_number_length);
1355 if (frames_size < min_plaintext_packet_size) {
1356 frames_copy.insert(frames_copy.begin(),
1357 quic::QuicFrame(quic::QuicPaddingFrame(
1358 min_plaintext_packet_size - frames_size)));
1359 }
1360 }
1361 std::unique_ptr<quic::QuicPacket> packet(quic::test::BuildUnsizedDataPacket(
1362 &framer, header_, frames_copy, max_plaintext_size));
1363 char buffer[quic::kMaxOutgoingPacketSize];
1364 size_t encrypted_size =
1365 framer.EncryptPayload(encryption_level_, header_.packet_number, *packet,
1366 buffer, quic::kMaxOutgoingPacketSize);
1367 EXPECT_NE(0u, encrypted_size);
1368 quic::QuicReceivedPacket encrypted(buffer, encrypted_size, clock_->Now(),
1369 false);
1370 if (save_packet_frames_) {
1371 saved_frames_[header_.packet_number] = frames_copy;
1372 } else {
1373 saved_stream_data_.clear();
1374 DeleteFrames(&frames_copy);
1375 }
1376
1377 return encrypted.Clone();
1378 }
1379
ShouldIncludeVersion(bool include_version) const1380 bool QuicTestPacketMaker::ShouldIncludeVersion(bool include_version) const {
1381 if (version_.HasIetfInvariantHeader()) {
1382 return encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE;
1383 }
1384 return include_version;
1385 }
1386
GetPacketNumberLength() const1387 quic::QuicPacketNumberLength QuicTestPacketMaker::GetPacketNumberLength()
1388 const {
1389 if (version_.HasIetfInvariantHeader() &&
1390 encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE &&
1391 !version_.SendsVariableLengthPacketNumberInLongHeader()) {
1392 return quic::PACKET_4BYTE_PACKET_NUMBER;
1393 }
1394 return quic::PACKET_1BYTE_PACKET_NUMBER;
1395 }
1396
DestinationConnectionId() const1397 quic::QuicConnectionId QuicTestPacketMaker::DestinationConnectionId() const {
1398 if (perspective_ == quic::Perspective::IS_SERVER) {
1399 return quic::EmptyQuicConnectionId();
1400 }
1401 return connection_id_;
1402 }
1403
SourceConnectionId() const1404 quic::QuicConnectionId QuicTestPacketMaker::SourceConnectionId() const {
1405 if (perspective_ == quic::Perspective::IS_CLIENT) {
1406 return quic::EmptyQuicConnectionId();
1407 }
1408 return connection_id_;
1409 }
1410
HasDestinationConnectionId() const1411 quic::QuicConnectionIdIncluded QuicTestPacketMaker::HasDestinationConnectionId()
1412 const {
1413 if (!version_.SupportsClientConnectionIds() &&
1414 perspective_ == quic::Perspective::IS_SERVER) {
1415 return quic::CONNECTION_ID_ABSENT;
1416 }
1417 return quic::CONNECTION_ID_PRESENT;
1418 }
1419
HasSourceConnectionId() const1420 quic::QuicConnectionIdIncluded QuicTestPacketMaker::HasSourceConnectionId()
1421 const {
1422 if (version_.SupportsClientConnectionIds() ||
1423 (perspective_ == quic::Perspective::IS_SERVER &&
1424 encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE)) {
1425 return quic::CONNECTION_ID_PRESENT;
1426 }
1427 return quic::CONNECTION_ID_ABSENT;
1428 }
1429
GetFirstBidirectionalStreamId() const1430 quic::QuicStreamId QuicTestPacketMaker::GetFirstBidirectionalStreamId() const {
1431 return quic::QuicUtils::GetFirstBidirectionalStreamId(
1432 version_.transport_version, perspective_);
1433 }
1434
GetHeadersStreamId() const1435 quic::QuicStreamId QuicTestPacketMaker::GetHeadersStreamId() const {
1436 return quic::QuicUtils::GetHeadersStreamId(version_.transport_version);
1437 }
1438
GenerateHttp3SettingsData()1439 std::string QuicTestPacketMaker::GenerateHttp3SettingsData() {
1440 quic::SettingsFrame settings;
1441 settings.values[quic::SETTINGS_MAX_FIELD_SECTION_SIZE] =
1442 kQuicMaxHeaderListSize;
1443 settings.values[quic::SETTINGS_QPACK_MAX_TABLE_CAPACITY] =
1444 quic::kDefaultQpackMaxDynamicTableCapacity;
1445 settings.values[quic::SETTINGS_QPACK_BLOCKED_STREAMS] =
1446 quic::kDefaultMaximumBlockedStreams;
1447 // Greased setting.
1448 settings.values[0x40] = 20;
1449 return quic::HttpEncoder::SerializeSettingsFrame(settings);
1450 }
1451
GenerateHttp3PriorityData(spdy::SpdyPriority spdy_priority,quic::QuicStreamId stream_id)1452 std::string QuicTestPacketMaker::GenerateHttp3PriorityData(
1453 spdy::SpdyPriority spdy_priority,
1454 quic::QuicStreamId stream_id) {
1455 std::string priority_data;
1456 quic::PriorityUpdateFrame priority_update;
1457 quic::HttpStreamPriority priority{
1458 spdy_priority, quic::HttpStreamPriority::kDefaultIncremental};
1459 if (client_priority_uses_incremental_ &&
1460 base::FeatureList::IsEnabled(features::kPriorityIncremental)) {
1461 priority.incremental = kDefaultPriorityIncremental;
1462 }
1463
1464 if (priority.urgency != quic::HttpStreamPriority::kDefaultUrgency ||
1465 priority.incremental != quic::HttpStreamPriority::kDefaultIncremental) {
1466 priority_update.priority_field_value =
1467 quic::SerializePriorityFieldValue(priority);
1468 }
1469
1470 // Only generate a frame if a non-empty string was generated.
1471 if (!priority_update.priority_field_value.empty()) {
1472 priority_update.prioritized_element_id = stream_id;
1473 priority_data =
1474 quic::HttpEncoder::SerializePriorityUpdateFrame(priority_update);
1475 }
1476
1477 return priority_data;
1478 }
1479
GenerateHttp3GreaseData()1480 std::string QuicTestPacketMaker::GenerateHttp3GreaseData() {
1481 return quic::HttpEncoder::SerializeGreasingFrame();
1482 }
1483
MaybeAddHttp3SettingsFrames()1484 void QuicTestPacketMaker::MaybeAddHttp3SettingsFrames() {
1485 quic::QuicStreamId stream_id =
1486 quic::QuicUtils::GetFirstUnidirectionalStreamId(
1487 version_.transport_version, perspective_);
1488
1489 if (stream_offsets_[stream_id] != 0)
1490 return;
1491
1492 // A stream frame containing stream type will be written on the control
1493 // stream first.
1494 std::string type(1, 0x00);
1495 std::string settings_data = GenerateHttp3SettingsData();
1496 std::string grease_data = GenerateHttp3GreaseData();
1497
1498 // The type and the SETTINGS frame may be sent in multiple QUIC STREAM
1499 // frames.
1500 std::string data = type + settings_data + grease_data;
1501
1502 AddQuicStreamFrame(stream_id, false, data);
1503 }
1504
MaybeCoalesceStreamFrame(const quic::QuicFrame & frame)1505 bool QuicTestPacketMaker::MaybeCoalesceStreamFrame(
1506 const quic::QuicFrame& frame) {
1507 if (frames_.empty()) {
1508 return false;
1509 }
1510 if (frame.type != quic::STREAM_FRAME ||
1511 frames_.back().type != quic::STREAM_FRAME) {
1512 return false;
1513 }
1514
1515 // Make sure they are congruent data segments in the stream.
1516 const quic::QuicStreamFrame* new_frame = &frame.stream_frame;
1517 quic::QuicStreamFrame* previous_frame = &frames_.back().stream_frame;
1518 if (new_frame->stream_id != previous_frame->stream_id ||
1519 new_frame->offset !=
1520 previous_frame->offset + previous_frame->data_length) {
1521 return false;
1522 }
1523
1524 // Extend the data buffer to include the data from both frames (into a copy
1525 // buffer). This doesn't attempt to limit coalescing to a particular packet
1526 // size limit and may need to be updated if a test comes along that
1527 // retransmits enough stream data to span multiple packets.
1528 std::string data(previous_frame->data_buffer, previous_frame->data_length);
1529 data += std::string(new_frame->data_buffer, new_frame->data_length);
1530 saved_stream_data_.push_back(std::make_unique<std::string>(data));
1531 absl::string_view saved_data = *saved_stream_data_.back();
1532 previous_frame->data_buffer = saved_data.data();
1533 previous_frame->data_length = saved_data.length();
1534
1535 // Copy the fin state from the last frame.
1536 previous_frame->fin = new_frame->fin;
1537
1538 return true;
1539 }
1540
1541 } // namespace net::test
1542