1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/quic/test_tools/quic_test_packet_maker.h"
7 #include "net/quic/quic_framer.h"
8 #include "net/quic/quic_http_utils.h"
9 #include "net/quic/quic_utils.h"
10 #include "net/quic/test_tools/quic_test_utils.h"
15 QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version
,
16 QuicConnectionId connection_id
)
18 connection_id_(connection_id
),
19 spdy_request_framer_(SPDY3
),
20 spdy_response_framer_(SPDY3
) {
23 QuicTestPacketMaker::~QuicTestPacketMaker() {
26 scoped_ptr
<QuicEncryptedPacket
> QuicTestPacketMaker::MakeRstPacket(
27 QuicPacketSequenceNumber num
,
29 QuicStreamId stream_id
,
30 QuicRstStreamErrorCode error_code
) {
31 QuicPacketHeader header
;
32 header
.public_header
.connection_id
= connection_id_
;
33 header
.public_header
.reset_flag
= false;
34 header
.public_header
.version_flag
= include_version
;
35 header
.public_header
.sequence_number_length
= PACKET_1BYTE_SEQUENCE_NUMBER
;
36 header
.packet_sequence_number
= num
;
37 header
.entropy_flag
= false;
38 header
.fec_flag
= false;
41 QuicRstStreamFrame
rst(stream_id
, error_code
, 0);
42 return scoped_ptr
<QuicEncryptedPacket
>(MakePacket(header
, QuicFrame(&rst
)));
45 scoped_ptr
<QuicEncryptedPacket
> QuicTestPacketMaker::MakeAckAndRstPacket(
46 QuicPacketSequenceNumber num
,
48 QuicStreamId stream_id
,
49 QuicRstStreamErrorCode error_code
,
50 QuicPacketSequenceNumber largest_received
,
51 QuicPacketSequenceNumber least_unacked
,
54 QuicPacketHeader header
;
55 header
.public_header
.connection_id
= connection_id_
;
56 header
.public_header
.reset_flag
= false;
57 header
.public_header
.version_flag
= include_version
;
58 header
.public_header
.sequence_number_length
= PACKET_1BYTE_SEQUENCE_NUMBER
;
59 header
.packet_sequence_number
= num
;
60 header
.entropy_flag
= false;
61 header
.fec_flag
= false;
64 QuicAckFrame
ack(MakeAckFrame(largest_received
));
65 ack
.delta_time_largest_observed
= QuicTime::Delta::Zero();
67 frames
.push_back(QuicFrame(&ack
));
68 QuicCongestionFeedbackFrame feedback
;
71 feedback
.tcp
.receive_window
= 256000;
73 frames
.push_back(QuicFrame(&feedback
));
76 QuicStopWaitingFrame stop_waiting
;
77 stop_waiting
.least_unacked
= least_unacked
;
78 frames
.push_back(QuicFrame(&stop_waiting
));
80 QuicRstStreamFrame
rst(stream_id
, error_code
, 0);
81 frames
.push_back(QuicFrame(&rst
));
83 QuicFramer
framer(SupportedVersions(version_
), QuicTime::Zero(), false);
84 scoped_ptr
<QuicPacket
> packet(
85 BuildUnsizedDataPacket(&framer
, header
, frames
).packet
);
86 return scoped_ptr
<QuicEncryptedPacket
>(framer
.EncryptPacket(
87 ENCRYPTION_NONE
, header
.packet_sequence_number
, *packet
));
90 scoped_ptr
<QuicEncryptedPacket
> QuicTestPacketMaker::MakeConnectionClosePacket(
91 QuicPacketSequenceNumber num
) {
92 QuicPacketHeader header
;
93 header
.public_header
.connection_id
= connection_id_
;
94 header
.public_header
.reset_flag
= false;
95 header
.public_header
.version_flag
= false;
96 header
.public_header
.sequence_number_length
= PACKET_1BYTE_SEQUENCE_NUMBER
;
97 header
.packet_sequence_number
= num
;
98 header
.entropy_flag
= false;
99 header
.fec_flag
= false;
100 header
.fec_group
= 0;
102 QuicConnectionCloseFrame close
;
103 close
.error_code
= QUIC_CRYPTO_VERSION_NOT_SUPPORTED
;
104 close
.error_details
= "Time to panic!";
105 return scoped_ptr
<QuicEncryptedPacket
>(MakePacket(header
, QuicFrame(&close
)));
108 scoped_ptr
<QuicEncryptedPacket
> QuicTestPacketMaker::MakeAckPacket(
109 QuicPacketSequenceNumber sequence_number
,
110 QuicPacketSequenceNumber largest_received
,
111 QuicPacketSequenceNumber least_unacked
,
112 bool send_feedback
) {
113 QuicPacketHeader header
;
114 header
.public_header
.connection_id
= connection_id_
;
115 header
.public_header
.reset_flag
= false;
116 header
.public_header
.version_flag
= false;
117 header
.public_header
.sequence_number_length
= PACKET_1BYTE_SEQUENCE_NUMBER
;
118 header
.packet_sequence_number
= sequence_number
;
119 header
.entropy_flag
= false;
120 header
.fec_flag
= false;
121 header
.fec_group
= 0;
123 QuicAckFrame
ack(MakeAckFrame(largest_received
));
124 ack
.delta_time_largest_observed
= QuicTime::Delta::Zero();
126 QuicCongestionFeedbackFrame feedback
;
127 feedback
.type
= kTCP
;
128 feedback
.tcp
.receive_window
= 256000;
130 QuicFramer
framer(SupportedVersions(version_
), QuicTime::Zero(), false);
132 frames
.push_back(QuicFrame(&ack
));
134 frames
.push_back(QuicFrame(&feedback
));
137 QuicStopWaitingFrame stop_waiting
;
138 stop_waiting
.least_unacked
= least_unacked
;
139 frames
.push_back(QuicFrame(&stop_waiting
));
141 scoped_ptr
<QuicPacket
> packet(
142 BuildUnsizedDataPacket(&framer
, header
, frames
).packet
);
143 return scoped_ptr
<QuicEncryptedPacket
>(framer
.EncryptPacket(
144 ENCRYPTION_NONE
, header
.packet_sequence_number
, *packet
));
147 // Returns a newly created packet to send kData on stream 1.
148 scoped_ptr
<QuicEncryptedPacket
> QuicTestPacketMaker::MakeDataPacket(
149 QuicPacketSequenceNumber sequence_number
,
150 QuicStreamId stream_id
,
151 bool should_include_version
,
153 QuicStreamOffset offset
,
154 base::StringPiece data
) {
155 InitializeHeader(sequence_number
, should_include_version
);
156 QuicStreamFrame
frame(stream_id
, fin
, offset
, MakeIOVector(data
));
157 return MakePacket(header_
, QuicFrame(&frame
));
160 scoped_ptr
<QuicEncryptedPacket
> QuicTestPacketMaker::MakeRequestHeadersPacket(
161 QuicPacketSequenceNumber sequence_number
,
162 QuicStreamId stream_id
,
163 bool should_include_version
,
165 const SpdyHeaderBlock
& headers
) {
166 InitializeHeader(sequence_number
, should_include_version
);
167 SpdySynStreamIR
syn_stream(stream_id
);
168 syn_stream
.set_name_value_block(headers
);
169 syn_stream
.set_fin(fin
);
170 syn_stream
.set_priority(0);
171 scoped_ptr
<SpdySerializedFrame
> spdy_frame(
172 spdy_request_framer_
.SerializeSynStream(syn_stream
));
173 QuicStreamFrame
frame(kHeadersStreamId
, false, 0,
174 MakeIOVector(base::StringPiece(spdy_frame
->data(),
175 spdy_frame
->size())));
176 return MakePacket(header_
, QuicFrame(&frame
));
179 scoped_ptr
<QuicEncryptedPacket
> QuicTestPacketMaker::MakeResponseHeadersPacket(
180 QuicPacketSequenceNumber sequence_number
,
181 QuicStreamId stream_id
,
182 bool should_include_version
,
184 const SpdyHeaderBlock
& headers
) {
185 InitializeHeader(sequence_number
, should_include_version
);
186 SpdySynReplyIR
syn_reply(stream_id
);
187 syn_reply
.set_name_value_block(headers
);
188 syn_reply
.set_fin(fin
);
189 scoped_ptr
<SpdySerializedFrame
> spdy_frame(
190 spdy_response_framer_
.SerializeSynReply(syn_reply
));
191 QuicStreamFrame
frame(kHeadersStreamId
, false, 0,
192 MakeIOVector(base::StringPiece(spdy_frame
->data(),
193 spdy_frame
->size())));
194 return MakePacket(header_
, QuicFrame(&frame
));
197 SpdyHeaderBlock
QuicTestPacketMaker::GetRequestHeaders(
198 const std::string
& method
,
199 const std::string
& scheme
,
200 const std::string
& path
) {
201 SpdyHeaderBlock headers
;
202 headers
[":method"] = method
;
203 headers
[":host"] = "www.google.com";
204 headers
[":path"] = path
;
205 headers
[":scheme"] = scheme
;
206 headers
[":version"] = "HTTP/1.1";
210 SpdyHeaderBlock
QuicTestPacketMaker::GetResponseHeaders(
211 const std::string
& status
) {
212 SpdyHeaderBlock headers
;
213 headers
[":status"] = status
;
214 headers
[":version"] = "HTTP/1.1";
215 headers
["content-type"] = "text/plain";
219 scoped_ptr
<QuicEncryptedPacket
> QuicTestPacketMaker::MakePacket(
220 const QuicPacketHeader
& header
,
221 const QuicFrame
& frame
) {
222 QuicFramer
framer(SupportedVersions(version_
), QuicTime::Zero(), false);
224 frames
.push_back(frame
);
225 scoped_ptr
<QuicPacket
> packet(
226 BuildUnsizedDataPacket(&framer
, header
, frames
).packet
);
227 return scoped_ptr
<QuicEncryptedPacket
>(framer
.EncryptPacket(
228 ENCRYPTION_NONE
, header
.packet_sequence_number
, *packet
));
231 void QuicTestPacketMaker::InitializeHeader(
232 QuicPacketSequenceNumber sequence_number
,
233 bool should_include_version
) {
234 header_
.public_header
.connection_id
= connection_id_
;
235 header_
.public_header
.reset_flag
= false;
236 header_
.public_header
.version_flag
= should_include_version
;
237 header_
.public_header
.sequence_number_length
= PACKET_1BYTE_SEQUENCE_NUMBER
;
238 header_
.packet_sequence_number
= sequence_number
;
239 header_
.fec_group
= 0;
240 header_
.entropy_flag
= false;
241 header_
.fec_flag
= false;