OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "net/quic/test_tools/quic_test_packet_maker.h" | |
6 | |
7 #include <list> | |
8 | |
9 #include "net/quic/quic_framer.h" | |
10 #include "net/quic/quic_http_utils.h" | |
11 #include "net/quic/quic_utils.h" | |
12 #include "net/quic/test_tools/quic_test_utils.h" | |
13 | |
14 using std::make_pair; | |
15 | |
16 namespace net { | |
17 namespace test { | |
18 | |
19 QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version, | |
20 QuicConnectionId connection_id, | |
21 MockClock* clock) | |
22 : version_(version), | |
23 connection_id_(connection_id), | |
24 clock_(clock), | |
25 spdy_request_framer_(version > QUIC_VERSION_23 ? SPDY4 : SPDY3), | |
26 spdy_response_framer_(version > QUIC_VERSION_23 ? SPDY4 : SPDY3) { | |
27 } | |
28 | |
29 QuicTestPacketMaker::~QuicTestPacketMaker() { | |
30 } | |
31 | |
32 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket( | |
33 QuicPacketSequenceNumber num, | |
34 bool include_version, | |
35 QuicStreamId stream_id, | |
36 QuicRstStreamErrorCode error_code) { | |
37 QuicPacketHeader header; | |
38 header.public_header.connection_id = connection_id_; | |
39 header.public_header.reset_flag = false; | |
40 header.public_header.version_flag = include_version; | |
41 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
42 header.packet_sequence_number = num; | |
43 header.entropy_flag = false; | |
44 header.fec_flag = false; | |
45 header.fec_group = 0; | |
46 | |
47 QuicRstStreamFrame rst(stream_id, error_code, 0); | |
48 return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&rst))); | |
49 } | |
50 | |
51 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket( | |
52 QuicPacketSequenceNumber num, | |
53 bool include_version, | |
54 QuicStreamId stream_id, | |
55 QuicRstStreamErrorCode error_code, | |
56 QuicPacketSequenceNumber largest_received, | |
57 QuicPacketSequenceNumber least_unacked, | |
58 bool send_feedback) { | |
59 | |
60 QuicPacketHeader header; | |
61 header.public_header.connection_id = connection_id_; | |
62 header.public_header.reset_flag = false; | |
63 header.public_header.version_flag = include_version; | |
64 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
65 header.packet_sequence_number = num; | |
66 header.entropy_flag = false; | |
67 header.fec_flag = false; | |
68 header.fec_group = 0; | |
69 | |
70 QuicAckFrame ack(MakeAckFrame(largest_received)); | |
71 ack.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
72 for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received; ++i) { | |
73 ack.received_packet_times.push_back(make_pair(i, clock_->Now())); | |
74 } | |
75 QuicFrames frames; | |
76 frames.push_back(QuicFrame(&ack)); | |
77 | |
78 QuicStopWaitingFrame stop_waiting; | |
79 stop_waiting.least_unacked = least_unacked; | |
80 frames.push_back(QuicFrame(&stop_waiting)); | |
81 | |
82 QuicRstStreamFrame rst(stream_id, error_code, 0); | |
83 frames.push_back(QuicFrame(&rst)); | |
84 | |
85 QuicFramer framer(SupportedVersions(version_), clock_->Now(), false); | |
86 scoped_ptr<QuicPacket> packet( | |
87 BuildUnsizedDataPacket(&framer, header, frames)); | |
88 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( | |
89 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); | |
90 } | |
91 | |
92 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeConnectionClosePacket( | |
93 QuicPacketSequenceNumber num) { | |
94 QuicPacketHeader header; | |
95 header.public_header.connection_id = connection_id_; | |
96 header.public_header.reset_flag = false; | |
97 header.public_header.version_flag = false; | |
98 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
99 header.packet_sequence_number = num; | |
100 header.entropy_flag = false; | |
101 header.fec_flag = false; | |
102 header.fec_group = 0; | |
103 | |
104 QuicConnectionCloseFrame close; | |
105 close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED; | |
106 close.error_details = "Time to panic!"; | |
107 return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&close))); | |
108 } | |
109 | |
110 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket( | |
111 QuicPacketSequenceNumber sequence_number, | |
112 QuicPacketSequenceNumber largest_received, | |
113 QuicPacketSequenceNumber least_unacked, | |
114 bool send_feedback) { | |
115 QuicPacketHeader header; | |
116 header.public_header.connection_id = connection_id_; | |
117 header.public_header.reset_flag = false; | |
118 header.public_header.version_flag = false; | |
119 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
120 header.packet_sequence_number = sequence_number; | |
121 header.entropy_flag = false; | |
122 header.fec_flag = false; | |
123 header.fec_group = 0; | |
124 | |
125 QuicAckFrame ack(MakeAckFrame(largest_received)); | |
126 ack.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
127 for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received; ++i) { | |
128 ack.received_packet_times.push_back(make_pair(i, clock_->Now())); | |
129 } | |
130 | |
131 QuicFramer framer(SupportedVersions(version_), clock_->Now(), false); | |
132 QuicFrames frames; | |
133 frames.push_back(QuicFrame(&ack)); | |
134 | |
135 QuicStopWaitingFrame stop_waiting; | |
136 stop_waiting.least_unacked = least_unacked; | |
137 frames.push_back(QuicFrame(&stop_waiting)); | |
138 | |
139 scoped_ptr<QuicPacket> packet( | |
140 BuildUnsizedDataPacket(&framer, header, frames)); | |
141 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( | |
142 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); | |
143 } | |
144 | |
145 // Returns a newly created packet to send kData on stream 1. | |
146 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket( | |
147 QuicPacketSequenceNumber sequence_number, | |
148 QuicStreamId stream_id, | |
149 bool should_include_version, | |
150 bool fin, | |
151 QuicStreamOffset offset, | |
152 base::StringPiece data) { | |
153 InitializeHeader(sequence_number, should_include_version); | |
154 QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data)); | |
155 return MakePacket(header_, QuicFrame(&frame)); | |
156 } | |
157 | |
158 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket( | |
159 QuicPacketSequenceNumber sequence_number, | |
160 QuicStreamId stream_id, | |
161 bool should_include_version, | |
162 bool fin, | |
163 QuicPriority priority, | |
164 const SpdyHeaderBlock& headers) { | |
165 InitializeHeader(sequence_number, should_include_version); | |
166 scoped_ptr<SpdySerializedFrame> spdy_frame; | |
167 if (spdy_request_framer_.protocol_version() == SPDY3) { | |
168 SpdySynStreamIR syn_stream(stream_id); | |
169 syn_stream.set_name_value_block(headers); | |
170 syn_stream.set_fin(fin); | |
171 syn_stream.set_priority(priority); | |
172 spdy_frame.reset(spdy_request_framer_.SerializeSynStream(syn_stream)); | |
173 } else { | |
174 SpdyHeadersIR headers_frame(stream_id); | |
175 headers_frame.set_name_value_block(headers); | |
176 headers_frame.set_fin(fin); | |
177 headers_frame.set_priority(priority); | |
178 headers_frame.set_has_priority(true); | |
179 spdy_frame.reset(spdy_request_framer_.SerializeFrame(headers_frame)); | |
180 } | |
181 QuicStreamFrame frame(kHeadersStreamId, false, 0, | |
182 MakeIOVector(base::StringPiece(spdy_frame->data(), | |
183 spdy_frame->size()))); | |
184 return MakePacket(header_, QuicFrame(&frame)); | |
185 } | |
186 | |
187 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket( | |
188 QuicPacketSequenceNumber sequence_number, | |
189 QuicStreamId stream_id, | |
190 bool should_include_version, | |
191 bool fin, | |
192 const SpdyHeaderBlock& headers) { | |
193 InitializeHeader(sequence_number, should_include_version); | |
194 scoped_ptr<SpdySerializedFrame> spdy_frame; | |
195 if (spdy_request_framer_.protocol_version() == SPDY3) { | |
196 SpdySynReplyIR syn_reply(stream_id); | |
197 syn_reply.set_name_value_block(headers); | |
198 syn_reply.set_fin(fin); | |
199 spdy_frame.reset(spdy_response_framer_.SerializeSynReply(syn_reply)); | |
200 } else { | |
201 SpdyHeadersIR headers_frame(stream_id); | |
202 headers_frame.set_name_value_block(headers); | |
203 headers_frame.set_fin(fin); | |
204 spdy_frame.reset(spdy_request_framer_.SerializeFrame(headers_frame)); | |
205 } | |
206 QuicStreamFrame frame(kHeadersStreamId, false, 0, | |
207 MakeIOVector(base::StringPiece(spdy_frame->data(), | |
208 spdy_frame->size()))); | |
209 return MakePacket(header_, QuicFrame(&frame)); | |
210 } | |
211 | |
212 SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders( | |
213 const std::string& method, | |
214 const std::string& scheme, | |
215 const std::string& path) { | |
216 SpdyHeaderBlock headers; | |
217 headers[":method"] = method; | |
218 headers[":host"] = "www.google.com"; | |
219 headers[":path"] = path; | |
220 headers[":scheme"] = scheme; | |
221 headers[":version"] = "HTTP/1.1"; | |
222 return headers; | |
223 } | |
224 | |
225 SpdyHeaderBlock QuicTestPacketMaker::GetResponseHeaders( | |
226 const std::string& status) { | |
227 SpdyHeaderBlock headers; | |
228 headers[":status"] = status; | |
229 headers[":version"] = "HTTP/1.1"; | |
230 headers["content-type"] = "text/plain"; | |
231 return headers; | |
232 } | |
233 | |
234 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket( | |
235 const QuicPacketHeader& header, | |
236 const QuicFrame& frame) { | |
237 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); | |
238 QuicFrames frames; | |
239 frames.push_back(frame); | |
240 scoped_ptr<QuicPacket> packet( | |
241 BuildUnsizedDataPacket(&framer, header, frames)); | |
242 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( | |
243 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); | |
244 } | |
245 | |
246 void QuicTestPacketMaker::InitializeHeader( | |
247 QuicPacketSequenceNumber sequence_number, | |
248 bool should_include_version) { | |
249 header_.public_header.connection_id = connection_id_; | |
250 header_.public_header.reset_flag = false; | |
251 header_.public_header.version_flag = should_include_version; | |
252 header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
253 header_.packet_sequence_number = sequence_number; | |
254 header_.fec_group = 0; | |
255 header_.entropy_flag = false; | |
256 header_.fec_flag = false; | |
257 } | |
258 | |
259 } // namespace test | |
260 } // namespace net | |
OLD | NEW |