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