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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 body_("hello world") { | 87 body_("hello world") { |
88 BalsaHeaders request_headers; | 88 BalsaHeaders request_headers; |
89 request_headers.SetRequestFirstlineFromStringPieces( | 89 request_headers.SetRequestFirstlineFromStringPieces( |
90 "POST", "https://www.google.com/", "HTTP/1.1"); | 90 "POST", "https://www.google.com/", "HTTP/1.1"); |
91 request_headers.ReplaceOrAppendHeader("content-length", "11"); | 91 request_headers.ReplaceOrAppendHeader("content-length", "11"); |
92 | 92 |
93 headers_string_ = SpdyUtils::SerializeRequestHeaders(request_headers); | 93 headers_string_ = SpdyUtils::SerializeRequestHeaders(request_headers); |
94 stream_.reset(new QuicSpdyServerStreamPeer(3, &session_)); | 94 stream_.reset(new QuicSpdyServerStreamPeer(3, &session_)); |
95 } | 95 } |
96 | 96 |
97 QuicConsumedData ValidateHeaders(const struct iovec* iov) { | 97 QuicConsumedData ValidateHeaders(const IOVector& data) { |
| 98 const iovec* iov = data.iovec(); |
98 StringPiece headers = | 99 StringPiece headers = |
99 StringPiece(static_cast<const char*>(iov[0].iov_base), iov[0].iov_len); | 100 StringPiece(static_cast<const char*>(iov[0].iov_base), iov[0].iov_len); |
100 headers_string_ = SpdyUtils::SerializeResponseHeaders( | 101 headers_string_ = SpdyUtils::SerializeResponseHeaders( |
101 response_headers_); | 102 response_headers_); |
102 QuicSpdyDecompressor decompressor; | 103 QuicSpdyDecompressor decompressor; |
103 TestDecompressorVisitor visitor; | 104 TestDecompressorVisitor visitor; |
104 | 105 |
105 // First the header id, then the compressed data. | 106 // First the header id, then the compressed data. |
106 EXPECT_EQ(1, headers[0]); | 107 EXPECT_EQ(1, headers[0]); |
107 EXPECT_EQ(0, headers[1]); | 108 EXPECT_EQ(0, headers[1]); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 EpollServer eps_; | 162 EpollServer eps_; |
162 StrictMock<MockConnection>* connection_; | 163 StrictMock<MockConnection>* connection_; |
163 StrictMock<MockSession> session_; | 164 StrictMock<MockSession> session_; |
164 scoped_ptr<QuicSpdyServerStreamPeer> stream_; | 165 scoped_ptr<QuicSpdyServerStreamPeer> stream_; |
165 string headers_string_; | 166 string headers_string_; |
166 string body_; | 167 string body_; |
167 }; | 168 }; |
168 | 169 |
169 QuicConsumedData ConsumeAllData( | 170 QuicConsumedData ConsumeAllData( |
170 QuicStreamId id, | 171 QuicStreamId id, |
171 const struct iovec* iov, | 172 const IOVector& data, |
172 int iov_count, | |
173 QuicStreamOffset offset, | 173 QuicStreamOffset offset, |
174 bool fin, | 174 bool fin, |
175 QuicAckNotifier::DelegateInterface* /*ack_notifier_delegate*/) { | 175 QuicAckNotifier::DelegateInterface* /*ack_notifier_delegate*/) { |
176 ssize_t consumed_length = 0; | 176 return QuicConsumedData(data.TotalBufferSize(), fin); |
177 for (int i = 0; i < iov_count; ++i) { | |
178 consumed_length += iov[i].iov_len; | |
179 } | |
180 return QuicConsumedData(consumed_length, fin); | |
181 } | 177 } |
182 | 178 |
183 INSTANTIATE_TEST_CASE_P(Tests, QuicSpdyServerStreamTest, | 179 INSTANTIATE_TEST_CASE_P(Tests, QuicSpdyServerStreamTest, |
184 ::testing::ValuesIn(QuicSupportedVersions())); | 180 ::testing::ValuesIn(QuicSupportedVersions())); |
185 | 181 |
186 TEST_P(QuicSpdyServerStreamTest, TestFraming) { | 182 TEST_P(QuicSpdyServerStreamTest, TestFraming) { |
187 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). | 183 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). |
188 WillRepeatedly(Invoke(ConsumeAllData)); | 184 WillRepeatedly(Invoke(ConsumeAllData)); |
189 | 185 |
190 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 186 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
191 headers_string_.c_str(), headers_string_.size())); | 187 headers_string_.c_str(), headers_string_.size())); |
192 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); | 188 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); |
193 EXPECT_EQ(11u, StreamHeaders().content_length()); | 189 EXPECT_EQ(11u, StreamHeaders().content_length()); |
194 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 190 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
195 EXPECT_EQ("POST", StreamHeaders().request_method()); | 191 EXPECT_EQ("POST", StreamHeaders().request_method()); |
196 EXPECT_EQ(body_, StreamBody()); | 192 EXPECT_EQ(body_, StreamBody()); |
197 } | 193 } |
198 | 194 |
199 TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { | 195 TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { |
200 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). | 196 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). |
201 WillRepeatedly(Invoke(ConsumeAllData)); | 197 WillRepeatedly(Invoke(ConsumeAllData)); |
202 | 198 |
203 string message = headers_string_ + body_; | 199 string message = headers_string_ + body_; |
204 | 200 |
205 EXPECT_EQ(message.size(), stream_->ProcessData( | 201 EXPECT_EQ(message.size(), stream_->ProcessData( |
206 message.c_str(), message.size())); | 202 message.c_str(), message.size())); |
207 EXPECT_EQ(11u, StreamHeaders().content_length()); | 203 EXPECT_EQ(11u, StreamHeaders().content_length()); |
208 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 204 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
209 EXPECT_EQ("POST", StreamHeaders().request_method()); | 205 EXPECT_EQ("POST", StreamHeaders().request_method()); |
210 EXPECT_EQ(body_, StreamBody()); | 206 EXPECT_EQ(body_, StreamBody()); |
211 } | 207 } |
212 | 208 |
213 TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { | 209 TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { |
214 string large_body = "hello world!!!!!!"; | 210 string large_body = "hello world!!!!!!"; |
215 | 211 |
216 // We'll automatically write out an error (headers + body) | 212 // We'll automatically write out an error (headers + body) |
217 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). | 213 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). |
218 WillRepeatedly(Invoke(ConsumeAllData)); | 214 WillRepeatedly(Invoke(ConsumeAllData)); |
219 | 215 |
220 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 216 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
221 headers_string_.c_str(), headers_string_.size())); | 217 headers_string_.c_str(), headers_string_.size())); |
222 // Content length is still 11. This will register as an error and we won't | 218 // Content length is still 11. This will register as an error and we won't |
223 // accept the bytes. | 219 // accept the bytes. |
224 stream_->ProcessData(large_body.c_str(), large_body.size()); | 220 stream_->ProcessData(large_body.c_str(), large_body.size()); |
225 EXPECT_EQ(11u, StreamHeaders().content_length()); | 221 EXPECT_EQ(11u, StreamHeaders().content_length()); |
226 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 222 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
227 EXPECT_EQ("POST", StreamHeaders().request_method()); | 223 EXPECT_EQ("POST", StreamHeaders().request_method()); |
228 } | 224 } |
229 | 225 |
230 TEST_P(QuicSpdyServerStreamTest, TestSendResponse) { | 226 TEST_P(QuicSpdyServerStreamTest, TestSendResponse) { |
231 BalsaHeaders* request_headers = stream_->mutable_headers(); | 227 BalsaHeaders* request_headers = stream_->mutable_headers(); |
232 request_headers->SetRequestFirstlineFromStringPieces( | 228 request_headers->SetRequestFirstlineFromStringPieces( |
233 "GET", | 229 "GET", |
234 "https://www.google.com/foo", | 230 "https://www.google.com/foo", |
235 "HTTP/1.1"); | 231 "HTTP/1.1"); |
236 | 232 |
237 response_headers_.SetResponseFirstlineFromStringPieces( | 233 response_headers_.SetResponseFirstlineFromStringPieces( |
238 "HTTP/1.1", "200", "OK"); | 234 "HTTP/1.1", "200", "OK"); |
239 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 235 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
240 | 236 |
241 InSequence s; | 237 InSequence s; |
242 if (GetParam() > QUIC_VERSION_12) { | 238 if (GetParam() > QUIC_VERSION_12) { |
243 EXPECT_CALL(session_, | 239 EXPECT_CALL(session_, |
244 WritevData(kHeadersStreamId, _, _, 0, false, NULL)); | 240 WritevData(kHeadersStreamId, _, 0, false, NULL)); |
245 } else { | 241 } else { |
246 EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1) | 242 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1) |
247 .WillOnce(WithArgs<1>(Invoke( | 243 .WillOnce(WithArgs<1>(Invoke( |
248 this, &QuicSpdyServerStreamTest::ValidateHeaders))); | 244 this, &QuicSpdyServerStreamTest::ValidateHeaders))); |
249 } | 245 } |
250 | 246 |
251 EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1). | 247 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). |
252 WillOnce(Return(QuicConsumedData(3, true))); | 248 WillOnce(Return(QuicConsumedData(3, true))); |
253 | 249 |
254 QuicSpdyServerStreamPeer::SendResponse(stream_.get()); | 250 QuicSpdyServerStreamPeer::SendResponse(stream_.get()); |
255 EXPECT_TRUE(stream_->read_side_closed()); | 251 EXPECT_TRUE(stream_->read_side_closed()); |
256 EXPECT_TRUE(stream_->write_side_closed()); | 252 EXPECT_TRUE(stream_->write_side_closed()); |
257 } | 253 } |
258 | 254 |
259 TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { | 255 TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { |
260 response_headers_.SetResponseFirstlineFromStringPieces( | 256 response_headers_.SetResponseFirstlineFromStringPieces( |
261 "HTTP/1.1", "500", "Server Error"); | 257 "HTTP/1.1", "500", "Server Error"); |
262 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 258 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
263 | 259 |
264 InSequence s; | 260 InSequence s; |
265 if (GetParam() > QUIC_VERSION_12) { | 261 if (GetParam() > QUIC_VERSION_12) { |
266 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, 0, false, NULL)); | 262 EXPECT_CALL(session_, |
| 263 WritevData(kHeadersStreamId, _, 0, false, NULL)); |
267 } else { | 264 } else { |
268 EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1) | 265 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1) |
269 .WillOnce(WithArgs<1>(Invoke( | 266 .WillOnce(WithArgs<1>(Invoke( |
270 this, &QuicSpdyServerStreamTest::ValidateHeaders))); | 267 this, &QuicSpdyServerStreamTest::ValidateHeaders))); |
271 } | 268 } |
272 | 269 |
273 EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1). | 270 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). |
274 WillOnce(Return(QuicConsumedData(3, true))); | 271 WillOnce(Return(QuicConsumedData(3, true))); |
275 | 272 |
276 QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); | 273 QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); |
277 EXPECT_TRUE(stream_->read_side_closed()); | 274 EXPECT_TRUE(stream_->read_side_closed()); |
278 EXPECT_TRUE(stream_->write_side_closed()); | 275 EXPECT_TRUE(stream_->write_side_closed()); |
279 } | 276 } |
280 | 277 |
281 TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { | 278 TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { |
282 char arr[] = { | 279 char arr[] = { |
283 0x05, 0x00, 0x00, 0x00, // .... | 280 0x05, 0x00, 0x00, 0x00, // .... |
(...skipping 24 matching lines...) Expand all Loading... |
308 StringPiece data(arr + start, arraysize(arr) - start); | 305 StringPiece data(arr + start, arraysize(arr) - start); |
309 QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); | 306 QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); |
310 // Verify that we don't crash when we get a invalid headers in stream frame. | 307 // Verify that we don't crash when we get a invalid headers in stream frame. |
311 stream_->OnStreamFrame(frame); | 308 stream_->OnStreamFrame(frame); |
312 } | 309 } |
313 | 310 |
314 } // namespace | 311 } // namespace |
315 } // namespace test | 312 } // namespace test |
316 } // namespace tools | 313 } // namespace tools |
317 } // namespace net | 314 } // namespace net |
OLD | NEW |