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