Add diagnostics_writer.cc to the list of files allowed to printf.
[chromium-blink-merge.git] / net / quic / test_tools / quic_test_packet_maker.cc
blob345b7b5f3e9e41a79ab971a805c38f9baf194be2
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"
12 namespace net {
13 namespace test {
15 QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version,
16 QuicConnectionId connection_id)
17 : version_(version),
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,
28 bool include_version,
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;
39 header.fec_group = 0;
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,
47 bool include_version,
48 QuicStreamId stream_id,
49 QuicRstStreamErrorCode error_code,
50 QuicPacketSequenceNumber largest_received,
51 QuicPacketSequenceNumber least_unacked,
52 bool send_feedback) {
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;
62 header.fec_group = 0;
64 QuicAckFrame ack(MakeAckFrame(largest_received));
65 ack.delta_time_largest_observed = QuicTime::Delta::Zero();
66 QuicFrames frames;
67 frames.push_back(QuicFrame(&ack));
68 QuicCongestionFeedbackFrame feedback;
69 if (send_feedback) {
70 feedback.type = kTCP;
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);
131 QuicFrames frames;
132 frames.push_back(QuicFrame(&ack));
133 if (send_feedback) {
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,
152 bool fin,
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,
164 bool fin,
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,
183 bool fin,
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";
207 return headers;
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";
216 return headers;
219 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket(
220 const QuicPacketHeader& header,
221 const QuicFrame& frame) {
222 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
223 QuicFrames frames;
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;
244 } // namespace test
245 } // namespace net