OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/tools/quic/quic_spdy_server_stream.h" | 5 #include "net/tools/quic/quic_spdy_server_stream.h" |
6 | 6 |
7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
8 #include "base/strings/string_piece.h" | 8 #include "base/strings/string_piece.h" |
9 #include "net/quic/quic_connection.h" | 9 #include "net/quic/quic_connection.h" |
10 #include "net/quic/quic_protocol.h" | 10 #include "net/quic/quic_protocol.h" |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 scoped_ptr<QuicSpdyServerStreamPeer> stream_; | 139 scoped_ptr<QuicSpdyServerStreamPeer> stream_; |
140 string headers_string_; | 140 string headers_string_; |
141 string body_; | 141 string body_; |
142 }; | 142 }; |
143 | 143 |
144 QuicConsumedData ConsumeAllData( | 144 QuicConsumedData ConsumeAllData( |
145 QuicStreamId id, | 145 QuicStreamId id, |
146 const IOVector& data, | 146 const IOVector& data, |
147 QuicStreamOffset offset, | 147 QuicStreamOffset offset, |
148 bool fin, | 148 bool fin, |
| 149 FecProtection /*fec_protection_*/, |
149 QuicAckNotifier::DelegateInterface* /*ack_notifier_delegate*/) { | 150 QuicAckNotifier::DelegateInterface* /*ack_notifier_delegate*/) { |
150 return QuicConsumedData(data.TotalBufferSize(), fin); | 151 return QuicConsumedData(data.TotalBufferSize(), fin); |
151 } | 152 } |
152 | 153 |
153 INSTANTIATE_TEST_CASE_P(Tests, QuicSpdyServerStreamTest, | 154 INSTANTIATE_TEST_CASE_P(Tests, QuicSpdyServerStreamTest, |
154 ::testing::ValuesIn(QuicSupportedVersions())); | 155 ::testing::ValuesIn(QuicSupportedVersions())); |
155 | 156 |
156 TEST_P(QuicSpdyServerStreamTest, TestFraming) { | 157 TEST_P(QuicSpdyServerStreamTest, TestFraming) { |
157 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). | 158 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
158 WillRepeatedly(Invoke(ConsumeAllData)); | 159 WillRepeatedly(Invoke(ConsumeAllData)); |
159 | 160 |
160 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 161 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
161 headers_string_.c_str(), headers_string_.size())); | 162 headers_string_.c_str(), headers_string_.size())); |
162 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); | 163 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); |
163 EXPECT_EQ(11u, StreamHeaders().content_length()); | 164 EXPECT_EQ(11u, StreamHeaders().content_length()); |
164 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 165 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
165 EXPECT_EQ("POST", StreamHeaders().request_method()); | 166 EXPECT_EQ("POST", StreamHeaders().request_method()); |
166 EXPECT_EQ(body_, StreamBody()); | 167 EXPECT_EQ(body_, StreamBody()); |
167 } | 168 } |
168 | 169 |
169 TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { | 170 TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { |
170 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). | 171 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
171 WillRepeatedly(Invoke(ConsumeAllData)); | 172 WillRepeatedly(Invoke(ConsumeAllData)); |
172 | 173 |
173 string message = headers_string_ + body_; | 174 string message = headers_string_ + body_; |
174 | 175 |
175 EXPECT_EQ(message.size(), stream_->ProcessData( | 176 EXPECT_EQ(message.size(), stream_->ProcessData( |
176 message.c_str(), message.size())); | 177 message.c_str(), message.size())); |
177 EXPECT_EQ(11u, StreamHeaders().content_length()); | 178 EXPECT_EQ(11u, StreamHeaders().content_length()); |
178 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 179 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
179 EXPECT_EQ("POST", StreamHeaders().request_method()); | 180 EXPECT_EQ("POST", StreamHeaders().request_method()); |
180 EXPECT_EQ(body_, StreamBody()); | 181 EXPECT_EQ(body_, StreamBody()); |
181 } | 182 } |
182 | 183 |
183 TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { | 184 TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { |
184 string large_body = "hello world!!!!!!"; | 185 string large_body = "hello world!!!!!!"; |
185 | 186 |
186 // We'll automatically write out an error (headers + body) | 187 // We'll automatically write out an error (headers + body) |
187 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). | 188 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
188 WillRepeatedly(Invoke(ConsumeAllData)); | 189 WillRepeatedly(Invoke(ConsumeAllData)); |
189 | 190 |
190 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 191 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
191 headers_string_.c_str(), headers_string_.size())); | 192 headers_string_.c_str(), headers_string_.size())); |
192 // Content length is still 11. This will register as an error and we won't | 193 // Content length is still 11. This will register as an error and we won't |
193 // accept the bytes. | 194 // accept the bytes. |
194 stream_->ProcessData(large_body.c_str(), large_body.size()); | 195 stream_->ProcessData(large_body.c_str(), large_body.size()); |
195 EXPECT_EQ(11u, StreamHeaders().content_length()); | 196 EXPECT_EQ(11u, StreamHeaders().content_length()); |
196 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 197 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
197 EXPECT_EQ("POST", StreamHeaders().request_method()); | 198 EXPECT_EQ("POST", StreamHeaders().request_method()); |
198 } | 199 } |
199 | 200 |
200 TEST_P(QuicSpdyServerStreamTest, TestSendResponse) { | 201 TEST_P(QuicSpdyServerStreamTest, TestSendResponse) { |
201 BalsaHeaders* request_headers = stream_->mutable_headers(); | 202 BalsaHeaders* request_headers = stream_->mutable_headers(); |
202 request_headers->SetRequestFirstlineFromStringPieces( | 203 request_headers->SetRequestFirstlineFromStringPieces( |
203 "GET", | 204 "GET", |
204 "https://www.google.com/foo", | 205 "https://www.google.com/foo", |
205 "HTTP/1.1"); | 206 "HTTP/1.1"); |
206 | 207 |
207 response_headers_.SetResponseFirstlineFromStringPieces( | 208 response_headers_.SetResponseFirstlineFromStringPieces( |
208 "HTTP/1.1", "200", "OK"); | 209 "HTTP/1.1", "200", "OK"); |
209 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 210 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
210 | 211 |
211 InSequence s; | 212 InSequence s; |
212 EXPECT_CALL(session_, | 213 EXPECT_CALL(session_, |
213 WritevData(kHeadersStreamId, _, 0, false, NULL)); | 214 WritevData(kHeadersStreamId, _, 0, false, _, NULL)); |
214 | 215 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(1). |
215 | |
216 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). | |
217 WillOnce(Return(QuicConsumedData(3, true))); | 216 WillOnce(Return(QuicConsumedData(3, true))); |
218 | 217 |
219 QuicSpdyServerStreamPeer::SendResponse(stream_.get()); | 218 QuicSpdyServerStreamPeer::SendResponse(stream_.get()); |
220 EXPECT_TRUE(stream_->read_side_closed()); | 219 EXPECT_TRUE(stream_->read_side_closed()); |
221 EXPECT_TRUE(stream_->write_side_closed()); | 220 EXPECT_TRUE(stream_->write_side_closed()); |
222 } | 221 } |
223 | 222 |
224 TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { | 223 TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { |
225 response_headers_.SetResponseFirstlineFromStringPieces( | 224 response_headers_.SetResponseFirstlineFromStringPieces( |
226 "HTTP/1.1", "500", "Server Error"); | 225 "HTTP/1.1", "500", "Server Error"); |
227 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 226 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
228 | 227 |
229 InSequence s; | 228 InSequence s; |
230 EXPECT_CALL(session_, | 229 EXPECT_CALL(session_, |
231 WritevData(kHeadersStreamId, _, 0, false, NULL)); | 230 WritevData(kHeadersStreamId, _, 0, false, _, NULL)); |
232 | 231 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(1). |
233 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). | |
234 WillOnce(Return(QuicConsumedData(3, true))); | 232 WillOnce(Return(QuicConsumedData(3, true))); |
235 | 233 |
236 QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); | 234 QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); |
237 EXPECT_TRUE(stream_->read_side_closed()); | 235 EXPECT_TRUE(stream_->read_side_closed()); |
238 EXPECT_TRUE(stream_->write_side_closed()); | 236 EXPECT_TRUE(stream_->write_side_closed()); |
239 } | 237 } |
240 | 238 |
241 TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { | 239 TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { |
242 char arr[] = { | 240 char arr[] = { |
243 0x3a, 0x68, 0x6f, 0x73, // :hos | 241 0x3a, 0x68, 0x6f, 0x73, // :hos |
(...skipping 21 matching lines...) Expand all Loading... |
265 StringPiece data(arr, arraysize(arr)); | 263 StringPiece data(arr, arraysize(arr)); |
266 QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); | 264 QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); |
267 // Verify that we don't crash when we get a invalid headers in stream frame. | 265 // Verify that we don't crash when we get a invalid headers in stream frame. |
268 stream_->OnStreamFrame(frame); | 266 stream_->OnStreamFrame(frame); |
269 } | 267 } |
270 | 268 |
271 } // namespace | 269 } // namespace |
272 } // namespace test | 270 } // namespace test |
273 } // namespace tools | 271 } // namespace tools |
274 } // namespace net | 272 } // namespace net |
OLD | NEW |