OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012 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 "net/quic/quic_framer.h" | |
8 #include "net/quic/quic_http_utils.h" | |
9 #include "net/quic/test_tools/quic_test_utils.h" | |
10 | |
11 namespace net { | |
12 namespace test { | |
13 | |
14 QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version, QuicGuid guid) | |
15 : version_(version), | |
16 guid_(guid), | |
17 spdy_request_framer_(SPDY3), | |
18 spdy_response_framer_(SPDY3) { | |
19 } | |
20 | |
21 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket( | |
22 QuicPacketSequenceNumber num, | |
23 bool include_version, | |
24 QuicStreamId stream_id, | |
25 QuicRstStreamErrorCode error_code) { | |
26 QuicPacketHeader header; | |
27 header.public_header.guid = guid_; | |
28 header.public_header.reset_flag = false; | |
29 header.public_header.version_flag = include_version; | |
30 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
31 header.packet_sequence_number = num; | |
32 header.entropy_flag = false; | |
33 header.fec_flag = false; | |
34 header.fec_group = 0; | |
35 | |
36 QuicRstStreamFrame rst(stream_id, error_code); | |
37 return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&rst))); | |
38 } | |
39 | |
40 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeConnectionClosePacket( | |
41 QuicPacketSequenceNumber num) { | |
42 QuicPacketHeader header; | |
43 header.public_header.guid = guid_; | |
44 header.public_header.reset_flag = false; | |
45 header.public_header.version_flag = false; | |
46 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
47 header.packet_sequence_number = num; | |
48 header.entropy_flag = false; | |
49 header.fec_flag = false; | |
50 header.fec_group = 0; | |
51 | |
52 QuicConnectionCloseFrame close; | |
53 close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED; | |
54 close.error_details = "Time to panic!"; | |
55 return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&close))); | |
56 } | |
57 | |
58 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket( | |
59 QuicPacketSequenceNumber sequence_number, | |
60 QuicPacketSequenceNumber largest_received, | |
61 QuicPacketSequenceNumber least_unacked, | |
62 bool send_feedback) { | |
63 QuicPacketHeader header; | |
64 header.public_header.guid = guid_; | |
65 header.public_header.reset_flag = false; | |
66 header.public_header.version_flag = false; | |
67 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
68 header.packet_sequence_number = sequence_number; | |
69 header.entropy_flag = false; | |
70 header.fec_flag = false; | |
71 header.fec_group = 0; | |
72 | |
73 QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked); | |
74 | |
75 QuicCongestionFeedbackFrame feedback; | |
76 feedback.type = kTCP; | |
77 feedback.tcp.accumulated_number_of_lost_packets = 0; | |
78 feedback.tcp.receive_window = 256000; | |
79 | |
80 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); | |
81 QuicFrames frames; | |
82 frames.push_back(QuicFrame(&ack)); | |
83 if (send_feedback) { | |
84 frames.push_back(QuicFrame(&feedback)); | |
85 } | |
86 scoped_ptr<QuicPacket> packet( | |
87 framer.BuildUnsizedDataPacket(header, frames).packet); | |
88 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( | |
89 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); | |
90 } | |
91 | |
92 // Returns a newly created packet to send kData on stream 1. | |
93 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket( | |
94 QuicPacketSequenceNumber sequence_number, | |
95 QuicStreamId stream_id, | |
96 bool should_include_version, | |
97 bool fin, | |
98 QuicStreamOffset offset, | |
99 base::StringPiece data) { | |
100 InitializeHeader(sequence_number, should_include_version); | |
101 QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data)); | |
102 return MakePacket(header_, QuicFrame(&frame)); | |
103 } | |
104 | |
105 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket( | |
106 QuicPacketSequenceNumber sequence_number, | |
107 QuicStreamId stream_id, | |
108 bool should_include_version, | |
109 bool fin, | |
110 const SpdyHeaderBlock& headers) { | |
111 EXPECT_LT(QUIC_VERSION_12, version_); | |
112 InitializeHeader(sequence_number, should_include_version); | |
113 SpdySynStreamIR syn_stream(stream_id); | |
114 *syn_stream.GetMutableNameValueBlock() = headers; | |
115 syn_stream.set_fin(fin); | |
116 syn_stream.set_priority(0); | |
117 scoped_ptr<SpdySerializedFrame> spdy_frame( | |
118 spdy_request_framer_.SerializeSynStream(syn_stream)); | |
119 QuicStreamFrame frame(kHeadersStreamId, false, 0, | |
120 MakeIOVector(base::StringPiece(spdy_frame->data(), | |
121 spdy_frame->size()))); | |
122 return MakePacket(header_, QuicFrame(&frame)); | |
123 } | |
124 | |
125 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket( | |
126 QuicPacketSequenceNumber sequence_number, | |
127 QuicStreamId stream_id, | |
128 bool should_include_version, | |
129 bool fin, | |
130 const SpdyHeaderBlock& headers) { | |
131 EXPECT_LT(QUIC_VERSION_12, version_); | |
132 InitializeHeader(sequence_number, should_include_version); | |
133 SpdySynReplyIR syn_reply(stream_id); | |
134 *syn_reply.GetMutableNameValueBlock() = headers; | |
135 syn_reply.set_fin(fin); | |
136 scoped_ptr<SpdySerializedFrame> spdy_frame( | |
137 spdy_response_framer_.SerializeSynReply(syn_reply)); | |
138 QuicStreamFrame frame(kHeadersStreamId, false, 0, | |
139 MakeIOVector(base::StringPiece(spdy_frame->data(), | |
140 spdy_frame->size()))); | |
141 return MakePacket(header_, QuicFrame(&frame)); | |
142 } | |
143 | |
144 SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders( | |
145 const std::string& method, | |
146 const std::string& scheme, | |
147 const std::string& path) { | |
148 SpdyHeaderBlock headers; | |
149 headers[":method"] = method; | |
150 headers[":host"] = "www.google.com"; | |
151 headers[":path"] = path; | |
152 headers[":scheme"] = scheme; | |
153 headers[":version"] = "HTTP/1.1"; | |
154 return headers; | |
155 } | |
156 | |
157 std::string QuicTestPacketMaker::GetRequestString( | |
158 const std::string& method, | |
159 const std::string& scheme, | |
160 const std::string& path) { | |
161 DCHECK_LT(QUIC_VERSION_12, version_); | |
162 return SerializeHeaderBlock(GetRequestHeaders(method, scheme, path)); | |
163 } | |
164 | |
165 SpdyHeaderBlock QuicTestPacketMaker::GetResponseHeaders( | |
166 const std::string& status) { | |
167 SpdyHeaderBlock headers; | |
168 headers[":status"] = status; | |
169 headers[":version"] = "HTTP/1.1"; | |
170 headers["content-type"] = "text/plain"; | |
171 return headers; | |
172 } | |
173 | |
174 std::string QuicTestPacketMaker::GetResponseString(const std::string& status, | |
175 const std::string& body) { | |
176 DCHECK_LT(QUIC_VERSION_12, version_); | |
jar (doing other things)
2013/12/20 00:53:12
Why is this here? Is this called?
Ryan Hamilton
2013/12/20 01:55:02
Switched to GE. I think I moved this around w/o r
| |
177 return compressor_.CompressHeaders(GetResponseHeaders(status)) + body; | |
178 } | |
179 | |
180 scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket( | |
181 const QuicPacketHeader& header, | |
182 const QuicFrame& frame) { | |
183 QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); | |
184 QuicFrames frames; | |
185 frames.push_back(frame); | |
186 scoped_ptr<QuicPacket> packet( | |
187 framer.BuildUnsizedDataPacket(header, frames).packet); | |
188 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( | |
189 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); | |
190 } | |
191 | |
192 void QuicTestPacketMaker::InitializeHeader( | |
193 QuicPacketSequenceNumber sequence_number, | |
194 bool should_include_version) { | |
195 header_.public_header.guid = guid_; | |
196 header_.public_header.reset_flag = false; | |
197 header_.public_header.version_flag = should_include_version; | |
198 header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
199 header_.packet_sequence_number = sequence_number; | |
200 header_.fec_group = 0; | |
201 header_.entropy_flag = false; | |
202 header_.fec_flag = false; | |
203 } | |
204 | |
205 std::string QuicTestPacketMaker::SerializeHeaderBlock( | |
206 const SpdyHeaderBlock& headers) { | |
207 QuicSpdyCompressor compressor; | |
208 return compressor.CompressHeadersWithPriority( | |
209 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), headers); | |
210 } | |
211 | |
212 } // namespace test | |
213 } // namespace net | |
OLD | NEW |