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, QuicGuid guid)
18 spdy_request_framer_(SPDY3),
19 spdy_response_framer_(SPDY3) {
22 QuicTestPacketMaker::~QuicTestPacketMaker() {
25 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket(
26 QuicPacketSequenceNumber num,
28 QuicStreamId stream_id,
29 QuicRstStreamErrorCode error_code) {
30 QuicPacketHeader header;
31 header.public_header.guid = guid_;
32 header.public_header.reset_flag = false;
33 header.public_header.version_flag = include_version;
34 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
35 header.packet_sequence_number = num;
36 header.entropy_flag = false;
37 header.fec_flag = false;
40 QuicRstStreamFrame rst(stream_id, error_code, 0);
41 return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&rst)));
44 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket(
45 QuicPacketSequenceNumber num,
47 QuicStreamId stream_id,
48 QuicRstStreamErrorCode error_code,
49 QuicPacketSequenceNumber largest_received,
50 QuicPacketSequenceNumber least_unacked,
53 QuicPacketHeader header;
54 header.public_header.guid = guid_;
55 header.public_header.reset_flag = false;
56 header.public_header.version_flag = include_version;
57 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
58 header.packet_sequence_number = num;
59 header.entropy_flag = false;
60 header.fec_flag = false;
63 QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked);
65 frames.push_back(QuicFrame(&ack));
67 QuicCongestionFeedbackFrame feedback;
69 feedback.tcp.receive_window = 256000;
71 frames.push_back(QuicFrame(&feedback));
74 QuicRstStreamFrame rst(stream_id, error_code, 0);
75 frames.push_back(QuicFrame(&rst));
77 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
78 scoped_ptr<QuicPacket> packet(
79 framer.BuildUnsizedDataPacket(header, frames).packet);
80 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
81 ENCRYPTION_NONE, header.packet_sequence_number, *packet));
84 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeConnectionClosePacket(
85 QuicPacketSequenceNumber num) {
86 QuicPacketHeader header;
87 header.public_header.guid = guid_;
88 header.public_header.reset_flag = false;
89 header.public_header.version_flag = false;
90 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
91 header.packet_sequence_number = num;
92 header.entropy_flag = false;
93 header.fec_flag = false;
96 QuicConnectionCloseFrame close;
97 close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED;
98 close.error_details = "Time to panic!";
99 return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&close)));
102 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket(
103 QuicPacketSequenceNumber sequence_number,
104 QuicPacketSequenceNumber largest_received,
105 QuicPacketSequenceNumber least_unacked,
106 bool send_feedback) {
107 QuicPacketHeader header;
108 header.public_header.guid = guid_;
109 header.public_header.reset_flag = false;
110 header.public_header.version_flag = false;
111 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
112 header.packet_sequence_number = sequence_number;
113 header.entropy_flag = false;
114 header.fec_flag = false;
115 header.fec_group = 0;
117 QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked);
119 QuicCongestionFeedbackFrame feedback;
120 feedback.type = kTCP;
121 feedback.tcp.receive_window = 256000;
123 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
125 frames.push_back(QuicFrame(&ack));
127 frames.push_back(QuicFrame(&feedback));
129 scoped_ptr<QuicPacket> packet(
130 framer.BuildUnsizedDataPacket(header, frames).packet);
131 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
132 ENCRYPTION_NONE, header.packet_sequence_number, *packet));
135 // Returns a newly created packet to send kData on stream 1.
136 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket(
137 QuicPacketSequenceNumber sequence_number,
138 QuicStreamId stream_id,
139 bool should_include_version,
141 QuicStreamOffset offset,
142 base::StringPiece data) {
143 InitializeHeader(sequence_number, should_include_version);
144 QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data));
145 return MakePacket(header_, QuicFrame(&frame));
148 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket(
149 QuicPacketSequenceNumber sequence_number,
150 QuicStreamId stream_id,
151 bool should_include_version,
153 const SpdyHeaderBlock& headers) {
154 EXPECT_LT(QUIC_VERSION_12, version_);
155 InitializeHeader(sequence_number, should_include_version);
156 SpdySynStreamIR syn_stream(stream_id);
157 syn_stream.set_name_value_block(headers);
158 syn_stream.set_fin(fin);
159 syn_stream.set_priority(0);
160 scoped_ptr<SpdySerializedFrame> spdy_frame(
161 spdy_request_framer_.SerializeSynStream(syn_stream));
162 QuicStreamFrame frame(kHeadersStreamId, false, 0,
163 MakeIOVector(base::StringPiece(spdy_frame->data(),
164 spdy_frame->size())));
165 return MakePacket(header_, QuicFrame(&frame));
168 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket(
169 QuicPacketSequenceNumber sequence_number,
170 QuicStreamId stream_id,
171 bool should_include_version,
173 const SpdyHeaderBlock& headers) {
174 EXPECT_LT(QUIC_VERSION_12, version_);
175 InitializeHeader(sequence_number, should_include_version);
176 SpdySynReplyIR syn_reply(stream_id);
177 syn_reply.set_name_value_block(headers);
178 syn_reply.set_fin(fin);
179 scoped_ptr<SpdySerializedFrame> spdy_frame(
180 spdy_response_framer_.SerializeSynReply(syn_reply));
181 QuicStreamFrame frame(kHeadersStreamId, false, 0,
182 MakeIOVector(base::StringPiece(spdy_frame->data(),
183 spdy_frame->size())));
184 return MakePacket(header_, QuicFrame(&frame));
187 SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders(
188 const std::string& method,
189 const std::string& scheme,
190 const std::string& path) {
191 SpdyHeaderBlock headers;
192 headers[":method"] = method;
193 headers[":host"] = "www.google.com";
194 headers[":path"] = path;
195 headers[":scheme"] = scheme;
196 headers[":version"] = "HTTP/1.1";
200 std::string QuicTestPacketMaker::GetRequestString(
201 const std::string& method,
202 const std::string& scheme,
203 const std::string& path) {
204 DCHECK_GE(QUIC_VERSION_12, version_);
205 return SerializeHeaderBlock(GetRequestHeaders(method, scheme, path));
208 SpdyHeaderBlock QuicTestPacketMaker::GetResponseHeaders(
209 const std::string& status) {
210 SpdyHeaderBlock headers;
211 headers[":status"] = status;
212 headers[":version"] = "HTTP/1.1";
213 headers["content-type"] = "text/plain";
217 std::string QuicTestPacketMaker::GetResponseString(const std::string& status,
218 const std::string& body) {
219 DCHECK_GE(QUIC_VERSION_12, version_);
220 return compressor_.CompressHeaders(GetResponseHeaders(status)) + body;
223 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket(
224 const QuicPacketHeader& header,
225 const QuicFrame& frame) {
226 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
228 frames.push_back(frame);
229 scoped_ptr<QuicPacket> packet(
230 framer.BuildUnsizedDataPacket(header, frames).packet);
231 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
232 ENCRYPTION_NONE, header.packet_sequence_number, *packet));
235 void QuicTestPacketMaker::InitializeHeader(
236 QuicPacketSequenceNumber sequence_number,
237 bool should_include_version) {
238 header_.public_header.guid = guid_;
239 header_.public_header.reset_flag = false;
240 header_.public_header.version_flag = should_include_version;
241 header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
242 header_.packet_sequence_number = sequence_number;
243 header_.fec_group = 0;
244 header_.entropy_flag = false;
245 header_.fec_flag = false;
248 std::string QuicTestPacketMaker::SerializeHeaderBlock(
249 const SpdyHeaderBlock& headers) {
250 QuicSpdyCompressor compressor;
251 return compressor.CompressHeadersWithPriority(
252 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), headers);