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