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_simple_server_stream.h" | 5 #include "net/tools/quic/quic_simple_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_flags.h" | 10 #include "net/quic/quic_flags.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 using std::string; | 35 using std::string; |
36 using testing::_; | 36 using testing::_; |
37 using testing::AnyNumber; | 37 using testing::AnyNumber; |
38 using testing::Invoke; | 38 using testing::Invoke; |
39 using testing::InvokeArgument; | 39 using testing::InvokeArgument; |
40 using testing::InSequence; | 40 using testing::InSequence; |
41 using testing::Return; | 41 using testing::Return; |
42 using testing::StrictMock; | 42 using testing::StrictMock; |
43 using testing::WithArgs; | 43 using testing::WithArgs; |
44 | 44 |
45 DECLARE_bool(quic_always_log_bugs_for_tests); | |
46 | |
47 namespace net { | 45 namespace net { |
48 namespace test { | 46 namespace test { |
49 | 47 |
50 class QuicSimpleServerStreamPeer : public QuicSimpleServerStream { | 48 class QuicSimpleServerStreamPeer : public QuicSimpleServerStream { |
51 public: | 49 public: |
52 QuicSimpleServerStreamPeer(QuicStreamId stream_id, QuicSpdySession* session) | 50 QuicSimpleServerStreamPeer(QuicStreamId stream_id, QuicSpdySession* session) |
53 : QuicSimpleServerStream(stream_id, session) {} | 51 : QuicSimpleServerStream(stream_id, session) {} |
54 | 52 |
55 ~QuicSimpleServerStreamPeer() override{}; | 53 ~QuicSimpleServerStreamPeer() override{}; |
56 | 54 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 MockQuicServerSessionVisitor* owner, | 87 MockQuicServerSessionVisitor* owner, |
90 QuicCryptoServerConfig* crypto_config, | 88 QuicCryptoServerConfig* crypto_config, |
91 QuicCompressedCertsCache* compressed_certs_cache) | 89 QuicCompressedCertsCache* compressed_certs_cache) |
92 : QuicSimpleServerSession(DefaultQuicConfig(), | 90 : QuicSimpleServerSession(DefaultQuicConfig(), |
93 connection, | 91 connection, |
94 owner, | 92 owner, |
95 crypto_config, | 93 crypto_config, |
96 compressed_certs_cache) { | 94 compressed_certs_cache) { |
97 set_max_open_incoming_streams(kMaxStreamsForTest); | 95 set_max_open_incoming_streams(kMaxStreamsForTest); |
98 set_max_open_outgoing_streams(kMaxStreamsForTest); | 96 set_max_open_outgoing_streams(kMaxStreamsForTest); |
99 ON_CALL(*this, WritevData(_, _, _, _, _)) | 97 ON_CALL(*this, WritevData(_, _, _, _, _, _)) |
100 .WillByDefault(testing::Return(QuicConsumedData(0, false))); | 98 .WillByDefault(testing::Return(QuicConsumedData(0, false))); |
101 } | 99 } |
102 | 100 |
103 ~MockQuicSimpleServerSession() override {} | 101 ~MockQuicSimpleServerSession() override {} |
104 | 102 |
105 MOCK_METHOD3(OnConnectionClosed, | 103 MOCK_METHOD3(OnConnectionClosed, |
106 void(QuicErrorCode error, | 104 void(QuicErrorCode error, |
107 const string& error_details, | 105 const string& error_details, |
108 ConnectionCloseSource source)); | 106 ConnectionCloseSource source)); |
109 MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id)); | 107 MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id)); |
110 MOCK_METHOD5(WritevData, | 108 MOCK_METHOD6(WritevData, |
111 QuicConsumedData(QuicStreamId id, | 109 QuicConsumedData(ReliableQuicStream* stream, |
| 110 QuicStreamId id, |
112 QuicIOVector data, | 111 QuicIOVector data, |
113 QuicStreamOffset offset, | 112 QuicStreamOffset offset, |
114 bool fin, | 113 bool fin, |
115 QuicAckListenerInterface*)); | 114 QuicAckListenerInterface*)); |
116 MOCK_METHOD2(OnStreamHeaders, | 115 MOCK_METHOD2(OnStreamHeaders, |
117 void(QuicStreamId stream_id, StringPiece headers_data)); | 116 void(QuicStreamId stream_id, StringPiece headers_data)); |
118 MOCK_METHOD2(OnStreamHeadersPriority, | 117 MOCK_METHOD2(OnStreamHeadersPriority, |
119 void(QuicStreamId stream_id, SpdyPriority priority)); | 118 void(QuicStreamId stream_id, SpdyPriority priority)); |
120 MOCK_METHOD3(OnStreamHeadersComplete, | 119 MOCK_METHOD3(OnStreamHeadersComplete, |
121 void(QuicStreamId stream_id, bool fin, size_t frame_len)); | 120 void(QuicStreamId stream_id, bool fin, size_t frame_len)); |
122 MOCK_METHOD5(WriteHeaders, | 121 MOCK_METHOD5(WriteHeaders, |
123 size_t(QuicStreamId id, | 122 size_t(QuicStreamId id, |
124 const SpdyHeaderBlock& headers, | 123 const SpdyHeaderBlock& headers, |
125 bool fin, | 124 bool fin, |
126 SpdyPriority priority, | 125 SpdyPriority priority, |
127 QuicAckListenerInterface* ack_notifier_delegate)); | 126 QuicAckListenerInterface* ack_notifier_delegate)); |
128 MOCK_METHOD3(SendRstStream, | 127 MOCK_METHOD3(SendRstStream, |
129 void(QuicStreamId stream_id, | 128 void(QuicStreamId stream_id, |
130 QuicRstStreamErrorCode error, | 129 QuicRstStreamErrorCode error, |
131 QuicStreamOffset bytes_written)); | 130 QuicStreamOffset bytes_written)); |
132 MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta)); | 131 MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta)); |
133 MOCK_METHOD4(PromisePushResources, | 132 MOCK_METHOD4(PromisePushResources, |
134 void(const string&, | 133 void(const string&, |
135 const list<QuicInMemoryCache::ServerPushInfo>&, | 134 const std::list<QuicInMemoryCache::ServerPushInfo>&, |
136 QuicStreamId, | 135 QuicStreamId, |
137 const SpdyHeaderBlock&)); | 136 const SpdyHeaderBlock&)); |
138 | 137 |
139 using QuicSession::ActivateStream; | 138 using QuicSession::ActivateStream; |
140 | 139 |
141 private: | 140 private: |
142 DISALLOW_COPY_AND_ASSIGN(MockQuicSimpleServerSession); | 141 DISALLOW_COPY_AND_ASSIGN(MockQuicSimpleServerSession); |
143 }; | 142 }; |
144 | 143 |
145 namespace { | 144 namespace { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 QuicSimpleServerStreamPeer* stream_; // Owned by session_. | 213 QuicSimpleServerStreamPeer* stream_; // Owned by session_. |
215 string headers_string_; | 214 string headers_string_; |
216 string body_; | 215 string body_; |
217 }; | 216 }; |
218 | 217 |
219 INSTANTIATE_TEST_CASE_P(Tests, | 218 INSTANTIATE_TEST_CASE_P(Tests, |
220 QuicSimpleServerStreamTest, | 219 QuicSimpleServerStreamTest, |
221 ::testing::ValuesIn(QuicSupportedVersions())); | 220 ::testing::ValuesIn(QuicSupportedVersions())); |
222 | 221 |
223 TEST_P(QuicSimpleServerStreamTest, TestFraming) { | 222 TEST_P(QuicSimpleServerStreamTest, TestFraming) { |
224 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 223 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
225 .Times(AnyNumber()) | 224 .Times(AnyNumber()) |
226 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 225 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
227 stream_->OnStreamHeaders(headers_string_); | 226 stream_->OnStreamHeaders(headers_string_); |
228 stream_->OnStreamHeadersComplete(false, headers_string_.size()); | 227 stream_->OnStreamHeadersComplete(false, headers_string_.size()); |
229 stream_->OnStreamFrame( | 228 stream_->OnStreamFrame( |
230 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); | 229 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); |
231 EXPECT_EQ("11", StreamHeadersValue("content-length")); | 230 EXPECT_EQ("11", StreamHeadersValue("content-length")); |
232 EXPECT_EQ("/", StreamHeadersValue(":path")); | 231 EXPECT_EQ("/", StreamHeadersValue(":path")); |
233 EXPECT_EQ("POST", StreamHeadersValue(":method")); | 232 EXPECT_EQ("POST", StreamHeadersValue(":method")); |
234 EXPECT_EQ(body_, StreamBody()); | 233 EXPECT_EQ(body_, StreamBody()); |
235 } | 234 } |
236 | 235 |
237 TEST_P(QuicSimpleServerStreamTest, TestFramingOnePacket) { | 236 TEST_P(QuicSimpleServerStreamTest, TestFramingOnePacket) { |
238 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 237 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
239 .Times(AnyNumber()) | 238 .Times(AnyNumber()) |
240 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 239 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
241 | 240 |
242 stream_->OnStreamHeaders(headers_string_); | 241 stream_->OnStreamHeaders(headers_string_); |
243 stream_->OnStreamHeadersComplete(false, headers_string_.size()); | 242 stream_->OnStreamHeadersComplete(false, headers_string_.size()); |
244 stream_->OnStreamFrame( | 243 stream_->OnStreamFrame( |
245 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); | 244 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); |
246 EXPECT_EQ("11", StreamHeadersValue("content-length")); | 245 EXPECT_EQ("11", StreamHeadersValue("content-length")); |
247 EXPECT_EQ("/", StreamHeadersValue(":path")); | 246 EXPECT_EQ("/", StreamHeadersValue(":path")); |
248 EXPECT_EQ("POST", StreamHeadersValue(":method")); | 247 EXPECT_EQ("POST", StreamHeadersValue(":method")); |
249 EXPECT_EQ(body_, StreamBody()); | 248 EXPECT_EQ(body_, StreamBody()); |
250 } | 249 } |
251 | 250 |
252 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorInStopReading) { | 251 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorInStopReading) { |
253 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 252 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
254 .Times(AnyNumber()) | 253 .Times(AnyNumber()) |
255 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 254 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
256 | 255 |
257 EXPECT_FALSE(stream_->fin_received()); | 256 EXPECT_FALSE(stream_->fin_received()); |
258 EXPECT_FALSE(stream_->rst_received()); | 257 EXPECT_FALSE(stream_->rst_received()); |
259 | 258 |
260 stream_->set_fin_sent(true); | 259 stream_->set_fin_sent(true); |
261 stream_->CloseWriteSide(); | 260 stream_->CloseWriteSide(); |
262 | 261 |
263 if (GetParam() > QUIC_VERSION_28) { | 262 if (GetParam() > QUIC_VERSION_28) { |
264 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(1); | 263 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(1); |
265 } else { | 264 } else { |
266 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 265 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
267 } | 266 } |
268 stream_->StopReading(); | 267 stream_->StopReading(); |
269 } | 268 } |
270 | 269 |
271 TEST_P(QuicSimpleServerStreamTest, TestFramingExtraData) { | 270 TEST_P(QuicSimpleServerStreamTest, TestFramingExtraData) { |
272 string large_body = "hello world!!!!!!"; | 271 string large_body = "hello world!!!!!!"; |
273 | 272 |
274 // We'll automatically write out an error (headers + body) | 273 // We'll automatically write out an error (headers + body) |
275 EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); | 274 EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); |
276 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 275 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
277 .WillOnce(Invoke(MockQuicSession::ConsumeAllData)); | 276 .WillOnce(Invoke(MockQuicSession::ConsumeAllData)); |
278 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 277 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
279 | 278 |
280 stream_->OnStreamHeaders(headers_string_); | 279 stream_->OnStreamHeaders(headers_string_); |
281 stream_->OnStreamHeadersComplete(false, headers_string_.size()); | 280 stream_->OnStreamHeadersComplete(false, headers_string_.size()); |
282 stream_->OnStreamFrame( | 281 stream_->OnStreamFrame( |
283 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); | 282 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); |
284 // Content length is still 11. This will register as an error and we won't | 283 // Content length is still 11. This will register as an error and we won't |
285 // accept the bytes. | 284 // accept the bytes. |
286 stream_->OnStreamFrame( | 285 stream_->OnStreamFrame( |
(...skipping 16 matching lines...) Expand all Loading... |
303 response_headers_[":status"] = "200 OK"; | 302 response_headers_[":status"] = "200 OK"; |
304 response_headers_["content-length"] = "5"; | 303 response_headers_["content-length"] = "5"; |
305 string body = "Yummm"; | 304 string body = "Yummm"; |
306 QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", | 305 QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", |
307 response_headers_, body); | 306 response_headers_, body); |
308 | 307 |
309 stream_->set_fin_received(true); | 308 stream_->set_fin_received(true); |
310 | 309 |
311 InSequence s; | 310 InSequence s; |
312 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); | 311 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); |
313 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 312 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
314 .Times(1) | 313 .Times(1) |
315 .WillOnce(Return(QuicConsumedData( | 314 .WillOnce(Return(QuicConsumedData( |
316 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); | 315 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); |
317 | 316 |
318 QuicSimpleServerStreamPeer::SendResponse(stream_); | 317 QuicSimpleServerStreamPeer::SendResponse(stream_); |
319 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 318 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
320 EXPECT_TRUE(stream_->reading_stopped()); | 319 EXPECT_TRUE(stream_->reading_stopped()); |
321 EXPECT_TRUE(stream_->write_side_closed()); | 320 EXPECT_TRUE(stream_->write_side_closed()); |
322 } | 321 } |
323 | 322 |
(...skipping 10 matching lines...) Expand all Loading... |
334 response_headers_[":status"] = "+200"; | 333 response_headers_[":status"] = "+200"; |
335 response_headers_["content-length"] = "5"; | 334 response_headers_["content-length"] = "5"; |
336 string body = "Yummm"; | 335 string body = "Yummm"; |
337 QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", | 336 QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", |
338 response_headers_, body); | 337 response_headers_, body); |
339 | 338 |
340 stream_->set_fin_received(true); | 339 stream_->set_fin_received(true); |
341 | 340 |
342 InSequence s; | 341 InSequence s; |
343 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); | 342 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); |
344 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 343 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
345 .Times(1) | 344 .Times(1) |
346 .WillOnce(Return(QuicConsumedData( | 345 .WillOnce(Return(QuicConsumedData( |
347 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); | 346 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); |
348 | 347 |
349 QuicSimpleServerStreamPeer::SendResponse(stream_); | 348 QuicSimpleServerStreamPeer::SendResponse(stream_); |
350 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 349 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
351 EXPECT_TRUE(stream_->reading_stopped()); | 350 EXPECT_TRUE(stream_->reading_stopped()); |
352 EXPECT_TRUE(stream_->write_side_closed()); | 351 EXPECT_TRUE(stream_->write_side_closed()); |
353 } | 352 } |
354 | 353 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 response_headers_[":version"] = "HTTP/1.1"; | 390 response_headers_[":version"] = "HTTP/1.1"; |
392 response_headers_[":status"] = "200"; | 391 response_headers_[":status"] = "200"; |
393 response_headers_["content-length"] = "5"; | 392 response_headers_["content-length"] = "5"; |
394 string body = "Yummm"; | 393 string body = "Yummm"; |
395 QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", | 394 QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", |
396 response_headers_, body); | 395 response_headers_, body); |
397 stream_->set_fin_received(true); | 396 stream_->set_fin_received(true); |
398 | 397 |
399 InSequence s; | 398 InSequence s; |
400 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); | 399 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); |
401 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 400 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
402 .Times(1) | 401 .Times(1) |
403 .WillOnce(Return(QuicConsumedData(body.length(), true))); | 402 .WillOnce(Return(QuicConsumedData(body.length(), true))); |
404 | 403 |
405 QuicSimpleServerStreamPeer::SendResponse(stream_); | 404 QuicSimpleServerStreamPeer::SendResponse(stream_); |
406 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 405 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
407 EXPECT_TRUE(stream_->reading_stopped()); | 406 EXPECT_TRUE(stream_->reading_stopped()); |
408 EXPECT_TRUE(stream_->write_side_closed()); | 407 EXPECT_TRUE(stream_->write_side_closed()); |
409 } | 408 } |
410 | 409 |
411 TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) { | 410 TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) { |
412 // Tests that if a reponse has push resources to be send, SendResponse() will | 411 // Tests that if a reponse has push resources to be send, SendResponse() will |
413 // call PromisePushResources() to handle these resources. | 412 // call PromisePushResources() to handle these resources. |
414 | 413 |
415 // Add a request and response with valid headers into cache. | 414 // Add a request and response with valid headers into cache. |
416 string host = "www.google.com"; | 415 string host = "www.google.com"; |
417 string request_path = "/foo"; | 416 string request_path = "/foo"; |
418 string body = "Yummm"; | 417 string body = "Yummm"; |
419 SpdyHeaderBlock response_headers; | 418 SpdyHeaderBlock response_headers; |
420 string url = host + "/bar"; | 419 string url = host + "/bar"; |
421 QuicInMemoryCache::ServerPushInfo push_info(GURL(url), response_headers, | 420 QuicInMemoryCache::ServerPushInfo push_info(GURL(url), response_headers, |
422 kDefaultPriority, "Push body"); | 421 kDefaultPriority, "Push body"); |
423 list<QuicInMemoryCache::ServerPushInfo> push_resources; | 422 std::list<QuicInMemoryCache::ServerPushInfo> push_resources; |
424 push_resources.push_back(push_info); | 423 push_resources.push_back(push_info); |
425 QuicInMemoryCache::GetInstance()->AddSimpleResponseWithServerPushResources( | 424 QuicInMemoryCache::GetInstance()->AddSimpleResponseWithServerPushResources( |
426 host, request_path, 200, body, push_resources); | 425 host, request_path, 200, body, push_resources); |
427 | 426 |
428 SpdyHeaderBlock* request_headers = stream_->mutable_headers(); | 427 SpdyHeaderBlock* request_headers = stream_->mutable_headers(); |
429 (*request_headers)[":path"] = request_path; | 428 (*request_headers)[":path"] = request_path; |
430 (*request_headers)[":authority"] = host; | 429 (*request_headers)[":authority"] = host; |
431 (*request_headers)[":version"] = "HTTP/1.1"; | 430 (*request_headers)[":version"] = "HTTP/1.1"; |
432 (*request_headers)[":method"] = "GET"; | 431 (*request_headers)[":method"] = "GET"; |
433 | 432 |
434 stream_->set_fin_received(true); | 433 stream_->set_fin_received(true); |
435 InSequence s; | 434 InSequence s; |
436 EXPECT_CALL(session_, PromisePushResources(host + request_path, _, | 435 EXPECT_CALL(session_, PromisePushResources(host + request_path, _, |
437 ::net::test::kClientDataStreamId1, | 436 ::net::test::kClientDataStreamId1, |
438 *request_headers)); | 437 *request_headers)); |
439 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); | 438 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); |
440 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 439 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
441 .Times(1) | 440 .Times(1) |
442 .WillOnce(Return(QuicConsumedData(body.length(), true))); | 441 .WillOnce(Return(QuicConsumedData(body.length(), true))); |
443 QuicSimpleServerStreamPeer::SendResponse(stream_); | 442 QuicSimpleServerStreamPeer::SendResponse(stream_); |
444 } | 443 } |
445 | 444 |
446 TEST_P(QuicSimpleServerStreamTest, PushResponseOnClientInitiatedStream) { | 445 TEST_P(QuicSimpleServerStreamTest, PushResponseOnClientInitiatedStream) { |
447 // Calling PushResponse() on a client initialted stream is never supposed to | 446 // Calling PushResponse() on a client initialted stream is never supposed to |
448 // happen. | 447 // happen. |
449 SpdyHeaderBlock headers; | 448 SpdyHeaderBlock headers; |
450 EXPECT_DFATAL(stream_->PushResponse(headers), | 449 EXPECT_DFATAL(stream_->PushResponse(headers), |
(...skipping 25 matching lines...) Expand all Loading... |
476 response_headers_["content-length"] = "5"; | 475 response_headers_["content-length"] = "5"; |
477 const string kBody = "Hello"; | 476 const string kBody = "Hello"; |
478 QuicInMemoryCache::GetInstance()->AddResponse(kHost, kPath, response_headers_, | 477 QuicInMemoryCache::GetInstance()->AddResponse(kHost, kPath, response_headers_, |
479 kBody); | 478 kBody); |
480 | 479 |
481 // Call PushResponse() should trigger stream to fetch response from cache | 480 // Call PushResponse() should trigger stream to fetch response from cache |
482 // and send it back. | 481 // and send it back. |
483 EXPECT_CALL(session_, | 482 EXPECT_CALL(session_, |
484 WriteHeaders(kServerInitiatedStreamId, _, false, | 483 WriteHeaders(kServerInitiatedStreamId, _, false, |
485 server_initiated_stream->priority(), nullptr)); | 484 server_initiated_stream->priority(), nullptr)); |
486 EXPECT_CALL(session_, WritevData(kServerInitiatedStreamId, _, _, _, _)) | 485 EXPECT_CALL(session_, WritevData(_, kServerInitiatedStreamId, _, _, _, _)) |
487 .Times(1) | 486 .Times(1) |
488 .WillOnce(Return(QuicConsumedData(kBody.size(), true))); | 487 .WillOnce(Return(QuicConsumedData(kBody.size(), true))); |
489 server_initiated_stream->PushResponse(headers); | 488 server_initiated_stream->PushResponse(headers); |
490 EXPECT_EQ(kPath, QuicSimpleServerStreamPeer::headers( | 489 EXPECT_EQ(kPath, QuicSimpleServerStreamPeer::headers( |
491 server_initiated_stream)[":path"] | 490 server_initiated_stream)[":path"] |
492 .as_string()); | 491 .as_string()); |
493 EXPECT_EQ("GET", QuicSimpleServerStreamPeer::headers( | 492 EXPECT_EQ("GET", QuicSimpleServerStreamPeer::headers( |
494 server_initiated_stream)[":method"] | 493 server_initiated_stream)[":method"] |
495 .as_string()); | 494 .as_string()); |
496 } | 495 } |
497 | 496 |
498 TEST_P(QuicSimpleServerStreamTest, TestSendErrorResponse) { | 497 TEST_P(QuicSimpleServerStreamTest, TestSendErrorResponse) { |
499 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 498 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
500 | 499 |
501 response_headers_[":version"] = "HTTP/1.1"; | 500 response_headers_[":version"] = "HTTP/1.1"; |
502 response_headers_[":status"] = "500 Server Error"; | 501 response_headers_[":status"] = "500 Server Error"; |
503 response_headers_["content-length"] = "3"; | 502 response_headers_["content-length"] = "3"; |
504 stream_->set_fin_received(true); | 503 stream_->set_fin_received(true); |
505 | 504 |
506 InSequence s; | 505 InSequence s; |
507 EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); | 506 EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); |
508 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 507 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
509 .Times(1) | 508 .Times(1) |
510 .WillOnce(Return(QuicConsumedData(3, true))); | 509 .WillOnce(Return(QuicConsumedData(3, true))); |
511 | 510 |
512 QuicSimpleServerStreamPeer::SendErrorResponse(stream_); | 511 QuicSimpleServerStreamPeer::SendErrorResponse(stream_); |
513 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 512 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
514 EXPECT_TRUE(stream_->reading_stopped()); | 513 EXPECT_TRUE(stream_->reading_stopped()); |
515 EXPECT_TRUE(stream_->write_side_closed()); | 514 EXPECT_TRUE(stream_->write_side_closed()); |
516 } | 515 } |
517 | 516 |
518 TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) { | 517 TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) { |
519 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 518 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
520 | 519 |
521 SpdyHeaderBlock request_headers; | 520 SpdyHeaderBlock request_headers; |
522 // \000 is a way to write the null byte when followed by a literal digit. | 521 // \000 is a way to write the null byte when followed by a literal digit. |
523 request_headers["content-length"] = StringPiece("11\00012", 5); | 522 request_headers["content-length"] = StringPiece("11\00012", 5); |
524 | 523 |
525 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); | 524 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
526 | 525 |
527 EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); | 526 EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); |
528 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 527 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
529 .Times(AnyNumber()) | 528 .Times(AnyNumber()) |
530 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 529 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
531 stream_->OnStreamHeaders(headers_string_); | 530 stream_->OnStreamHeaders(headers_string_); |
532 stream_->OnStreamHeadersComplete(true, headers_string_.size()); | 531 stream_->OnStreamHeadersComplete(true, headers_string_.size()); |
533 | 532 |
534 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 533 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
535 EXPECT_TRUE(stream_->reading_stopped()); | 534 EXPECT_TRUE(stream_->reading_stopped()); |
536 EXPECT_TRUE(stream_->write_side_closed()); | 535 EXPECT_TRUE(stream_->write_side_closed()); |
537 } | 536 } |
538 | 537 |
539 TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) { | 538 TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) { |
540 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 539 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
541 | 540 |
542 SpdyHeaderBlock request_headers; | 541 SpdyHeaderBlock request_headers; |
543 // \000 is a way to write the null byte when followed by a literal digit. | 542 // \000 is a way to write the null byte when followed by a literal digit. |
544 request_headers["content-length"] = StringPiece("\00012", 3); | 543 request_headers["content-length"] = StringPiece("\00012", 3); |
545 | 544 |
546 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); | 545 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
547 | 546 |
548 EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); | 547 EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); |
549 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 548 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
550 .Times(AnyNumber()) | 549 .Times(AnyNumber()) |
551 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 550 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
552 stream_->OnStreamHeaders(headers_string_); | 551 stream_->OnStreamHeaders(headers_string_); |
553 stream_->OnStreamHeadersComplete(true, headers_string_.size()); | 552 stream_->OnStreamHeadersComplete(true, headers_string_.size()); |
554 | 553 |
555 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 554 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
556 EXPECT_TRUE(stream_->reading_stopped()); | 555 EXPECT_TRUE(stream_->reading_stopped()); |
557 EXPECT_TRUE(stream_->write_side_closed()); | 556 EXPECT_TRUE(stream_->write_side_closed()); |
558 } | 557 } |
559 | 558 |
(...skipping 13 matching lines...) Expand all Loading... |
573 EXPECT_FALSE(stream_->write_side_closed()); | 572 EXPECT_FALSE(stream_->write_side_closed()); |
574 } | 573 } |
575 | 574 |
576 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { | 575 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { |
577 response_headers_[":version"] = "HTTP/1.1"; | 576 response_headers_[":version"] = "HTTP/1.1"; |
578 response_headers_[":status"] = "500 Server Error"; | 577 response_headers_[":status"] = "500 Server Error"; |
579 response_headers_["content-length"] = "3"; | 578 response_headers_["content-length"] = "3"; |
580 | 579 |
581 InSequence s; | 580 InSequence s; |
582 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, _, _, _)); | 581 EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, _, _, _)); |
583 EXPECT_CALL(session_, WritevData(_, _, _, _, _)) | 582 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
584 .Times(1) | 583 .Times(1) |
585 .WillOnce(Return(QuicConsumedData(3, true))); | 584 .WillOnce(Return(QuicConsumedData(3, true))); |
586 if (GetParam() > QUIC_VERSION_28) { | 585 if (GetParam() > QUIC_VERSION_28) { |
587 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(1); | 586 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(1); |
588 } else { | 587 } else { |
589 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 588 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
590 } | 589 } |
591 EXPECT_FALSE(stream_->fin_received()); | 590 EXPECT_FALSE(stream_->fin_received()); |
592 QuicSimpleServerStreamPeer::SendErrorResponse(stream_); | 591 QuicSimpleServerStreamPeer::SendErrorResponse(stream_); |
593 EXPECT_TRUE(stream_->reading_stopped()); | 592 EXPECT_TRUE(stream_->reading_stopped()); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 }; | 637 }; |
639 StringPiece data(arr, arraysize(arr)); | 638 StringPiece data(arr, arraysize(arr)); |
640 QuicStreamFrame frame(stream_->id(), true, 0, data); | 639 QuicStreamFrame frame(stream_->id(), true, 0, data); |
641 // Verify that we don't crash when we get a invalid headers in stream frame. | 640 // Verify that we don't crash when we get a invalid headers in stream frame. |
642 stream_->OnStreamFrame(frame); | 641 stream_->OnStreamFrame(frame); |
643 } | 642 } |
644 | 643 |
645 } // namespace | 644 } // namespace |
646 } // namespace test | 645 } // namespace test |
647 } // namespace net | 646 } // namespace net |
OLD | NEW |