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