OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/test_tools/quic_test_packet_maker.h" | 5 #include "net/quic/test_tools/quic_test_packet_maker.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 | 8 |
9 #include "net/quic/quic_framer.h" | 9 #include "net/quic/quic_framer.h" |
10 #include "net/quic/quic_http_utils.h" | 10 #include "net/quic/quic_http_utils.h" |
11 #include "net/quic/quic_utils.h" | 11 #include "net/quic/quic_utils.h" |
12 #include "net/quic/test_tools/quic_test_utils.h" | 12 #include "net/quic/test_tools/quic_test_utils.h" |
13 | 13 |
14 using std::make_pair; | 14 using std::make_pair; |
15 | 15 |
16 namespace net { | 16 namespace net { |
17 namespace test { | 17 namespace test { |
18 | 18 |
19 QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version, | 19 QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version, |
20 QuicConnectionId connection_id, | 20 QuicConnectionId connection_id, |
21 MockClock* clock) | 21 MockClock* clock) |
22 : version_(version), | 22 : version_(version), |
23 connection_id_(connection_id), | 23 connection_id_(connection_id), |
24 clock_(clock), | 24 clock_(clock), |
25 spdy_request_framer_(SPDY3), | 25 spdy_request_framer_(version > QUIC_VERSION_23 ? SPDY4 : SPDY3), |
26 spdy_response_framer_(SPDY3) { | 26 spdy_response_framer_(version > QUIC_VERSION_23 ? SPDY4 : SPDY3) { |
27 } | 27 } |
28 | 28 |
29 QuicTestPacketMaker::~QuicTestPacketMaker() { | 29 QuicTestPacketMaker::~QuicTestPacketMaker() { |
30 } | 30 } |
31 | 31 |
32 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket( | 32 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket( |
33 QuicPacketSequenceNumber num, | 33 QuicPacketSequenceNumber num, |
34 bool include_version, | 34 bool include_version, |
35 QuicStreamId stream_id, | 35 QuicStreamId stream_id, |
36 QuicRstStreamErrorCode error_code) { | 36 QuicRstStreamErrorCode error_code) { |
(...skipping 25 matching lines...) Expand all Loading... |
62 header.public_header.reset_flag = false; | 62 header.public_header.reset_flag = false; |
63 header.public_header.version_flag = include_version; | 63 header.public_header.version_flag = include_version; |
64 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | 64 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
65 header.packet_sequence_number = num; | 65 header.packet_sequence_number = num; |
66 header.entropy_flag = false; | 66 header.entropy_flag = false; |
67 header.fec_flag = false; | 67 header.fec_flag = false; |
68 header.fec_group = 0; | 68 header.fec_group = 0; |
69 | 69 |
70 QuicAckFrame ack(MakeAckFrame(largest_received)); | 70 QuicAckFrame ack(MakeAckFrame(largest_received)); |
71 ack.delta_time_largest_observed = QuicTime::Delta::Zero(); | 71 ack.delta_time_largest_observed = QuicTime::Delta::Zero(); |
72 if (version_ > QUIC_VERSION_22) { | 72 for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received; ++i) { |
73 for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received; | 73 ack.received_packet_times.push_back(make_pair(i, clock_->Now())); |
74 ++i) { | |
75 ack.received_packet_times.push_back(make_pair(i, clock_->Now())); | |
76 } | |
77 } | 74 } |
78 QuicFrames frames; | 75 QuicFrames frames; |
79 frames.push_back(QuicFrame(&ack)); | 76 frames.push_back(QuicFrame(&ack)); |
80 QuicCongestionFeedbackFrame feedback; | |
81 if (send_feedback && version_ <= QUIC_VERSION_22) { | |
82 feedback.type = kTCP; | |
83 feedback.tcp.receive_window = 256000; | |
84 | |
85 frames.push_back(QuicFrame(&feedback)); | |
86 } | |
87 | 77 |
88 QuicStopWaitingFrame stop_waiting; | 78 QuicStopWaitingFrame stop_waiting; |
89 stop_waiting.least_unacked = least_unacked; | 79 stop_waiting.least_unacked = least_unacked; |
90 frames.push_back(QuicFrame(&stop_waiting)); | 80 frames.push_back(QuicFrame(&stop_waiting)); |
91 | 81 |
92 QuicRstStreamFrame rst(stream_id, error_code, 0); | 82 QuicRstStreamFrame rst(stream_id, error_code, 0); |
93 frames.push_back(QuicFrame(&rst)); | 83 frames.push_back(QuicFrame(&rst)); |
94 | 84 |
95 QuicFramer framer(SupportedVersions(version_), clock_->Now(), false); | 85 QuicFramer framer(SupportedVersions(version_), clock_->Now(), false); |
96 scoped_ptr<QuicPacket> packet( | 86 scoped_ptr<QuicPacket> packet( |
(...skipping 30 matching lines...) Expand all Loading... |
127 header.public_header.reset_flag = false; | 117 header.public_header.reset_flag = false; |
128 header.public_header.version_flag = false; | 118 header.public_header.version_flag = false; |
129 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | 119 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
130 header.packet_sequence_number = sequence_number; | 120 header.packet_sequence_number = sequence_number; |
131 header.entropy_flag = false; | 121 header.entropy_flag = false; |
132 header.fec_flag = false; | 122 header.fec_flag = false; |
133 header.fec_group = 0; | 123 header.fec_group = 0; |
134 | 124 |
135 QuicAckFrame ack(MakeAckFrame(largest_received)); | 125 QuicAckFrame ack(MakeAckFrame(largest_received)); |
136 ack.delta_time_largest_observed = QuicTime::Delta::Zero(); | 126 ack.delta_time_largest_observed = QuicTime::Delta::Zero(); |
137 if (version_ > QUIC_VERSION_22) { | 127 for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received; ++i) { |
138 for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received; | 128 ack.received_packet_times.push_back(make_pair(i, clock_->Now())); |
139 ++i) { | |
140 ack.received_packet_times.push_back(make_pair(i, clock_->Now())); | |
141 } | |
142 } | 129 } |
143 | 130 |
144 QuicFramer framer(SupportedVersions(version_), clock_->Now(), false); | 131 QuicFramer framer(SupportedVersions(version_), clock_->Now(), false); |
145 QuicFrames frames; | 132 QuicFrames frames; |
146 frames.push_back(QuicFrame(&ack)); | 133 frames.push_back(QuicFrame(&ack)); |
147 QuicCongestionFeedbackFrame feedback; | |
148 if (send_feedback && version_ <= QUIC_VERSION_22) { | |
149 feedback.type = kTCP; | |
150 feedback.tcp.receive_window = 256000; | |
151 frames.push_back(QuicFrame(&feedback)); | |
152 } | |
153 | 134 |
154 QuicStopWaitingFrame stop_waiting; | 135 QuicStopWaitingFrame stop_waiting; |
155 stop_waiting.least_unacked = least_unacked; | 136 stop_waiting.least_unacked = least_unacked; |
156 frames.push_back(QuicFrame(&stop_waiting)); | 137 frames.push_back(QuicFrame(&stop_waiting)); |
157 | 138 |
158 scoped_ptr<QuicPacket> packet( | 139 scoped_ptr<QuicPacket> packet( |
159 BuildUnsizedDataPacket(&framer, header, frames).packet); | 140 BuildUnsizedDataPacket(&framer, header, frames).packet); |
160 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( | 141 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( |
161 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); | 142 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); |
162 } | 143 } |
163 | 144 |
164 // Returns a newly created packet to send kData on stream 1. | 145 // Returns a newly created packet to send kData on stream 1. |
165 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket( | 146 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket( |
166 QuicPacketSequenceNumber sequence_number, | 147 QuicPacketSequenceNumber sequence_number, |
167 QuicStreamId stream_id, | 148 QuicStreamId stream_id, |
168 bool should_include_version, | 149 bool should_include_version, |
169 bool fin, | 150 bool fin, |
170 QuicStreamOffset offset, | 151 QuicStreamOffset offset, |
171 base::StringPiece data) { | 152 base::StringPiece data) { |
172 InitializeHeader(sequence_number, should_include_version); | 153 InitializeHeader(sequence_number, should_include_version); |
173 QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data)); | 154 QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data)); |
174 return MakePacket(header_, QuicFrame(&frame)); | 155 return MakePacket(header_, QuicFrame(&frame)); |
175 } | 156 } |
176 | 157 |
177 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket( | 158 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket( |
178 QuicPacketSequenceNumber sequence_number, | 159 QuicPacketSequenceNumber sequence_number, |
179 QuicStreamId stream_id, | 160 QuicStreamId stream_id, |
180 bool should_include_version, | 161 bool should_include_version, |
181 bool fin, | 162 bool fin, |
| 163 QuicPriority priority, |
182 const SpdyHeaderBlock& headers) { | 164 const SpdyHeaderBlock& headers) { |
183 InitializeHeader(sequence_number, should_include_version); | 165 InitializeHeader(sequence_number, should_include_version); |
184 SpdySynStreamIR syn_stream(stream_id); | 166 scoped_ptr<SpdySerializedFrame> spdy_frame; |
185 syn_stream.set_name_value_block(headers); | 167 if (spdy_request_framer_.protocol_version() == SPDY3) { |
186 syn_stream.set_fin(fin); | 168 SpdySynStreamIR syn_stream(stream_id); |
187 syn_stream.set_priority(0); | 169 syn_stream.set_name_value_block(headers); |
188 scoped_ptr<SpdySerializedFrame> spdy_frame( | 170 syn_stream.set_fin(fin); |
189 spdy_request_framer_.SerializeSynStream(syn_stream)); | 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 } |
190 QuicStreamFrame frame(kHeadersStreamId, false, 0, | 181 QuicStreamFrame frame(kHeadersStreamId, false, 0, |
191 MakeIOVector(base::StringPiece(spdy_frame->data(), | 182 MakeIOVector(base::StringPiece(spdy_frame->data(), |
192 spdy_frame->size()))); | 183 spdy_frame->size()))); |
193 return MakePacket(header_, QuicFrame(&frame)); | 184 return MakePacket(header_, QuicFrame(&frame)); |
194 } | 185 } |
195 | 186 |
196 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket( | 187 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket( |
197 QuicPacketSequenceNumber sequence_number, | 188 QuicPacketSequenceNumber sequence_number, |
198 QuicStreamId stream_id, | 189 QuicStreamId stream_id, |
199 bool should_include_version, | 190 bool should_include_version, |
200 bool fin, | 191 bool fin, |
201 const SpdyHeaderBlock& headers) { | 192 const SpdyHeaderBlock& headers) { |
202 InitializeHeader(sequence_number, should_include_version); | 193 InitializeHeader(sequence_number, should_include_version); |
203 SpdySynReplyIR syn_reply(stream_id); | 194 scoped_ptr<SpdySerializedFrame> spdy_frame; |
204 syn_reply.set_name_value_block(headers); | 195 if (spdy_request_framer_.protocol_version() == SPDY3) { |
205 syn_reply.set_fin(fin); | 196 SpdySynReplyIR syn_reply(stream_id); |
206 scoped_ptr<SpdySerializedFrame> spdy_frame( | 197 syn_reply.set_name_value_block(headers); |
207 spdy_response_framer_.SerializeSynReply(syn_reply)); | 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 } |
208 QuicStreamFrame frame(kHeadersStreamId, false, 0, | 206 QuicStreamFrame frame(kHeadersStreamId, false, 0, |
209 MakeIOVector(base::StringPiece(spdy_frame->data(), | 207 MakeIOVector(base::StringPiece(spdy_frame->data(), |
210 spdy_frame->size()))); | 208 spdy_frame->size()))); |
211 return MakePacket(header_, QuicFrame(&frame)); | 209 return MakePacket(header_, QuicFrame(&frame)); |
212 } | 210 } |
213 | 211 |
214 SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders( | 212 SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders( |
215 const std::string& method, | 213 const std::string& method, |
216 const std::string& scheme, | 214 const std::string& scheme, |
217 const std::string& path) { | 215 const std::string& path) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 header_.public_header.version_flag = should_include_version; | 251 header_.public_header.version_flag = should_include_version; |
254 header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | 252 header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
255 header_.packet_sequence_number = sequence_number; | 253 header_.packet_sequence_number = sequence_number; |
256 header_.fec_group = 0; | 254 header_.fec_group = 0; |
257 header_.entropy_flag = false; | 255 header_.entropy_flag = false; |
258 header_.fec_flag = false; | 256 header_.fec_flag = false; |
259 } | 257 } |
260 | 258 |
261 } // namespace test | 259 } // namespace test |
262 } // namespace net | 260 } // namespace net |
OLD | NEW |