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/test_tools/quic_test_utils.h"
14 QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version, QuicGuid guid)
17 spdy_request_framer_(SPDY3),
18 spdy_response_framer_(SPDY3) {
21 QuicTestPacketMaker::~QuicTestPacketMaker() {
24 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket(
25 QuicPacketSequenceNumber num,
27 QuicStreamId stream_id,
28 QuicRstStreamErrorCode error_code) {
29 QuicPacketHeader header;
30 header.public_header.guid = guid_;
31 header.public_header.reset_flag = false;
32 header.public_header.version_flag = include_version;
33 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
34 header.packet_sequence_number = num;
35 header.entropy_flag = false;
36 header.fec_flag = false;
39 QuicRstStreamFrame rst(stream_id, error_code);
40 return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&rst)));
43 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeConnectionClosePacket(
44 QuicPacketSequenceNumber num) {
45 QuicPacketHeader header;
46 header.public_header.guid = guid_;
47 header.public_header.reset_flag = false;
48 header.public_header.version_flag = false;
49 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
50 header.packet_sequence_number = num;
51 header.entropy_flag = false;
52 header.fec_flag = false;
55 QuicConnectionCloseFrame close;
56 close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED;
57 close.error_details = "Time to panic!";
58 return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&close)));
61 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket(
62 QuicPacketSequenceNumber sequence_number,
63 QuicPacketSequenceNumber largest_received,
64 QuicPacketSequenceNumber least_unacked,
66 QuicPacketHeader header;
67 header.public_header.guid = guid_;
68 header.public_header.reset_flag = false;
69 header.public_header.version_flag = false;
70 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
71 header.packet_sequence_number = sequence_number;
72 header.entropy_flag = false;
73 header.fec_flag = false;
76 QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked);
78 QuicCongestionFeedbackFrame feedback;
80 feedback.tcp.accumulated_number_of_lost_packets = 0;
81 feedback.tcp.receive_window = 256000;
83 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
85 frames.push_back(QuicFrame(&ack));
87 frames.push_back(QuicFrame(&feedback));
89 scoped_ptr<QuicPacket> packet(
90 framer.BuildUnsizedDataPacket(header, frames).packet);
91 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
92 ENCRYPTION_NONE, header.packet_sequence_number, *packet));
95 // Returns a newly created packet to send kData on stream 1.
96 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket(
97 QuicPacketSequenceNumber sequence_number,
98 QuicStreamId stream_id,
99 bool should_include_version,
101 QuicStreamOffset offset,
102 base::StringPiece data) {
103 InitializeHeader(sequence_number, should_include_version);
104 QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data));
105 return MakePacket(header_, QuicFrame(&frame));
108 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket(
109 QuicPacketSequenceNumber sequence_number,
110 QuicStreamId stream_id,
111 bool should_include_version,
113 const SpdyHeaderBlock& headers) {
114 EXPECT_LT(QUIC_VERSION_12, version_);
115 InitializeHeader(sequence_number, should_include_version);
116 SpdySynStreamIR syn_stream(stream_id);
117 syn_stream.set_name_value_block(headers);
118 syn_stream.set_fin(fin);
119 syn_stream.set_priority(0);
120 scoped_ptr<SpdySerializedFrame> spdy_frame(
121 spdy_request_framer_.SerializeSynStream(syn_stream));
122 QuicStreamFrame frame(kHeadersStreamId, false, 0,
123 MakeIOVector(base::StringPiece(spdy_frame->data(),
124 spdy_frame->size())));
125 return MakePacket(header_, QuicFrame(&frame));
128 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket(
129 QuicPacketSequenceNumber sequence_number,
130 QuicStreamId stream_id,
131 bool should_include_version,
133 const SpdyHeaderBlock& headers) {
134 EXPECT_LT(QUIC_VERSION_12, version_);
135 InitializeHeader(sequence_number, should_include_version);
136 SpdySynReplyIR syn_reply(stream_id);
137 syn_reply.set_name_value_block(headers);
138 syn_reply.set_fin(fin);
139 scoped_ptr<SpdySerializedFrame> spdy_frame(
140 spdy_response_framer_.SerializeSynReply(syn_reply));
141 QuicStreamFrame frame(kHeadersStreamId, false, 0,
142 MakeIOVector(base::StringPiece(spdy_frame->data(),
143 spdy_frame->size())));
144 return MakePacket(header_, QuicFrame(&frame));
147 SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders(
148 const std::string& method,
149 const std::string& scheme,
150 const std::string& path) {
151 SpdyHeaderBlock headers;
152 headers[":method"] = method;
153 headers[":host"] = "www.google.com";
154 headers[":path"] = path;
155 headers[":scheme"] = scheme;
156 headers[":version"] = "HTTP/1.1";
160 std::string QuicTestPacketMaker::GetRequestString(
161 const std::string& method,
162 const std::string& scheme,
163 const std::string& path) {
164 DCHECK_GE(QUIC_VERSION_12, version_);
165 return SerializeHeaderBlock(GetRequestHeaders(method, scheme, path));
168 SpdyHeaderBlock QuicTestPacketMaker::GetResponseHeaders(
169 const std::string& status) {
170 SpdyHeaderBlock headers;
171 headers[":status"] = status;
172 headers[":version"] = "HTTP/1.1";
173 headers["content-type"] = "text/plain";
177 std::string QuicTestPacketMaker::GetResponseString(const std::string& status,
178 const std::string& body) {
179 DCHECK_GE(QUIC_VERSION_12, version_);
180 return compressor_.CompressHeaders(GetResponseHeaders(status)) + body;
183 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket(
184 const QuicPacketHeader& header,
185 const QuicFrame& frame) {
186 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
188 frames.push_back(frame);
189 scoped_ptr<QuicPacket> packet(
190 framer.BuildUnsizedDataPacket(header, frames).packet);
191 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
192 ENCRYPTION_NONE, header.packet_sequence_number, *packet));
195 void QuicTestPacketMaker::InitializeHeader(
196 QuicPacketSequenceNumber sequence_number,
197 bool should_include_version) {
198 header_.public_header.guid = guid_;
199 header_.public_header.reset_flag = false;
200 header_.public_header.version_flag = should_include_version;
201 header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
202 header_.packet_sequence_number = sequence_number;
203 header_.fec_group = 0;
204 header_.entropy_flag = false;
205 header_.fec_flag = false;
208 std::string QuicTestPacketMaker::SerializeHeaderBlock(
209 const SpdyHeaderBlock& headers) {
210 QuicSpdyCompressor compressor;
211 return compressor.CompressHeadersWithPriority(
212 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), headers);